]> git.neil.brown.name Git - LaFS.git/commitdiff
Tidy up choose_free_inum a bit.
authorNeilBrown <neilb@suse.de>
Wed, 28 Jul 2010 11:56:29 +0000 (21:56 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 9 Aug 2010 01:58:13 +0000 (11:58 +1000)
The exact semantics of *bp and when refs were held were
a little confusing.

So only set *bp on function-exit while holding a ref on im,
and if the is set on function entry, drop the ref on it and on im.

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

diff --git a/inode.c b/inode.c
index 7bd89bd819ca2490e424dd66fc0777f4343aa6d5..0db0b4961525efdf5fb726c186fa77d37d3e5c39 100644 (file)
--- a/inode.c
+++ b/inode.c
@@ -1195,8 +1195,6 @@ choose_free_inum(struct fs *fs, struct inode *filesys, u32 *inump,
        int err;
        int bit;
 
-       mutex_lock_nested(&im->i_mutex, I_MUTEX_QUOTA);
-retry:
        if (*bp) {
                struct inode *i = (*bp)->b.inode;
                putdref(*bp, MKREF(cfi_map));
@@ -1204,6 +1202,8 @@ retry:
                *bp = NULL;
        }
 
+       mutex_lock_nested(&im->i_mutex, I_MUTEX_QUOTA);
+retry:
        bnum = LAFSI(im)->md.inodemap.thisblock;
 
        if (bnum == NoBlock ||
@@ -1260,13 +1260,13 @@ retry:
        err = -ENOSPC;
        if (!b)
                goto abort;
-       *bp = b;
        err = lafs_find_block(b, NOADOPT);
        if (err)
                goto abort;
        if (b->b.physaddr == 0 && !test_bit(B_Valid, &b->b.flags)) {
                LAFSI(im)->md.inodemap.nextbit =
                        (fs->blocksize<<3) + 1;
+               putdref(b,MKREF(cfi_map));
                goto retry;
        }
        err = lafs_read_block(b);
@@ -1280,10 +1280,12 @@ retry:
                            fs->blocksize<<3, bit);
        unmap_dblock(b, buf);
        LAFSI(im)->md.inodemap.nextbit = bit+1;
-       if (bit >= fs->blocksize<<3)
+       if (bit >= fs->blocksize<<3) {
+               putdref(b,MKREF(cfi_map));
                goto retry;
-
+       }
        mutex_unlock(&im->i_mutex);
+       *bp = b;
        *inump = bit + (bnum << (im->i_blkbits + 3));
        return 0;