mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Revert "gfs2: stop using generic_writepages in gfs2_ail1_start_one"
Commitb2b0a5e978
switched from generic_writepages() to filemap_fdatawrite_wbc() in gfs2_ail1_start_one() on the path to replacing ->writepage() with ->writepages() and eventually eliminating the former. Function gfs2_ail1_start_one() is called from gfs2_log_flush(), our main function for flushing the filesystem log. Unfortunately, at least as implemented today, ->writepage() and ->writepages() are entirely different operations for journaled data inodes: while the former creates and submits transactions covering the data to be written, the latter flushes dirty buffers out to disk. With gfs2_ail1_start_one() now calling ->writepages(), we end up creating filesystem transactions while we are in the course of a log flush, which immediately deadlocks on the sdp->sd_log_flush_lock semaphore. Work around that by going back to how things used to work before commitb2b0a5e978
for now; figuring out a superior solution will take time we don't have available right now. However ... Since the removal of generic_writepages() is imminent, open-code it here. We're already inside a blk_start_plug() ... blk_finish_plug() section here, so skip that part of the original generic_writepages(). This reverts commitb2b0a5e978
. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Acked-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
5dc4c995db
commit
95ecbd0f16
1 changed files with 10 additions and 1 deletions
|
@ -80,6 +80,15 @@ void gfs2_remove_from_ail(struct gfs2_bufdata *bd)
|
||||||
brelse(bd->bd_bh);
|
brelse(bd->bd_bh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __gfs2_writepage(struct page *page, struct writeback_control *wbc,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct address_space *mapping = data;
|
||||||
|
int ret = mapping->a_ops->writepage(page, wbc);
|
||||||
|
mapping_set_error(mapping, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gfs2_ail1_start_one - Start I/O on a transaction
|
* gfs2_ail1_start_one - Start I/O on a transaction
|
||||||
* @sdp: The superblock
|
* @sdp: The superblock
|
||||||
|
@ -131,7 +140,7 @@ __acquires(&sdp->sd_ail_lock)
|
||||||
if (!mapping)
|
if (!mapping)
|
||||||
continue;
|
continue;
|
||||||
spin_unlock(&sdp->sd_ail_lock);
|
spin_unlock(&sdp->sd_ail_lock);
|
||||||
ret = filemap_fdatawrite_wbc(mapping, wbc);
|
ret = write_cache_pages(mapping, wbc, __gfs2_writepage, mapping);
|
||||||
if (need_resched()) {
|
if (need_resched()) {
|
||||||
blk_finish_plug(plug);
|
blk_finish_plug(plug);
|
||||||
cond_resched();
|
cond_resched();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue