aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jfs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jfs/file.c')
-rw-r--r--fs/jfs/file.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/fs/jfs/file.c b/fs/jfs/file.c
index 2b70fa78e4a7..a4229e49330e 100644
--- a/fs/jfs/file.c
+++ b/fs/jfs/file.c
@@ -18,6 +18,7 @@
18 */ 18 */
19 19
20#include <linux/fs.h> 20#include <linux/fs.h>
21#include <linux/quotaops.h>
21#include "jfs_incore.h" 22#include "jfs_incore.h"
22#include "jfs_inode.h" 23#include "jfs_inode.h"
23#include "jfs_dmap.h" 24#include "jfs_dmap.h"
@@ -88,14 +89,37 @@ static int jfs_release(struct inode *inode, struct file *file)
88 return 0; 89 return 0;
89} 90}
90 91
92int jfs_setattr(struct dentry *dentry, struct iattr *iattr)
93{
94 struct inode *inode = dentry->d_inode;
95 int rc;
96
97 rc = inode_change_ok(inode, iattr);
98 if (rc)
99 return rc;
100
101 if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) ||
102 (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) {
103 if (vfs_dq_transfer(inode, iattr))
104 return -EDQUOT;
105 }
106
107 rc = inode_setattr(inode, iattr);
108
109 if (!rc && (iattr->ia_valid & ATTR_MODE))
110 rc = jfs_acl_chmod(inode);
111
112 return rc;
113}
114
91const struct inode_operations jfs_file_inode_operations = { 115const struct inode_operations jfs_file_inode_operations = {
92 .truncate = jfs_truncate, 116 .truncate = jfs_truncate,
93 .setxattr = jfs_setxattr, 117 .setxattr = jfs_setxattr,
94 .getxattr = jfs_getxattr, 118 .getxattr = jfs_getxattr,
95 .listxattr = jfs_listxattr, 119 .listxattr = jfs_listxattr,
96 .removexattr = jfs_removexattr, 120 .removexattr = jfs_removexattr,
97#ifdef CONFIG_JFS_POSIX_ACL
98 .setattr = jfs_setattr, 121 .setattr = jfs_setattr,
122#ifdef CONFIG_JFS_POSIX_ACL
99 .check_acl = jfs_check_acl, 123 .check_acl = jfs_check_acl,
100#endif 124#endif
101}; 125};