diff options
Diffstat (limited to 'fs/jfs/file.c')
| -rw-r--r-- | fs/jfs/file.c | 26 | 
1 files changed, 25 insertions, 1 deletions
diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 2b70fa78e4a..a4229e49330 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c @@ -18,6 +18,7 @@   */  #include <linux/fs.h> +#include <linux/quotaops.h>  #include "jfs_incore.h"  #include "jfs_inode.h"  #include "jfs_dmap.h" @@ -88,14 +89,37 @@ static int jfs_release(struct inode *inode, struct file *file)  	return 0;  } +int jfs_setattr(struct dentry *dentry, struct iattr *iattr) +{ +	struct inode *inode = dentry->d_inode; +	int rc; + +	rc = inode_change_ok(inode, iattr); +	if (rc) +		return rc; + +	if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || +	    (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { +		if (vfs_dq_transfer(inode, iattr)) +			return -EDQUOT; +	} + +	rc = inode_setattr(inode, iattr); + +	if (!rc && (iattr->ia_valid & ATTR_MODE)) +		rc = jfs_acl_chmod(inode); + +	return rc; +} +  const struct inode_operations jfs_file_inode_operations = {  	.truncate	= jfs_truncate,  	.setxattr	= jfs_setxattr,  	.getxattr	= jfs_getxattr,  	.listxattr	= jfs_listxattr,  	.removexattr	= jfs_removexattr, -#ifdef CONFIG_JFS_POSIX_ACL  	.setattr	= jfs_setattr, +#ifdef CONFIG_JFS_POSIX_ACL  	.check_acl	= jfs_check_acl,  #endif  };  |