fuse: update inode size and invalidate attributes on fallocate
authorBrian Foster <bfoster@redhat.com>
Fri, 17 May 2013 19:27:34 +0000 (15:27 -0400)
committerMiklos Szeredi <mszeredi@suse.cz>
Mon, 20 May 2013 14:58:58 +0000 (16:58 +0200)
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>
fs/fuse/file.c

index a200a2d803770d39b4c90eea5bf8fc6ffb55bfba..d9f467907791cb4fee5dbd426828d8c8952c824d 100644 (file)
@@ -2492,11 +2492,20 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
        }
        fuse_put_request(fc, req);
 
+       if (err)
+               goto out;
+
+       /* we could have extended the file */
+       if (!(mode & FALLOC_FL_KEEP_SIZE))
+               fuse_write_update_size(inode, offset + length);
+
+       if (mode & FALLOC_FL_PUNCH_HOLE)
+               truncate_pagecache_range(inode, offset, offset + length - 1);
+
+       fuse_invalidate_attr(inode);
+
 out:
        if (mode & FALLOC_FL_PUNCH_HOLE) {
-               if (!err)
-                       truncate_pagecache_range(inode, offset,
-                                                offset + length - 1);
                fuse_release_nowrite(inode);
                mutex_unlock(&inode->i_mutex);
        }