|
@@ -53,11 +53,34 @@ xfs_xattr_get(struct dentry *dentry, const char *name,
|
|
return asize;
|
|
return asize;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void
|
|
|
|
+xfs_forget_acl(
|
|
|
|
+ struct inode *inode,
|
|
|
|
+ const char *name,
|
|
|
|
+ int xflags)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * Invalidate any cached ACLs if the user has bypassed the ACL
|
|
|
|
+ * interface. We don't validate the content whatsoever so it is caller
|
|
|
|
+ * responsibility to provide data in valid format and ensure i_mode is
|
|
|
|
+ * consistent.
|
|
|
|
+ */
|
|
|
|
+ if (xflags & ATTR_ROOT) {
|
|
|
|
+#ifdef CONFIG_XFS_POSIX_ACL
|
|
|
|
+ if (!strcmp(name, SGI_ACL_FILE))
|
|
|
|
+ forget_cached_acl(inode, ACL_TYPE_ACCESS);
|
|
|
|
+ else if (!strcmp(name, SGI_ACL_DEFAULT))
|
|
|
|
+ forget_cached_acl(inode, ACL_TYPE_DEFAULT);
|
|
|
|
+#endif
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static int
|
|
static int
|
|
xfs_xattr_set(struct dentry *dentry, const char *name, const void *value,
|
|
xfs_xattr_set(struct dentry *dentry, const char *name, const void *value,
|
|
size_t size, int flags, int xflags)
|
|
size_t size, int flags, int xflags)
|
|
{
|
|
{
|
|
- struct xfs_inode *ip = XFS_I(d_inode(dentry));
|
|
|
|
|
|
+ struct xfs_inode *ip = XFS_I(d_inode(dentry));
|
|
|
|
+ int error;
|
|
|
|
|
|
if (strcmp(name, "") == 0)
|
|
if (strcmp(name, "") == 0)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
@@ -70,8 +93,12 @@ xfs_xattr_set(struct dentry *dentry, const char *name, const void *value,
|
|
|
|
|
|
if (!value)
|
|
if (!value)
|
|
return xfs_attr_remove(ip, (unsigned char *)name, xflags);
|
|
return xfs_attr_remove(ip, (unsigned char *)name, xflags);
|
|
- return xfs_attr_set(ip, (unsigned char *)name,
|
|
|
|
|
|
+ error = xfs_attr_set(ip, (unsigned char *)name,
|
|
(void *)value, size, xflags);
|
|
(void *)value, size, xflags);
|
|
|
|
+ if (!error)
|
|
|
|
+ xfs_forget_acl(d_inode(dentry), name, xflags);
|
|
|
|
+
|
|
|
|
+ return error;
|
|
}
|
|
}
|
|
|
|
|
|
static const struct xattr_handler xfs_xattr_user_handler = {
|
|
static const struct xattr_handler xfs_xattr_user_handler = {
|