diff options
-rw-r--r-- | fs/direct-io.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c index af0558dbe8b7..b6d43908ff7a 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -1209,6 +1209,19 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | |||
1209 | retval = direct_io_worker(rw, iocb, inode, iov, offset, | 1209 | retval = direct_io_worker(rw, iocb, inode, iov, offset, |
1210 | nr_segs, blkbits, get_block, end_io, dio); | 1210 | nr_segs, blkbits, get_block, end_io, dio); |
1211 | 1211 | ||
1212 | /* | ||
1213 | * In case of error extending write may have instantiated a few | ||
1214 | * blocks outside i_size. Trim these off again for DIO_LOCKING. | ||
1215 | * NOTE: DIO_NO_LOCK/DIO_OWN_LOCK callers have to handle this by | ||
1216 | * it's own meaner. | ||
1217 | */ | ||
1218 | if (unlikely(retval < 0 && (rw & WRITE))) { | ||
1219 | loff_t isize = i_size_read(inode); | ||
1220 | |||
1221 | if (end > isize && dio_lock_type == DIO_LOCKING) | ||
1222 | vmtruncate(inode, isize); | ||
1223 | } | ||
1224 | |||
1212 | if (rw == READ && dio_lock_type == DIO_LOCKING) | 1225 | if (rw == READ && dio_lock_type == DIO_LOCKING) |
1213 | release_i_mutex = 0; | 1226 | release_i_mutex = 0; |
1214 | 1227 | ||