|
@@ -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
|
|
|
};
|