mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 11:19:37 +00:00
gfs2: Don't get stuck with I/O plugged in gfs2_ail1_flush
In gfs2_ail1_flush, we're using I/O plugging to give the block layer a better chance of merging I/O requests. If we're too aggressive here, we can end up waiting on I/O to complete while still plugged. Fix that in a way similar to writeback_sb_inodes, except that we can't use blk_flush_plug because blk_flush_plug_list is not exported. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
parent
803074ad77
commit
17d7768408
1 changed files with 7 additions and 2 deletions
|
@ -91,7 +91,7 @@ void gfs2_remove_from_ail(struct gfs2_bufdata *bd)
|
||||||
|
|
||||||
static int gfs2_ail1_start_one(struct gfs2_sbd *sdp,
|
static int gfs2_ail1_start_one(struct gfs2_sbd *sdp,
|
||||||
struct writeback_control *wbc,
|
struct writeback_control *wbc,
|
||||||
struct gfs2_trans *tr)
|
struct gfs2_trans *tr, struct blk_plug *plug)
|
||||||
__releases(&sdp->sd_ail_lock)
|
__releases(&sdp->sd_ail_lock)
|
||||||
__acquires(&sdp->sd_ail_lock)
|
__acquires(&sdp->sd_ail_lock)
|
||||||
{
|
{
|
||||||
|
@ -133,6 +133,11 @@ __acquires(&sdp->sd_ail_lock)
|
||||||
continue;
|
continue;
|
||||||
spin_unlock(&sdp->sd_ail_lock);
|
spin_unlock(&sdp->sd_ail_lock);
|
||||||
ret = generic_writepages(mapping, wbc);
|
ret = generic_writepages(mapping, wbc);
|
||||||
|
if (need_resched()) {
|
||||||
|
blk_finish_plug(plug);
|
||||||
|
cond_resched();
|
||||||
|
blk_start_plug(plug);
|
||||||
|
}
|
||||||
spin_lock(&sdp->sd_ail_lock);
|
spin_lock(&sdp->sd_ail_lock);
|
||||||
if (ret == -ENODATA) /* if a jdata write into a new hole */
|
if (ret == -ENODATA) /* if a jdata write into a new hole */
|
||||||
ret = 0; /* ignore it */
|
ret = 0; /* ignore it */
|
||||||
|
@ -207,7 +212,7 @@ void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc)
|
||||||
list_for_each_entry_reverse(tr, head, tr_list) {
|
list_for_each_entry_reverse(tr, head, tr_list) {
|
||||||
if (wbc->nr_to_write <= 0)
|
if (wbc->nr_to_write <= 0)
|
||||||
break;
|
break;
|
||||||
ret = gfs2_ail1_start_one(sdp, wbc, tr);
|
ret = gfs2_ail1_start_one(sdp, wbc, tr, &plug);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret == -EBUSY)
|
if (ret == -EBUSY)
|
||||||
goto restart;
|
goto restart;
|
||||||
|
|
Loading…
Reference in a new issue