aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fuse/file.c')
-rw-r--r--fs/fuse/file.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 183626868eea..2bb5ace3882d 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -481,8 +481,10 @@ static int fuse_commit_write(struct file *file, struct page *page,
481 err = -EIO; 481 err = -EIO;
482 if (!err) { 482 if (!err) {
483 pos += count; 483 pos += count;
484 if (pos > i_size_read(inode)) 484 spin_lock(&fc->lock);
485 if (pos > inode->i_size)
485 i_size_write(inode, pos); 486 i_size_write(inode, pos);
487 spin_unlock(&fc->lock);
486 488
487 if (offset == 0 && to == PAGE_CACHE_SIZE) { 489 if (offset == 0 && to == PAGE_CACHE_SIZE) {
488 clear_page_dirty(page); 490 clear_page_dirty(page);
@@ -586,8 +588,12 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
586 } 588 }
587 fuse_put_request(fc, req); 589 fuse_put_request(fc, req);
588 if (res > 0) { 590 if (res > 0) {
589 if (write && pos > i_size_read(inode)) 591 if (write) {
590 i_size_write(inode, pos); 592 spin_lock(&fc->lock);
593 if (pos > inode->i_size)
594 i_size_write(inode, pos);
595 spin_unlock(&fc->lock);
596 }
591 *ppos = pos; 597 *ppos = pos;
592 } 598 }
593 fuse_invalidate_attr(inode); 599 fuse_invalidate_attr(inode);