Line data Source code
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 0 : static inline bool is_posix_acl_xattr(const char *name)
26 : {
27 0 : return (strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) == 0) ||
28 0 : (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 : const char *xattr_full_name(const struct xattr_handler *, const char *);
51 :
52 : struct xattr {
53 : const char *name;
54 : void *value;
55 : size_t value_len;
56 : };
57 :
58 : ssize_t __vfs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t);
59 : ssize_t vfs_getxattr(struct mnt_idmap *, struct dentry *, const char *,
60 : void *, size_t);
61 : ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
62 : int __vfs_setxattr(struct mnt_idmap *, struct dentry *, struct inode *,
63 : const char *, const void *, size_t, int);
64 : int __vfs_setxattr_noperm(struct mnt_idmap *, struct dentry *,
65 : const char *, const void *, size_t, int);
66 : int __vfs_setxattr_locked(struct mnt_idmap *, struct dentry *,
67 : const char *, const void *, size_t, int,
68 : struct inode **);
69 : int vfs_setxattr(struct mnt_idmap *, struct dentry *, const char *,
70 : const void *, size_t, int);
71 : int __vfs_removexattr(struct mnt_idmap *, struct dentry *, const char *);
72 : int __vfs_removexattr_locked(struct mnt_idmap *, struct dentry *,
73 : const char *, struct inode **);
74 : int vfs_removexattr(struct mnt_idmap *, struct dentry *, const char *);
75 :
76 : ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
77 : int vfs_getxattr_alloc(struct mnt_idmap *idmap,
78 : struct dentry *dentry, const char *name,
79 : char **xattr_value, size_t size, gfp_t flags);
80 :
81 : int xattr_supported_namespace(struct inode *inode, const char *prefix);
82 :
83 : static inline const char *xattr_prefix(const struct xattr_handler *handler)
84 : {
85 0 : return handler->prefix ?: handler->name;
86 : }
87 :
88 : struct simple_xattrs {
89 : struct rb_root rb_root;
90 : rwlock_t lock;
91 : };
92 :
93 : struct simple_xattr {
94 : struct rb_node rb_node;
95 : char *name;
96 : size_t size;
97 : char value[];
98 : };
99 :
100 : void simple_xattrs_init(struct simple_xattrs *xattrs);
101 : void simple_xattrs_free(struct simple_xattrs *xattrs);
102 : struct simple_xattr *simple_xattr_alloc(const void *value, size_t size);
103 : int simple_xattr_get(struct simple_xattrs *xattrs, const char *name,
104 : void *buffer, size_t size);
105 : int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
106 : const void *value, size_t size, int flags,
107 : ssize_t *removed_size);
108 : ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs,
109 : char *buffer, size_t size);
110 : void simple_xattr_add(struct simple_xattrs *xattrs,
111 : struct simple_xattr *new_xattr);
112 :
113 : #endif /* _LINUX_XATTR_H */
|