summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruenba@redhat.com>2016-08-18 08:57:04 -0500
committerBob Peterson <rpeterso@redhat.com>2016-08-18 08:57:04 -0500
commit1c185c02f454c47d573a17e3e7d8befb06f0d64d (patch)
treedfd9e3b7191ed945e2a935933616eaf7c1c8c4a3
parent47a9a527946842dd8d83d4c8c8be22b2615b65f5 (diff)
downloadop-kernel-dev-1c185c02f454c47d573a17e3e7d8befb06f0d64d.zip
op-kernel-dev-1c185c02f454c47d573a17e3e7d8befb06f0d64d.tar.gz
gfs2: Remove dirty buffer warning from gfs2_releasepage
Unlike what its documentation suggests, the releasepage address space operation can currently be called on dirty pages via shrink_active_list. This may eventually be changed when the remaining code relying on the current behavior has been fixed, but until then, it makes no sense to warn on dirty buffers in gfs2_releasepage. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
-rw-r--r--fs/gfs2/aops.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c
index 71dbbd4..5a6f52e 100644
--- a/fs/gfs2/aops.c
+++ b/fs/gfs2/aops.c
@@ -1147,6 +1147,16 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
if (!page_has_buffers(page))
return 0;
+ /*
+ * From xfs_vm_releasepage: mm accommodates an old ext3 case where
+ * clean pages might not have had the dirty bit cleared. Thus, it can
+ * send actual dirty pages to ->releasepage() via shrink_active_list().
+ *
+ * As a workaround, we skip pages that contain dirty buffers below.
+ * Once ->releasepage isn't called on dirty pages anymore, we can warn
+ * on dirty buffers like we used to here again.
+ */
+
gfs2_log_lock(sdp);
spin_lock(&sdp->sd_ail_lock);
head = bh = page_buffers(page);
@@ -1156,8 +1166,8 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
bd = bh->b_private;
if (bd && bd->bd_tr)
goto cannot_release;
- if (buffer_pinned(bh) || buffer_dirty(bh))
- goto not_possible;
+ if (buffer_dirty(bh) || WARN_ON(buffer_pinned(bh)))
+ goto cannot_release;
bh = bh->b_this_page;
} while(bh != head);
spin_unlock(&sdp->sd_ail_lock);
@@ -1180,9 +1190,6 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
return try_to_free_buffers(page);
-not_possible: /* Should never happen */
- WARN_ON(buffer_dirty(bh));
- WARN_ON(buffer_pinned(bh));
cannot_release:
spin_unlock(&sdp->sd_ail_lock);
gfs2_log_unlock(sdp);
OpenPOWER on IntegriCloud