]> git.neil.brown.name Git - LaFS.git/commitdiff
Don't let writepage spoil a transaction.
authorNeilBrown <neilb@suse.de>
Mon, 21 Jun 2010 00:39:00 +0000 (10:39 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 21 Jun 2010 00:39:00 +0000 (10:39 +1000)
If a block is involved in a transaction (e.g. dir update) we
mustn't allow writepage to flush the page until the transaction
completes.

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

diff --git a/file.c b/file.c
index 6fb173263d8c86ddd5cb4bad4bf3f18a3362da99..69b6a8815126a348f7ec5aa2f73daf56650079b4 100644 (file)
--- a/file.c
+++ b/file.c
@@ -218,8 +218,15 @@ lafs_writepage(struct page *page, struct writeback_control *wbc)
                                rv = AOP_WRITEPAGE_ACTIVATE;
                        else {
                                lafs_iolock_written(&b->b);
-                               /* block might have been invalidated while we waited */
-                               if (test_bit(B_Dirty, &b->b.flags))
+                               /* block might have been invalidated,
+                                * or Pinned, while we waited */
+                               /* FIXME do I need to test if the iblock has appeared
+                                * while we waited too??
+                                */
+                               if (test_bit(B_PinPending, &b->b.flags)) {
+                                       rv = AOP_WRITEPAGE_ACTIVATE;
+                                       lafs_iounlock_block(&b->b);
+                               } else if (test_bit(B_Dirty, &b->b.flags))
                                        lafs_cluster_allocate(&b->b, 0);
                                else
                                        lafs_iounlock_block(&b->b);