From: NeilBrown Date: Tue, 10 Aug 2010 05:16:03 +0000 (+1000) Subject: Choose_free_inum: never return number below 16 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=f784a1a6c6d7a649ae1f56db7831c5ec3f28e6ce;p=LaFS.git Choose_free_inum: never return number below 16 They are for internal use. Also fix a missing B_PinPending setting. Signed-off-by: NeilBrown --- diff --git a/inode.c b/inode.c index 0151b2d..c6107d6 100644 --- a/inode.c +++ b/inode.c @@ -1267,6 +1267,9 @@ retry: err = -ENOMEM; if (!b) goto abort; + lafs_iolock_written(&b->b); + set_bit(B_PinPending, &b->b.flags); + lafs_iounlock_block(&b->b); retry2: lafs_checkpoint_lock(fs); err = lafs_pin_dblock(b, NewSpace); @@ -1319,6 +1322,13 @@ retry: bit = LAFSI(im)->md.inodemap.nextbit; LAFSI(im)->md.inodemap.thisblock = bnum; buf = map_dblock(b); + while (bnum == 0 && bit < 16) { + /* Never return an inum below 16 - they are special */ + if (!test_bit(bit, (unsigned long *)buf)) + set_bit(bit, (unsigned long *)buf); + bit++; + } + bit = find_next_bit((unsigned long *)buf, fs->blocksize<<3, bit); unmap_dblock(b, buf);