From f784a1a6c6d7a649ae1f56db7831c5ec3f28e6ce Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 10 Aug 2010 15:16:03 +1000 Subject: [PATCH] Choose_free_inum: never return number below 16 They are for internal use. Also fix a missing B_PinPending setting. Signed-off-by: NeilBrown --- inode.c | 10 ++++++++++ 1 file changed, 10 insertions(+) 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); -- 2.39.5