fs/mpage.c: forgotten WRITE_SYNC in case of data integrity write
In case of wbc->sync_mode == WB_SYNC_ALL we need to do data integrity write, thus mark request as WRITE_SYNC. akpm: afaict this change will cause the data integrity write bios to be placed onto the second queue in cfq_io_cq.cfqq[], which presumably results in special treatment. The documentation for REQ_SYNC is horrid. Signed-off-by: Roman Pen <r.peniaev@gmail.com> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
f75782e4e0
commit
5948edbcbf
23
fs/mpage.c
23
fs/mpage.c
|
@ -482,6 +482,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
|
|||
struct buffer_head map_bh;
|
||||
loff_t i_size = i_size_read(inode);
|
||||
int ret = 0;
|
||||
int wr = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE);
|
||||
|
||||
if (page_has_buffers(page)) {
|
||||
struct buffer_head *head = page_buffers(page);
|
||||
|
@ -590,7 +591,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
|
|||
* This page will go to BIO. Do we need to send this BIO off first?
|
||||
*/
|
||||
if (bio && mpd->last_block_in_bio != blocks[0] - 1)
|
||||
bio = mpage_bio_submit(WRITE, bio);
|
||||
bio = mpage_bio_submit(wr, bio);
|
||||
|
||||
alloc_new:
|
||||
if (bio == NULL) {
|
||||
|
@ -617,7 +618,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
|
|||
wbc_account_io(wbc, page, PAGE_SIZE);
|
||||
length = first_unmapped << blkbits;
|
||||
if (bio_add_page(bio, page, length, 0) < length) {
|
||||
bio = mpage_bio_submit(WRITE, bio);
|
||||
bio = mpage_bio_submit(wr, bio);
|
||||
goto alloc_new;
|
||||
}
|
||||
|
||||
|
@ -627,7 +628,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
|
|||
set_page_writeback(page);
|
||||
unlock_page(page);
|
||||
if (boundary || (first_unmapped != blocks_per_page)) {
|
||||
bio = mpage_bio_submit(WRITE, bio);
|
||||
bio = mpage_bio_submit(wr, bio);
|
||||
if (boundary_block) {
|
||||
write_boundary_block(boundary_bdev,
|
||||
boundary_block, 1 << blkbits);
|
||||
|
@ -639,7 +640,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
|
|||
|
||||
confused:
|
||||
if (bio)
|
||||
bio = mpage_bio_submit(WRITE, bio);
|
||||
bio = mpage_bio_submit(wr, bio);
|
||||
|
||||
if (mpd->use_writepage) {
|
||||
ret = mapping->a_ops->writepage(page, wbc);
|
||||
|
@ -695,8 +696,11 @@ mpage_writepages(struct address_space *mapping,
|
|||
};
|
||||
|
||||
ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd);
|
||||
if (mpd.bio)
|
||||
mpage_bio_submit(WRITE, mpd.bio);
|
||||
if (mpd.bio) {
|
||||
int wr = (wbc->sync_mode == WB_SYNC_ALL ?
|
||||
WRITE_SYNC : WRITE);
|
||||
mpage_bio_submit(wr, mpd.bio);
|
||||
}
|
||||
}
|
||||
blk_finish_plug(&plug);
|
||||
return ret;
|
||||
|
@ -713,8 +717,11 @@ int mpage_writepage(struct page *page, get_block_t get_block,
|
|||
.use_writepage = 0,
|
||||
};
|
||||
int ret = __mpage_writepage(page, wbc, &mpd);
|
||||
if (mpd.bio)
|
||||
mpage_bio_submit(WRITE, mpd.bio);
|
||||
if (mpd.bio) {
|
||||
int wr = (wbc->sync_mode == WB_SYNC_ALL ?
|
||||
WRITE_SYNC : WRITE);
|
||||
mpage_bio_submit(wr, mpd.bio);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(mpage_writepage);
|
||||
|
|
Loading…
Reference in New Issue