Merge branch 'writeback-plugging'
Fix up the writeback plugging introduced in commit d353d7587d
("writeback: plug writeback at a high level") that then caused problems
due to the unplug happening with a spinlock held.
* writeback-plugging:
writeback: plug writeback in wb_writeback() and writeback_inodes_wb()
Revert "writeback: plug writeback at a high level"
This commit is contained in:
commit
e1df8b0a1b
|
@ -1380,6 +1380,10 @@ static long writeback_chunk_size(struct bdi_writeback *wb,
|
|||
* Write a portion of b_io inodes which belong to @sb.
|
||||
*
|
||||
* Return the number of pages and/or inodes written.
|
||||
*
|
||||
* NOTE! This is called with wb->list_lock held, and will
|
||||
* unlock and relock that for each inode it ends up doing
|
||||
* IO for.
|
||||
*/
|
||||
static long writeback_sb_inodes(struct super_block *sb,
|
||||
struct bdi_writeback *wb,
|
||||
|
@ -1398,9 +1402,7 @@ static long writeback_sb_inodes(struct super_block *sb,
|
|||
unsigned long start_time = jiffies;
|
||||
long write_chunk;
|
||||
long wrote = 0; /* count both pages and inodes */
|
||||
struct blk_plug plug;
|
||||
|
||||
blk_start_plug(&plug);
|
||||
while (!list_empty(&wb->b_io)) {
|
||||
struct inode *inode = wb_inode(wb->b_io.prev);
|
||||
|
||||
|
@ -1498,7 +1500,6 @@ static long writeback_sb_inodes(struct super_block *sb,
|
|||
break;
|
||||
}
|
||||
}
|
||||
blk_finish_plug(&plug);
|
||||
return wrote;
|
||||
}
|
||||
|
||||
|
@ -1545,12 +1546,15 @@ static long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages,
|
|||
.range_cyclic = 1,
|
||||
.reason = reason,
|
||||
};
|
||||
struct blk_plug plug;
|
||||
|
||||
blk_start_plug(&plug);
|
||||
spin_lock(&wb->list_lock);
|
||||
if (list_empty(&wb->b_io))
|
||||
queue_io(wb, &work);
|
||||
__writeback_inodes_wb(wb, &work);
|
||||
spin_unlock(&wb->list_lock);
|
||||
blk_finish_plug(&plug);
|
||||
|
||||
return nr_pages - work.nr_pages;
|
||||
}
|
||||
|
@ -1578,10 +1582,12 @@ static long wb_writeback(struct bdi_writeback *wb,
|
|||
unsigned long oldest_jif;
|
||||
struct inode *inode;
|
||||
long progress;
|
||||
struct blk_plug plug;
|
||||
|
||||
oldest_jif = jiffies;
|
||||
work->older_than_this = &oldest_jif;
|
||||
|
||||
blk_start_plug(&plug);
|
||||
spin_lock(&wb->list_lock);
|
||||
for (;;) {
|
||||
/*
|
||||
|
@ -1661,6 +1667,7 @@ static long wb_writeback(struct bdi_writeback *wb,
|
|||
}
|
||||
}
|
||||
spin_unlock(&wb->list_lock);
|
||||
blk_finish_plug(&plug);
|
||||
|
||||
return nr_pages - work->nr_pages;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user