aboutsummaryrefslogtreecommitdiffstats
path: root/fs/hostfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/hostfs')
-rw-r--r--fs/hostfs/hostfs_kern.c18
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
850int hostfs_setattr(struct dentry *dentry, struct iattr *attr) 850int 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
911static const struct inode_operations hostfs_iops = { 923static const struct inode_operations hostfs_iops = {