block: remove plugging at buffered write time
Subsystems (3)
PATCH v2 1/1 block: remove plugging at buffered write time
Buffered write(2) is not directly tied to IO, so it's not suitable to handle plug in generic_file_aio_write().
Also moves unplugging for direct I/O from around ->direct_IO() down to do_blockdev_direct_IO().
Note that plugging for O_SYNC writes is also removed. The user may pass arbitrary @size arguments, which may be much larger than the preferable I/O size, or may cross extent/device boundaries. Let the lower layers handle the plugging. The plugging code here actually turns them into no-ops.
CC Jens Axboe <[email protected]>
CC Li Shaohua <[email protected]>
Signed-off-by Wu Fengguang <[email protected]>
--- fs/direct-io.c | 5 +++++ fs/sync.c | 11 ++++++++++- mm/filemap.c | 7 ------- 3 files changed, 15 insertions(+), 8 deletions(-)
mm/filemap.c +0 -7
@@ -1421,12 +1421,8 @@ generic_file_aio_read(struct kiocb *iocb retval =filemap_write_and_wait_range (mapping, pos, pos +iov_length (iov, nr_segs) -1 );if (!retval) { -struct blk_plug plug; - -blk_start_plug (&plug); retval = mapping->a_ops->direct_IO (READ , iocb, iov, pos, nr_segs); -blk_finish_plug (&plug); }if (retval >0 ) { *ppos = pos + retval;
@@ -2610,13 +2606,11 @@ ssize_t generic_file_aio_write(struct ki {struct file *file = iocb->ki_filp;struct inode *inode = file->f_mapping->host; -struct blk_plug plug;ssize_t ret;BUG_ON (iocb->ki_pos != pos);mutex_lock (&inode->i_mutex); -blk_start_plug (&plug); ret =__generic_file_aio_write (iocb, iov, nr_segs, &iocb->ki_pos);mutex_unlock (&inode->i_mutex);
@@ -2627,7 +2621,6 @@ ssize_t generic_file_aio_write(struct kiif (err <0 && ret >0 ) ret = err; } -blk_finish_plug (&plug);return ret; }EXPORT_SYMBOL (generic_file_aio_write);
fs/direct-io.c +5 -0
@@ -1106,6 +1106,7 @@ do_blockdev_direct_IO(int rw, struct kiounsigned long user_addr;size_t bytes;struct buffer_head map_bh = {0 , }; +struct blk_plug plug;if (rw &WRITE ) rw =WRITE_ODIRECT ;
@@ -1221,6 +1222,8 @@ do_blockdev_direct_IO(int rw, struct kio PAGE_SIZE - user_addr / PAGE_SIZE); } +blk_start_plug (&plug); +for (seg =0 ; seg < nr_segs; seg++) { user_addr = (unsigned long )iov[seg].iov_base; sdio.size += bytes = iov[seg].iov_len;
@@ -1279,6 +1282,8 @@ do_blockdev_direct_IO(int rw, struct kioif (sdio.bio)dio_bio_submit (dio, &sdio); +blk_finish_plug (&plug); +/* * It is possible that, we return short IO due to end of file. * In that case, we need to release all the pages we got hold on.