diff options
Diffstat (limited to 'fs/hostfs/hostfs_kern.c')
-rw-r--r-- | fs/hostfs/hostfs_kern.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 87ac1891a185..7943ff11d489 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
@@ -849,13 +849,14 @@ int hostfs_permission(struct inode *ino, int desired) | |||
849 | 849 | ||
850 | int hostfs_setattr(struct dentry *dentry, struct iattr *attr) | 850 | int hostfs_setattr(struct dentry *dentry, struct iattr *attr) |
851 | { | 851 | { |
852 | struct inode *inode = dentry->d_inode; | ||
852 | struct hostfs_iattr attrs; | 853 | struct hostfs_iattr attrs; |
853 | char *name; | 854 | char *name; |
854 | int err; | 855 | int err; |
855 | 856 | ||
856 | int fd = HOSTFS_I(dentry->d_inode)->fd; | 857 | int fd = HOSTFS_I(inode)->fd; |
857 | 858 | ||
858 | err = inode_change_ok(dentry->d_inode, attr); | 859 | err = inode_change_ok(inode, attr); |
859 | if (err) | 860 | if (err) |
860 | return err; | 861 | return err; |
861 | 862 | ||
@@ -905,7 +906,18 @@ int hostfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
905 | if (err) | 906 | if (err) |
906 | return err; | 907 | return err; |
907 | 908 | ||
908 | return inode_setattr(dentry->d_inode, attr); | 909 | if ((attr->ia_valid & ATTR_SIZE) && |
910 | attr->ia_size != i_size_read(inode)) { | ||
911 | int error; | ||
912 | |||
913 | error = vmtruncate(inode, attr->ia_size); | ||
914 | if (err) | ||
915 | return err; | ||
916 | } | ||
917 | |||
918 | setattr_copy(inode, attr); | ||
919 | mark_inode_dirty(inode); | ||
920 | return 0; | ||
909 | } | 921 | } |
910 | 922 | ||
911 | static const struct inode_operations hostfs_iops = { | 923 | static const struct inode_operations hostfs_iops = { |