diff options
Diffstat (limited to 'fs/direct-io.c')
| -rw-r--r-- | fs/direct-io.c | 5 | 
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c index 1faf4cb56f3..f86c720dba0 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -1062,6 +1062,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,  	unsigned long user_addr;  	size_t bytes;  	struct buffer_head map_bh = { 0, }; +	struct blk_plug plug;  	if (rw & WRITE)  		rw = WRITE_ODIRECT; @@ -1177,6 +1178,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,  				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; @@ -1235,6 +1238,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,  	if (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.  |