mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
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>
This commit is contained in:
parent
af9cc401ce
commit
1582af2eaa
1 changed files with 5 additions and 1 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue