From: NeilBrown Date: Thu, 10 Jun 2010 05:36:55 +0000 (+1000) Subject: Check still dirty before calling cluster_allocate X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=d8ab77f87f933c8d0c8d3bc3e2b05c2cbbea2bfe;p=LaFS.git Check still dirty before calling cluster_allocate 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 --- diff --git a/file.c b/file.c index febab05..6fb1732 100644 --- 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)); }