diff options
Diffstat (limited to 'fs/direct-io.c')
| -rw-r--r-- | fs/direct-io.c | 19 |
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 | ||
