]> git.neil.brown.name Git - LaFS.git/commitdiff
Make lafs_new_inode work when given an explicit inode number.
authorNeilBrown <neilb@suse.de>
Tue, 10 Aug 2010 05:31:12 +0000 (15:31 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 10 Aug 2010 05:31:12 +0000 (15:31 +1000)
In this case imni->mb isn't set, so we have to cope with that.

Signed-off-by: NeilBrown <neilb@suse.de>
inode.c

diff --git a/inode.c b/inode.c
index c6107d6f0874adba5cf627c41adbb6572be2788f..14139a17cad76fa3968eda42327d149503be9272 100644 (file)
--- 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 *