|
@@ -1075,12 +1075,6 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file,
|
|
|
start_pos = pos & ~((u64)root->sectorsize - 1);
|
|
|
last_pos = ((u64)index + num_pages) << PAGE_CACHE_SHIFT;
|
|
|
|
|
|
- if (start_pos > inode->i_size) {
|
|
|
- err = btrfs_cont_expand(inode, i_size_read(inode), start_pos);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
again:
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
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,
|
|
|
struct inode *inode = fdentry(file)->d_inode;
|
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
|
loff_t *ppos = &iocb->ki_pos;
|
|
|
+ u64 start_pos;
|
|
|
ssize_t num_written = 0;
|
|
|
ssize_t err = 0;
|
|
|
size_t count, ocount;
|
|
@@ -1386,6 +1381,15 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
|
|
|
file_update_time(file);
|
|
|
BTRFS_I(inode)->sequence++;
|
|
|
|
|
|
+ start_pos = round_down(pos, root->sectorsize);
|
|
|
+ if (start_pos > i_size_read(inode)) {
|
|
|
+ err = btrfs_cont_expand(inode, i_size_read(inode), start_pos);
|
|
|
+ if (err) {
|
|
|
+ mutex_unlock(&inode->i_mutex);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (unlikely(file->f_flags & O_DIRECT)) {
|
|
|
num_written = __btrfs_direct_write(iocb, iov, nr_segs,
|
|
|
pos, ppos, count, ocount);
|