summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2018-03-06 15:14:54 +0800
committerIlya Dryomov <idryomov@gmail.com>2018-04-02 10:12:48 +0200
commit1582af2eaaf17cbcd7864172347c1db10b6b2210 (patch)
treea51d6c8069b3a030b5d7fec0f1aa2d7f2aad5b8e /fs
parentaf9cc401ce7452f9d965ba4553d8ffe7f0ed42ee (diff)
downloadlinux-1582af2eaaf17cbcd7864172347c1db10b6b2210.tar.gz
linux-1582af2eaaf17cbcd7864172347c1db10b6b2210.tar.bz2
linux-1582af2eaaf17cbcd7864172347c1db10b6b2210.zip
ceph: don't wait on writeback when there is no more dirty pages
In sync mode, writepages() needs to write all dirty pages. But it can only write dirty pages associated with the oldest snapc. To write dirty pages associated with next snapc, it needs to wait until current writes complete. If there is no more dirty pages, writepages() should not wait on writeback. Otherwise, dirty page writeback becomes very slow. Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ceph/addr.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 3376822a624e..5f7ad3d0df2e 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -857,7 +857,7 @@ retry:
* in that range can be associated with newer snapc.
* They are not writeable until we write all dirty pages
* associated with 'snapc' get written */
- if (index > 0 || wbc->sync_mode != WB_SYNC_NONE)
+ if (index > 0)
should_loop = true;
dout(" non-head snapc, range whole\n");
}
@@ -903,6 +903,10 @@ get_more_pages:
if (pgsnapc != snapc) {
dout("page snapc %p %lld != oldest %p %lld\n",
pgsnapc, pgsnapc->seq, snapc, snapc->seq);
+ if (!should_loop &&
+ !ceph_wbc.head_snapc &&
+ wbc->sync_mode != WB_SYNC_NONE)
+ should_loop = true;
unlock_page(page);
continue;
}