]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ceph: don't wait on writeback when there is no more dirty pages
authorYan, Zheng <zyan@redhat.com>
Tue, 6 Mar 2018 07:14:54 +0000 (15:14 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 2 Apr 2018 08:12:48 +0000 (10:12 +0200)
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>
fs/ceph/addr.c

index 3376822a624e2bee77d9b3b969bc3925bf1bdfd1..5f7ad3d0df2ea69121acded120e26d05515fd79a 100644 (file)
@@ -857,7 +857,7 @@ static int ceph_writepages_start(struct address_space *mapping,
                 * 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 @@ static int ceph_writepages_start(struct address_space *mapping,
                        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;
                        }