Skip to content

Commit c61ca55

Browse files
author
Miklos Szeredi
committed
ovl: ignore failure to copy up unknown xattrs
This issue came up with NFSv4 as the lower layer, which generates "system.nfs4_acl" xattrs (even for plain old unix permissions). Prior to this patch this prevented copy-up from succeeding. The overlayfs permission model mandates that permissions are checked locally for the task and remotely for the mounter(*). NFS4 ACLs are not supported by the Linux kernel currently, hence they cannot be enforced locally. Which means it is indifferent whether this attribute is copied or not. Generalize this to any xattr that is not used in access checking (i.e. it's not a POSIX ACL and not in the "security." namespace). Incidentally, best effort copying of xattrs seems to also be the behavior of "cp -a", which is what overlayfs tries to mimic. (*) Documentation/filesystems/overlayfs.txt#Permission model Signed-off-by: Miklos Szeredi <[email protected]>
1 parent 4c494bd commit c61ca55

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

fs/overlayfs/copy_up.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ static int ovl_ccup_get(char *buf, const struct kernel_param *param)
3636
module_param_call(check_copy_up, ovl_ccup_set, ovl_ccup_get, NULL, 0644);
3737
MODULE_PARM_DESC(check_copy_up, "Obsolete; does nothing");
3838

39+
static bool ovl_must_copy_xattr(const char *name)
40+
{
41+
return !strcmp(name, XATTR_POSIX_ACL_ACCESS) ||
42+
!strcmp(name, XATTR_POSIX_ACL_DEFAULT) ||
43+
!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN);
44+
}
45+
3946
int ovl_copy_xattr(struct dentry *old, struct dentry *new)
4047
{
4148
ssize_t list_size, size, value_size = 0;
@@ -107,8 +114,13 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new)
107114
continue; /* Discard */
108115
}
109116
error = vfs_setxattr(new, name, value, size, 0);
110-
if (error)
111-
break;
117+
if (error) {
118+
if (error != -EOPNOTSUPP || ovl_must_copy_xattr(name))
119+
break;
120+
121+
/* Ignore failure to copy unknown xattrs */
122+
error = 0;
123+
}
112124
}
113125
kfree(value);
114126
out:

0 commit comments

Comments
 (0)