| .. | .. |
|---|
| 15 | 15 | #include <linux/slab.h> |
|---|
| 16 | 16 | #include <linux/types.h> |
|---|
| 17 | 17 | #include <linux/spinlock.h> |
|---|
| 18 | +#include <linux/mm.h> |
|---|
| 18 | 19 | #include <uapi/linux/xattr.h> |
|---|
| 19 | 20 | |
|---|
| 20 | 21 | struct inode; |
|---|
| .. | .. |
|---|
| 32 | 33 | bool (*list)(struct dentry *dentry); |
|---|
| 33 | 34 | int (*get)(const struct xattr_handler *handler, struct dentry *dentry, |
|---|
| 34 | 35 | struct inode *inode, const char *name, void *buffer, |
|---|
| 35 | | - size_t size); |
|---|
| 36 | | - int (*__get)(const struct xattr_handler *handler, struct dentry *dentry, |
|---|
| 37 | | - struct inode *inode, const char *name, void *buffer, |
|---|
| 38 | | - size_t size); |
|---|
| 36 | + size_t size, int flags); |
|---|
| 39 | 37 | int (*set)(const struct xattr_handler *handler, struct dentry *dentry, |
|---|
| 40 | 38 | struct inode *inode, const char *name, const void *buffer, |
|---|
| 41 | 39 | size_t size, int flags); |
|---|
| .. | .. |
|---|
| 49 | 47 | size_t value_len; |
|---|
| 50 | 48 | }; |
|---|
| 51 | 49 | |
|---|
| 52 | | -ssize_t __vfs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t); |
|---|
| 50 | +ssize_t __vfs_getxattr(struct dentry *dentry, struct inode *inode, |
|---|
| 51 | + const char *name, void *buffer, size_t size, int flags); |
|---|
| 53 | 52 | ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t); |
|---|
| 54 | 53 | ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); |
|---|
| 55 | 54 | int __vfs_setxattr(struct dentry *, struct inode *, const char *, const void *, size_t, int); |
|---|
| .. | .. |
|---|
| 63 | 62 | ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); |
|---|
| 64 | 63 | ssize_t vfs_getxattr_alloc(struct dentry *dentry, const char *name, |
|---|
| 65 | 64 | char **xattr_value, size_t size, gfp_t flags); |
|---|
| 65 | + |
|---|
| 66 | +int xattr_supported_namespace(struct inode *inode, const char *prefix); |
|---|
| 66 | 67 | |
|---|
| 67 | 68 | static inline const char *xattr_prefix(const struct xattr_handler *handler) |
|---|
| 68 | 69 | { |
|---|
| .. | .. |
|---|
| 78 | 79 | struct list_head list; |
|---|
| 79 | 80 | char *name; |
|---|
| 80 | 81 | size_t size; |
|---|
| 81 | | - char value[0]; |
|---|
| 82 | + char value[]; |
|---|
| 82 | 83 | }; |
|---|
| 83 | 84 | |
|---|
| 84 | 85 | /* |
|---|
| .. | .. |
|---|
| 99 | 100 | |
|---|
| 100 | 101 | list_for_each_entry_safe(xattr, node, &xattrs->head, list) { |
|---|
| 101 | 102 | kfree(xattr->name); |
|---|
| 102 | | - kfree(xattr); |
|---|
| 103 | + kvfree(xattr); |
|---|
| 103 | 104 | } |
|---|
| 104 | 105 | } |
|---|
| 105 | 106 | |
|---|
| .. | .. |
|---|
| 107 | 108 | int simple_xattr_get(struct simple_xattrs *xattrs, const char *name, |
|---|
| 108 | 109 | void *buffer, size_t size); |
|---|
| 109 | 110 | int simple_xattr_set(struct simple_xattrs *xattrs, const char *name, |
|---|
| 110 | | - const void *value, size_t size, int flags); |
|---|
| 111 | + const void *value, size_t size, int flags, |
|---|
| 112 | + ssize_t *removed_size); |
|---|
| 111 | 113 | ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, char *buffer, |
|---|
| 112 | 114 | size_t size); |
|---|
| 113 | 115 | void simple_xattr_list_add(struct simple_xattrs *xattrs, |
|---|