From c5bec01906d76acd931fc428efa2df4efe08fe41 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 10 Aug 2010 15:31:12 +1000 Subject: [PATCH] Make lafs_new_inode work when given an explicit inode number. In this case imni->mb isn't set, so we have to cope with that. Signed-off-by: NeilBrown --- inode.c | 64 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/inode.c b/inode.c index c6107d6..14139a1 100644 --- a/inode.c +++ b/inode.c @@ -1382,12 +1382,14 @@ retry: if (test_and_set_bit(B_Claimed, &b->b.flags)) { putdref(b, MKREF(cfi_ino)); if (inum) - return -EINVAL; + return -EEXIST; goto retry; } - lafs_iolock_written(&imni->mb->b); - set_bit(B_PinPending, &imni->mb->b.flags); - lafs_iounlock_block(&imni->mb->b); + if (imni->mb) { + lafs_iolock_written(&imni->mb->b); + set_bit(B_PinPending, &imni->mb->b.flags); + lafs_iounlock_block(&imni->mb->b); + } set_bit(B_PinPending, &b->b.flags); b->my_inode = NULL; imni->ib = b; @@ -1397,7 +1399,9 @@ retry: static int inode_map_new_pin(struct inode_map_new_info *imni) { - int err = lafs_pin_dblock(imni->mb, NewSpace); + int err = 0; + if (imni->mb) + err = lafs_pin_dblock(imni->mb, NewSpace); err = err ?: lafs_pin_dblock(imni->ib, NewSpace); return err; } @@ -1405,35 +1409,37 @@ inode_map_new_pin(struct inode_map_new_info *imni) static void inode_map_new_commit(struct inode_map_new_info *imni) { - unsigned long *buf = map_dblock(imni->mb); - int blksize = imni->ib->b.inode->i_sb->s_blocksize; - int bit = imni->ib->b.fileaddr & (blksize*8 - 1); - int hole = 0; - struct inode *ino = NULL; + unsigned long *buf; - clear_bit(bit, buf); - if (buf[blksize/sizeof(*buf)-1] == 0 && - find_first_bit(buf, blksize*8) == blksize*8) - /* block is empty, punch a hole */ - hole = 1; + if (imni->mb) { + int blksize = imni->ib->b.inode->i_sb->s_blocksize; + int bit = imni->ib->b.fileaddr & (blksize*8 - 1); + int hole = 0; + struct inode *ino; + + buf = map_dblock(imni->mb); + clear_bit(bit, buf); + if (buf[blksize/sizeof(*buf)-1] == 0 && + find_first_bit(buf, blksize*8) == blksize*8) + /* block is empty, punch a hole */ + hole = 1; + + unmap_dblock(imni->mb, buf); + if (hole) + lafs_erase_dblock(imni->mb); + else + lafs_dirty_dblock(imni->mb); - unmap_dblock(imni->mb, buf); - if (hole) - lafs_erase_dblock(imni->mb); - else - lafs_dirty_dblock(imni->mb); - putdref(imni->ib, MKREF(cfi_ino)); - if (imni->mb) ino = imni->mb->b.inode; - putdref(imni->mb, MKREF(cfi_map)); - if (ino) + putdref(imni->mb, MKREF(cfi_map)); iput(ino); + } + putdref(imni->ib, MKREF(cfi_ino)); } static void inode_map_new_abort(struct inode_map_new_info *imni) { - struct inode *ino = NULL; if (imni->ib) { clear_bit(B_Claimed, &imni->ib->b.flags); clear_bit(B_PinPending, &imni->ib->b.flags); @@ -1441,11 +1447,11 @@ inode_map_new_abort(struct inode_map_new_info *imni) imni->ib, NULL); } putdref(imni->ib, MKREF(cfi_ino)); - if (imni->mb) - ino = imni->mb->b.inode; - putdref(imni->mb, MKREF(cfi_map)); - if (ino) + if (imni->mb) { + struct inode *ino = imni->mb->b.inode; + putdref(imni->mb, MKREF(cfi_map)); iput(ino); + } } struct inode * -- 2.39.5