aboutsummaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r--fs/direct-io.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 160a5489a939..31ba0935e32e 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -664,7 +664,6 @@ static inline int dio_new_bio(struct dio *dio, struct dio_submit *sdio,
664 goto out; 664 goto out;
665 sector = start_sector << (sdio->blkbits - 9); 665 sector = start_sector << (sdio->blkbits - 9);
666 nr_pages = min(sdio->pages_in_io, bio_get_nr_vecs(map_bh->b_bdev)); 666 nr_pages = min(sdio->pages_in_io, bio_get_nr_vecs(map_bh->b_bdev));
667 nr_pages = min(nr_pages, BIO_MAX_PAGES);
668 BUG_ON(nr_pages <= 0); 667 BUG_ON(nr_pages <= 0);
669 dio_bio_alloc(dio, sdio, map_bh->b_bdev, sector, nr_pages); 668 dio_bio_alloc(dio, sdio, map_bh->b_bdev, sector, nr_pages);
670 sdio->boundary = 0; 669 sdio->boundary = 0;
@@ -1194,13 +1193,19 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
1194 } 1193 }
1195 1194
1196 /* 1195 /*
1197 * For file extending writes updating i_size before data 1196 * For file extending writes updating i_size before data writeouts
1198 * writeouts complete can expose uninitialized blocks. So 1197 * complete can expose uninitialized blocks in dumb filesystems.
1199 * even for AIO, we need to wait for i/o to complete before 1198 * In that case we need to wait for I/O completion even if asked
1200 * returning in this case. 1199 * for an asynchronous write.
1201 */ 1200 */
1202 dio->is_async = !is_sync_kiocb(iocb) && !((rw & WRITE) && 1201 if (is_sync_kiocb(iocb))
1203 (end > i_size_read(inode))); 1202 dio->is_async = false;
1203 else if (!(dio->flags & DIO_ASYNC_EXTEND) &&
1204 (rw & WRITE) && end > i_size_read(inode))
1205 dio->is_async = false;
1206 else
1207 dio->is_async = true;
1208
1204 dio->inode = inode; 1209 dio->inode = inode;
1205 dio->rw = rw; 1210 dio->rw = rw;
1206 1211