aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2013-05-17 15:27:34 -0400
committerMiklos Szeredi <mszeredi@suse.cz>2013-05-20 10:58:58 -0400
commitbee6c307800bbb26ba1a855b1841c2f0c4b7622a (patch)
tree0efacb944f7b0b40cc02e896303bdd9f13da4ab5 /fs
parent3634a6327815d39dd93e5c44a602daae91c66297 (diff)
fuse: update inode size and invalidate attributes on fallocate
An fallocate request without FALLOC_FL_KEEP_SIZE set can extend the size of a file. Update the inode size after a successful fallocate. Also invalidate the inode attributes after a successful fallocate to ensure we pick up the latest attribute values (i.e., i_blocks). Signed-off-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r--fs/fuse/file.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index a200a2d80377..d9f467907791 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -2492,11 +2492,20 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
2492 } 2492 }
2493 fuse_put_request(fc, req); 2493 fuse_put_request(fc, req);
2494 2494
2495 if (err)
2496 goto out;
2497
2498 /* we could have extended the file */
2499 if (!(mode & FALLOC_FL_KEEP_SIZE))
2500 fuse_write_update_size(inode, offset + length);
2501
2502 if (mode & FALLOC_FL_PUNCH_HOLE)
2503 truncate_pagecache_range(inode, offset, offset + length - 1);
2504
2505 fuse_invalidate_attr(inode);
2506
2495out: 2507out:
2496 if (mode & FALLOC_FL_PUNCH_HOLE) { 2508 if (mode & FALLOC_FL_PUNCH_HOLE) {
2497 if (!err)
2498 truncate_pagecache_range(inode, offset,
2499 offset + length - 1);
2500 fuse_release_nowrite(inode); 2509 fuse_release_nowrite(inode);
2501 mutex_unlock(&inode->i_mutex); 2510 mutex_unlock(&inode->i_mutex);
2502 } 2511 }