Lines Matching +full:name +full:- +full:prefix

1 // SPDX-License-Identifier: GPL-2.0-only
7 static bool ovl_is_escaped_xattr(struct super_block *sb, const char *name) in ovl_is_escaped_xattr() argument
9 struct ovl_fs *ofs = sb->s_fs_info; in ovl_is_escaped_xattr()
11 if (ofs->config.userxattr) in ovl_is_escaped_xattr()
12 return strncmp(name, OVL_XATTR_ESCAPE_USER_PREFIX, in ovl_is_escaped_xattr()
15 return strncmp(name, OVL_XATTR_ESCAPE_TRUSTED_PREFIX, in ovl_is_escaped_xattr()
16 OVL_XATTR_ESCAPE_TRUSTED_PREFIX_LEN - 1) == 0; in ovl_is_escaped_xattr()
19 static bool ovl_is_own_xattr(struct super_block *sb, const char *name) in ovl_is_own_xattr() argument
23 if (ofs->config.userxattr) in ovl_is_own_xattr()
24 return strncmp(name, OVL_XATTR_USER_PREFIX, in ovl_is_own_xattr()
27 return strncmp(name, OVL_XATTR_TRUSTED_PREFIX, in ovl_is_own_xattr()
31 bool ovl_is_private_xattr(struct super_block *sb, const char *name) in ovl_is_private_xattr() argument
33 return ovl_is_own_xattr(sb, name) && !ovl_is_escaped_xattr(sb, name); in ovl_is_private_xattr()
36 static int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, in ovl_xattr_set() argument
40 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_xattr_set()
48 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
49 err = vfs_getxattr(mnt_idmap(realpath.mnt), realdentry, name, NULL, 0); in ovl_xattr_set()
67 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
69 err = ovl_do_setxattr(ofs, realdentry, name, value, size, in ovl_xattr_set()
73 err = ovl_do_removexattr(ofs, realdentry, name); in ovl_xattr_set()
84 static int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name, in ovl_xattr_get() argument
92 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_get()
93 res = vfs_getxattr(mnt_idmap(realpath.mnt), realpath.dentry, name, value, size); in ovl_xattr_get()
104 /* List all non-trusted xattrs */ in ovl_can_list()
115 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_listxattr()
122 old_cred = ovl_override_creds(dentry->d_sb); in ovl_listxattr()
128 prefix_len = ofs->config.userxattr ? in ovl_listxattr()
137 return -EIO; in ovl_listxattr()
139 len -= slen; in ovl_listxattr()
140 if (!ovl_can_list(dentry->d_sb, s)) { in ovl_listxattr()
141 res -= slen; in ovl_listxattr()
143 } else if (ovl_is_escaped_xattr(dentry->d_sb, s)) { in ovl_listxattr()
144 res -= OVL_XATTR_ESCAPE_PREFIX_LEN; in ovl_listxattr()
145 name_len = slen - prefix_len - OVL_XATTR_ESCAPE_PREFIX_LEN; in ovl_listxattr()
157 static char *ovl_xattr_escape_name(const char *prefix, const char *name) in ovl_xattr_escape_name() argument
159 size_t prefix_len = strlen(prefix); in ovl_xattr_escape_name()
160 size_t name_len = strlen(name); in ovl_xattr_escape_name()
166 return ERR_PTR(-EOPNOTSUPP); in ovl_xattr_escape_name()
170 return ERR_PTR(-ENOMEM); in ovl_xattr_escape_name()
173 memcpy(s, prefix, prefix_len); in ovl_xattr_escape_name()
177 memcpy(s, name, name_len + 1); in ovl_xattr_escape_name()
184 const char *name, void *buffer, size_t size) in ovl_own_xattr_get() argument
189 escaped = ovl_xattr_escape_name(handler->prefix, name); in ovl_own_xattr_get()
203 const char *name, const void *value, in ovl_own_xattr_set() argument
209 escaped = ovl_xattr_escape_name(handler->prefix, name); in ovl_own_xattr_set()
222 const char *name, void *buffer, size_t size) in ovl_other_xattr_get() argument
224 return ovl_xattr_get(dentry, inode, name, buffer, size); in ovl_other_xattr_get()
230 const char *name, const void *value, in ovl_other_xattr_set() argument
233 return ovl_xattr_set(dentry, inode, name, value, size, flags); in ovl_other_xattr_set()
237 .prefix = OVL_XATTR_TRUSTED_PREFIX,
243 .prefix = OVL_XATTR_USER_PREFIX,
249 .prefix = "", /* catch all */
268 return ofs->config.userxattr ? ovl_user_xattr_handlers : in ovl_xattr_handlers()