void lessfsck_file_io() { unsigned long long rsize; struct stat stbuf; common_check(); if (-1 == stat(config->blockdata, &stbuf) ) die_dataerr("%s does not exist.\n",config->blockdata); if ( stbuf.st_size > nextoffset ) { rsize=round_512(nextoffset); printf("%cFree %llu orphaned bytes.\n",BACKSPACE,nextoffset-rsize); if ( -1 == ftruncate(fdbdta, rsize)) die_dataerr("Failed to truncate file %s to size %llu",config->blockdata,rsize); } }
void set_new_offset(unsigned long long size) { unsigned long long offset = 0; FUNC; LDEBUG("oldoffset is %llu : add size %llu", nextoffset, size); offset = round_512(size); nextoffset = nextoffset + offset; LDEBUG("nextoffset is now %llu", nextoffset); EFUNC; return; }
/* The freelist is a btree with as key the number of blocks (512 bytes). The value is offset. */ void put_on_freelist(INUSE * inuse) { unsigned long long calc; FUNC; int ecode; calc = round_512(inuse->size); calc = calc / 512; if (!tcbdbputdup(freelist, (void *) &calc, sizeof(unsigned long long), (void *) &inuse->offset, sizeof(unsigned long long))) { ecode = tcbdbecode(freelist); die_dberr("tcbdbputdup failed : %s", tcbdberrmsg(ecode)); } LDEBUG("put_on_freelist : %llu blocks at offset %llu", calc, inuse->offset); EFUNC; return; }
unsigned long long get_offset(unsigned long long size) { unsigned long long mbytes; unsigned long long offset; BDBCUR *cur; unsigned long long *dbkey; unsigned long long *dboffset; int dbsize; bool found = 0; FUNC; mbytes = round_512(size); mbytes = mbytes / 512; offset = nextoffset; LDEBUG("get_offset : search for %llu blocks on the freelist", mbytes); cur = tcbdbcurnew(freelist); if (tcbdbcurjump(cur, (void *) &mbytes, sizeof(unsigned long long))) { if ((dbkey = tcbdbcurkey(cur, &dbsize)) != NULL) { if (0 == memcmp(dbkey, &mbytes, sizeof(unsigned long long))) { if ((dboffset = tcbdbcurval(cur, &dbsize)) == NULL) die_dataerr("No value for key"); memcpy(&offset, dboffset, sizeof(unsigned long long)); found = 1; LDEBUG ("get_offset : reclaim %llu blocks on the freelist at offset %llu", mbytes, offset); if (!tcbdbcurout(cur)) { die_dataerr ("Failed to delete key, this should never happen!"); } free(dboffset); } free(dbkey); } } if (!found) set_new_offset(size); tcbdbcurdel(cur); LDEBUG("get_offset returns = %llu", offset); EFUNC; return (offset); }