]> git.neil.brown.name Git - LaFS.git/commitdiff
Check still dirty before calling cluster_allocate
authorNeilBrown <neilb@suse.de>
Thu, 10 Jun 2010 05:36:55 +0000 (15:36 +1000)
committerNeilBrown <neilb@suse.de>
Sun, 13 Jun 2010 07:19:59 +0000 (17:19 +1000)
If we wait (iolock) before calling cluster_allocate we need to check
again if it is dirty, as cluster_allocate only likes dirty/realloc
blocks.

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

diff --git a/file.c b/file.c
index febab0547631e33dac47b4156a6d7e556a3ec3fd..6fb173263d8c86ddd5cb4bad4bf3f18a3362da99 100644 (file)
--- a/file.c
+++ b/file.c
@@ -218,7 +218,11 @@ lafs_writepage(struct page *page, struct writeback_control *wbc)
                                rv = AOP_WRITEPAGE_ACTIVATE;
                        else {
                                lafs_iolock_written(&b->b);
-                               lafs_cluster_allocate(&b->b, 0);
+                               /* block might have been invalidated while we waited */
+                               if (test_bit(B_Dirty, &b->b.flags))
+                                       lafs_cluster_allocate(&b->b, 0);
+                               else
+                                       lafs_iounlock_block(&b->b);
                        }
                }
                putdref(b, MKREF(writepage));
@@ -243,7 +247,11 @@ lafs_writepage(struct page *page, struct writeback_control *wbc)
                                                        MKREF(writepageflush));
                if (test_bit(B_Dirty, &b->b.flags)) {
                        lafs_iolock_written(&b->b);
-                       lafs_cluster_allocate(&b->b, 0);
+                       /* block might have been invalidated while we waited */
+                       if (test_bit(B_Dirty, &b->b.flags))
+                               lafs_cluster_allocate(&b->b, 0);
+                       else
+                               lafs_iounlock_block(&b->b);
                }
                putdref(b, MKREF(writepageflush));
        }