|
@@ -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.
|