Skip to content

Commit

Permalink
ceph: don't wait on writeback when there is no more dirty pages
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Yan, Zheng authored and Ilya Dryomov committed Apr 2, 2018
1 parent af9cc40 commit 1582af2
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion fs/ceph/addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 1582af2

Please sign in to comment.