block: remove plugging at buffered write time
Subsystems (3)
PATCH v3 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().
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 +++++ mm/filemap.c | 7 ------- 2 files changed, 5 insertions(+), 7 deletions(-)
mm/filemap.c +0 -3
@@ -2605,13 +2601,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);
@@ -2622,7 +2616,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);
PATCH 1/1 block: move down direct IO plugging
Move unplugging for direct I/O from around ->direct_IO() down to do_blockdev_direct_IO(). This implicitly adds plugging for direct writes.
CC Jens Axboe <[email protected]>
CC Li Shaohua <[email protected]>
Acked-by Jeff Moyer <[email protected]>
Signed-off-by Wu Fengguang <[email protected]>
--- fs/direct-io.c | 5 +++++ mm/filemap.c | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-)
mm/filemap.c +0 -4
@@ -1413,12 +1413,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;
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.