1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 File: linux/xattr.h 4 5 Extended attributes handling. 6 7 Copyright (C) 2001 by Andreas Gruenbacher <a.gruenbacher@computer.org> 8 Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. 9 Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com> 10 */ 11 #ifndef _LINUX_XATTR_H 12 #define _LINUX_XATTR_H 13 14 15 #include <linux/slab.h> 16 #include <linux/types.h> 17 #include <linux/spinlock.h> 18 #include <linux/mm.h> 19 #include <linux/user_namespace.h> 20 #include <uapi/linux/xattr.h> 21 22 struct inode; 23 struct dentry; 24 25 static inline bool is_posix_acl_xattr(const char *name) 26 { 27 return (strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) == 0) || 28 (strcmp(name, XATTR_NAME_POSIX_ACL_DEFAULT) == 0); 29 } 30 31 /* 32 * struct xattr_handler: When @name is set, match attributes with exactly that 33 * name. When @prefix is set instead, match attributes with that prefix and 34 * with a non-empty suffix. 35 */ 36 struct xattr_handler { 37 const char *name; 38 const char *prefix; 39 int flags; /* fs private flags */ 40 bool (*list)(struct dentry *dentry); 41 int (*get)(const struct xattr_handler *, struct dentry *dentry, 42 struct inode *inode, const char *name, void *buffer, 43 size_t size); 44 int (*set)(const struct xattr_handler *, 45 struct mnt_idmap *idmap, struct dentry *dentry, 46 struct inode *inode, const char *name, const void *buffer, 47 size_t size, int flags); 48 }; 49 50 /** 51 * xattr_handler_can_list - check whether xattr can be listed 52 * @handler: handler for this type of xattr 53 * @dentry: dentry whose inode xattr to list 54 * 55 * Determine whether the xattr associated with @dentry can be listed given 56 * @handler. 57 * 58 * Return: true if xattr can be listed, false if not. 59 */ 60 static inline bool xattr_handler_can_list(const struct xattr_handler *handler, 61 struct dentry *dentry) 62 { 63 return handler && (!handler->list || handler->list(dentry)); 64 } 65 66 const char *xattr_full_name(const struct xattr_handler *, const char *); 67 68 struct xattr { 69 const char *name; 70 void *value; 71 size_t value_len; 72 }; 73 74 ssize_t __vfs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); 75 ssize_t vfs_getxattr(struct mnt_idmap *, struct dentry *, const char *, 76 void *, size_t); 77 ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); 78 int __vfs_setxattr(struct mnt_idmap *, struct dentry *, struct inode *, 79 const char *, const void *, size_t, int); 80 int __vfs_setxattr_noperm(struct mnt_idmap *, struct dentry *, 81 const char *, const void *, size_t, int); 82 int __vfs_setxattr_locked(struct mnt_idmap *, struct dentry *, 83 const char *, const void *, size_t, int, 84 struct inode **); 85 int vfs_setxattr(struct mnt_idmap *, struct dentry *, const char *, 86 const void *, size_t, int); 87 int __vfs_removexattr(struct mnt_idmap *, struct dentry *, const char *); 88 int __vfs_removexattr_locked(struct mnt_idmap *, struct dentry *, 89 const char *, struct inode **); 90 int vfs_removexattr(struct mnt_idmap *, struct dentry *, const char *); 91 92 ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); 93 int vfs_getxattr_alloc(struct mnt_idmap *idmap, 94 struct dentry *dentry, const char *name, 95 char **xattr_value, size_t size, gfp_t flags); 96 97 int xattr_supports_user_prefix(struct inode *inode); 98 99 static inline const char *xattr_prefix(const struct xattr_handler *handler) 100 { 101 return handler->prefix ?: handler->name; 102 } 103 104 struct simple_xattrs { 105 struct rb_root rb_root; 106 rwlock_t lock; 107 }; 108 109 struct simple_xattr { 110 struct rb_node rb_node; 111 char *name; 112 size_t size; 113 char value[]; 114 }; 115 116 void simple_xattrs_init(struct simple_xattrs *xattrs); 117 void simple_xattrs_free(struct simple_xattrs *xattrs); 118 struct simple_xattr *simple_xattr_alloc(const void *value, size_t size); 119 int simple_xattr_get(struct simple_xattrs *xattrs, const char *name, 120 void *buffer, size_t size); 121 int simple_xattr_set(struct simple_xattrs *xattrs, const char *name, 122 const void *value, size_t size, int flags, 123 ssize_t *removed_size); 124 ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, 125 char *buffer, size_t size); 126 void simple_xattr_add(struct simple_xattrs *xattrs, 127 struct simple_xattr *new_xattr); 128 int xattr_list_one(char **buffer, ssize_t *remaining_size, const char *name); 129 130 #endif /* _LINUX_XATTR_H */ 131