]> git.neil.brown.name Git - LaFS.git/commitdiff
make lafs_leaf_find properly async
authorNeilBrown <neilb@suse.de>
Wed, 2 Sep 2009 00:09:07 +0000 (10:09 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 2 Sep 2009 00:09:07 +0000 (10:09 +1000)
The new iolock_block calls weren't honouring 'async'.
So fix that.

index.c

diff --git a/index.c b/index.c
index d637e00a15ef4a6fec24ec6925e102071c563215..0c920cb72a9cdd68ea18e2e81545e8deeb41e5f9 100644 (file)
--- a/index.c
+++ b/index.c
@@ -1298,7 +1298,14 @@ lafs_leaf_find(struct inode *inode, u32 addr, int adopt, u32 *next,
                return ib;
        offset = li->metadata_size;
 
-       lafs_iolock_block(&ib->b);
+       if (!async)
+               lafs_iolock_block(&ib->b);
+       else if (test_and_set_bit(B_IOLock, &ib->b.flags)) {
+               err = -EAGAIN;
+               goto err;
+       } else
+               set_iolock_info(&ib->b);
+               
        while (ib->depth > 1) {
                /* internal index block */
                /* ALERT:  If the index tree has only just grown, then
@@ -1353,9 +1360,22 @@ lafs_leaf_find(struct inode *inode, u32 addr, int adopt, u32 *next,
                                err = lafs_wait_block(&ib2->b);
                        if (err)
                                goto err_ib2;
-                       lafs_iolock_block(&ib->b);
+                       if (!async)
+                               lafs_iolock_block(&ib->b);
+                       else if (test_and_set_bit(B_IOLock, &ib->b.flags)) {
+                               err = -EAGAIN;
+                               goto err_ib2;
+                       } else
+                               set_iolock_info(&ib->b);
                }
-               lafs_iolock_block(&ib2->b);
+               if (!async)
+                       lafs_iolock_block(&ib2->b);
+               else if (test_and_set_bit(B_IOLock, &ib2->b.flags)) {
+                       err = -EAGAIN;
+                       goto err_ib2;
+               } else
+                       set_iolock_info(&ib2->b);
+
                /* This block might have been split, in which case
                 * we need to consider adjacent siblings.
                 */
@@ -1377,7 +1397,15 @@ lafs_leaf_find(struct inode *inode, u32 addr, int adopt, u32 *next,
                        }
                        getref_locked(nxt, REF);
                        spin_unlock(&inode->i_data.private_lock);
-                       lafs_iolock_block(nxt);
+                       if (!async)
+                               lafs_iolock_block(nxt);
+                       else if (test_and_set_bit(B_IOLock, &nxt->flags)) {
+                               err = -EAGAIN;
+                               putref(nxt, REF);
+                               goto err_ib2;
+                       } else
+                               set_iolock_info(nxt);
+
                        lafs_iounlock_block(&ib2->b);
                        putiref(ib2, REF);
                        ib2 = iblk(nxt);