Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kernfs: Switch to generic xattr handlers

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by

Andreas Gruenbacher and committed by
Al Viro
e72a1a8b b8020eff

+92 -86
+3 -3
fs/kernfs/dir.c
··· 1126 1126 .permission = kernfs_iop_permission, 1127 1127 .setattr = kernfs_iop_setattr, 1128 1128 .getattr = kernfs_iop_getattr, 1129 - .setxattr = kernfs_iop_setxattr, 1130 - .removexattr = kernfs_iop_removexattr, 1131 - .getxattr = kernfs_iop_getxattr, 1129 + .setxattr = generic_setxattr, 1130 + .removexattr = generic_removexattr, 1131 + .getxattr = generic_getxattr, 1132 1132 .listxattr = kernfs_iop_listxattr, 1133 1133 1134 1134 .mkdir = kernfs_iop_mkdir,
+84 -74
fs/kernfs/inode.c
··· 28 28 .permission = kernfs_iop_permission, 29 29 .setattr = kernfs_iop_setattr, 30 30 .getattr = kernfs_iop_getattr, 31 - .setxattr = kernfs_iop_setxattr, 32 - .removexattr = kernfs_iop_removexattr, 33 - .getxattr = kernfs_iop_getxattr, 31 + .setxattr = generic_setxattr, 32 + .removexattr = generic_removexattr, 33 + .getxattr = generic_getxattr, 34 34 .listxattr = kernfs_iop_listxattr, 35 35 }; 36 36 ··· 138 138 return error; 139 139 } 140 140 141 - static int kernfs_node_setsecdata(struct kernfs_node *kn, void **secdata, 141 + static int kernfs_node_setsecdata(struct kernfs_iattrs *attrs, void **secdata, 142 142 u32 *secdata_len) 143 143 { 144 - struct kernfs_iattrs *attrs; 145 144 void *old_secdata; 146 145 size_t old_secdata_len; 147 - 148 - attrs = kernfs_iattrs(kn); 149 - if (!attrs) 150 - return -ENOMEM; 151 146 152 147 old_secdata = attrs->ia_secdata; 153 148 old_secdata_len = attrs->ia_secdata_len; ··· 153 158 *secdata = old_secdata; 154 159 *secdata_len = old_secdata_len; 155 160 return 0; 156 - } 157 - 158 - int kernfs_iop_setxattr(struct dentry *unused, struct inode *inode, 159 - const char *name, const void *value, 160 - size_t size, int flags) 161 - { 162 - struct kernfs_node *kn = inode->i_private; 163 - struct kernfs_iattrs *attrs; 164 - void *secdata; 165 - int error; 166 - u32 secdata_len = 0; 167 - 168 - attrs = kernfs_iattrs(kn); 169 - if (!attrs) 170 - return -ENOMEM; 171 - 172 - if (!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN)) { 173 - const char *suffix = name + XATTR_SECURITY_PREFIX_LEN; 174 - error = security_inode_setsecurity(inode, suffix, 175 - value, size, flags); 176 - if (error) 177 - return error; 178 - error = security_inode_getsecctx(inode, 179 - &secdata, &secdata_len); 180 - if (error) 181 - return error; 182 - 183 - mutex_lock(&kernfs_mutex); 184 - error = kernfs_node_setsecdata(kn, &secdata, &secdata_len); 185 - mutex_unlock(&kernfs_mutex); 186 - 187 - if (secdata) 188 - security_release_secctx(secdata, secdata_len); 189 - return error; 190 - } else if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) { 191 - return simple_xattr_set(&attrs->xattrs, name, value, size, 192 - flags); 193 - } 194 - 195 - return -EINVAL; 196 - } 197 - 198 - int kernfs_iop_removexattr(struct dentry *dentry, const char *name) 199 - { 200 - struct kernfs_node *kn = dentry->d_fsdata; 201 - struct kernfs_iattrs *attrs; 202 - 203 - attrs = kernfs_iattrs(kn); 204 - if (!attrs) 205 - return -ENOMEM; 206 - 207 - return simple_xattr_set(&attrs->xattrs, name, NULL, 0, XATTR_REPLACE); 208 - } 209 - 210 - ssize_t kernfs_iop_getxattr(struct dentry *unused, struct inode *inode, 211 - const char *name, void *buf, size_t size) 212 - { 213 - struct kernfs_node *kn = inode->i_private; 214 - struct kernfs_iattrs *attrs; 215 - 216 - attrs = kernfs_iattrs(kn); 217 - if (!attrs) 218 - return -ENOMEM; 219 - 220 - return simple_xattr_get(&attrs->xattrs, name, buf, size); 221 161 } 222 162 223 163 ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size) ··· 306 376 307 377 return generic_permission(inode, mask); 308 378 } 379 + 380 + static int kernfs_xattr_get(const struct xattr_handler *handler, 381 + struct dentry *unused, struct inode *inode, 382 + const char *suffix, void *value, size_t size) 383 + { 384 + const char *name = xattr_full_name(handler, suffix); 385 + struct kernfs_node *kn = inode->i_private; 386 + struct kernfs_iattrs *attrs; 387 + 388 + attrs = kernfs_iattrs(kn); 389 + if (!attrs) 390 + return -ENOMEM; 391 + 392 + return simple_xattr_get(&attrs->xattrs, name, value, size); 393 + } 394 + 395 + static int kernfs_xattr_set(const struct xattr_handler *handler, 396 + struct dentry *unused, struct inode *inode, 397 + const char *suffix, const void *value, 398 + size_t size, int flags) 399 + { 400 + const char *name = xattr_full_name(handler, suffix); 401 + struct kernfs_node *kn = inode->i_private; 402 + struct kernfs_iattrs *attrs; 403 + 404 + attrs = kernfs_iattrs(kn); 405 + if (!attrs) 406 + return -ENOMEM; 407 + 408 + return simple_xattr_set(&attrs->xattrs, name, value, size, flags); 409 + } 410 + 411 + const struct xattr_handler kernfs_trusted_xattr_handler = { 412 + .prefix = XATTR_TRUSTED_PREFIX, 413 + .get = kernfs_xattr_get, 414 + .set = kernfs_xattr_set, 415 + }; 416 + 417 + static int kernfs_security_xattr_set(const struct xattr_handler *handler, 418 + struct dentry *unused, struct inode *inode, 419 + const char *suffix, const void *value, 420 + size_t size, int flags) 421 + { 422 + struct kernfs_node *kn = inode->i_private; 423 + struct kernfs_iattrs *attrs; 424 + void *secdata; 425 + u32 secdata_len = 0; 426 + int error; 427 + 428 + attrs = kernfs_iattrs(kn); 429 + if (!attrs) 430 + return -ENOMEM; 431 + 432 + error = security_inode_setsecurity(inode, suffix, value, size, flags); 433 + if (error) 434 + return error; 435 + error = security_inode_getsecctx(inode, &secdata, &secdata_len); 436 + if (error) 437 + return error; 438 + 439 + mutex_lock(&kernfs_mutex); 440 + error = kernfs_node_setsecdata(attrs, &secdata, &secdata_len); 441 + mutex_unlock(&kernfs_mutex); 442 + 443 + if (secdata) 444 + security_release_secctx(secdata, secdata_len); 445 + return error; 446 + } 447 + 448 + const struct xattr_handler kernfs_security_xattr_handler = { 449 + .prefix = XATTR_SECURITY_PREFIX, 450 + .get = kernfs_xattr_get, 451 + .set = kernfs_security_xattr_set, 452 + }; 453 + 454 + const struct xattr_handler *kernfs_xattr_handlers[] = { 455 + &kernfs_trusted_xattr_handler, 456 + &kernfs_security_xattr_handler, 457 + NULL 458 + };
+1 -6
fs/kernfs/kernfs-internal.h
··· 76 76 /* 77 77 * inode.c 78 78 */ 79 + extern const struct xattr_handler *kernfs_xattr_handlers[]; 79 80 void kernfs_evict_inode(struct inode *inode); 80 81 int kernfs_iop_permission(struct inode *inode, int mask); 81 82 int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr); 82 83 int kernfs_iop_getattr(struct vfsmount *mnt, struct dentry *dentry, 83 84 struct kstat *stat); 84 - int kernfs_iop_setxattr(struct dentry *dentry, struct inode *inode, 85 - const char *name, const void *value, 86 - size_t size, int flags); 87 - int kernfs_iop_removexattr(struct dentry *dentry, const char *name); 88 - ssize_t kernfs_iop_getxattr(struct dentry *dentry, struct inode *inode, 89 - const char *name, void *buf, size_t size); 90 85 ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size); 91 86 92 87 /*
+1
fs/kernfs/mount.c
··· 158 158 sb->s_blocksize_bits = PAGE_SHIFT; 159 159 sb->s_magic = magic; 160 160 sb->s_op = &kernfs_sops; 161 + sb->s_xattr = kernfs_xattr_handlers; 161 162 sb->s_time_gran = 1; 162 163 163 164 /* get root inode, initialize and unlock it */
+3 -3
fs/kernfs/symlink.c
··· 134 134 } 135 135 136 136 const struct inode_operations kernfs_symlink_iops = { 137 - .setxattr = kernfs_iop_setxattr, 138 - .removexattr = kernfs_iop_removexattr, 139 - .getxattr = kernfs_iop_getxattr, 137 + .setxattr = generic_setxattr, 138 + .removexattr = generic_removexattr, 139 + .getxattr = generic_getxattr, 140 140 .listxattr = kernfs_iop_listxattr, 141 141 .readlink = generic_readlink, 142 142 .get_link = kernfs_iop_get_link,