diff options
| -rw-r--r-- | fs/btrfs/file.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 15e5a1cd8764..98d95bb5f253 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1075,12 +1075,6 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file, | |||
| 1075 | start_pos = pos & ~((u64)root->sectorsize - 1); | 1075 | start_pos = pos & ~((u64)root->sectorsize - 1); |
| 1076 | last_pos = ((u64)index + num_pages) << PAGE_CACHE_SHIFT; | 1076 | last_pos = ((u64)index + num_pages) << PAGE_CACHE_SHIFT; |
| 1077 | 1077 | ||
| 1078 | if (start_pos > inode->i_size) { | ||
| 1079 | err = btrfs_cont_expand(inode, i_size_read(inode), start_pos); | ||
| 1080 | if (err) | ||
| 1081 | return err; | ||
| 1082 | } | ||
| 1083 | |||
| 1084 | again: | 1078 | again: |
| 1085 | for (i = 0; i < num_pages; i++) { | 1079 | for (i = 0; i < num_pages; i++) { |
| 1086 | pages[i] = find_or_create_page(inode->i_mapping, index + i, | 1080 | pages[i] = find_or_create_page(inode->i_mapping, index + i, |
| @@ -1338,6 +1332,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1338 | struct inode *inode = fdentry(file)->d_inode; | 1332 | struct inode *inode = fdentry(file)->d_inode; |
| 1339 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1333 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 1340 | loff_t *ppos = &iocb->ki_pos; | 1334 | loff_t *ppos = &iocb->ki_pos; |
| 1335 | u64 start_pos; | ||
| 1341 | ssize_t num_written = 0; | 1336 | ssize_t num_written = 0; |
| 1342 | ssize_t err = 0; | 1337 | ssize_t err = 0; |
| 1343 | size_t count, ocount; | 1338 | size_t count, ocount; |
| @@ -1386,6 +1381,15 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1386 | file_update_time(file); | 1381 | file_update_time(file); |
| 1387 | BTRFS_I(inode)->sequence++; | 1382 | BTRFS_I(inode)->sequence++; |
| 1388 | 1383 | ||
| 1384 | start_pos = round_down(pos, root->sectorsize); | ||
| 1385 | if (start_pos > i_size_read(inode)) { | ||
| 1386 | err = btrfs_cont_expand(inode, i_size_read(inode), start_pos); | ||
| 1387 | if (err) { | ||
| 1388 | mutex_unlock(&inode->i_mutex); | ||
| 1389 | goto out; | ||
| 1390 | } | ||
| 1391 | } | ||
| 1392 | |||
| 1389 | if (unlikely(file->f_flags & O_DIRECT)) { | 1393 | if (unlikely(file->f_flags & O_DIRECT)) { |
| 1390 | num_written = __btrfs_direct_write(iocb, iov, nr_segs, | 1394 | num_written = __btrfs_direct_write(iocb, iov, nr_segs, |
| 1391 | pos, ppos, count, ocount); | 1395 | pos, ppos, count, ocount); |
