at v4.4 3.3 kB view raw
1/* 2 File: linux/xattr.h 3 4 Extended attributes handling. 5 6 Copyright (C) 2001 by Andreas Gruenbacher <a.gruenbacher@computer.org> 7 Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. 8 Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com> 9*/ 10#ifndef _LINUX_XATTR_H 11#define _LINUX_XATTR_H 12 13 14#include <linux/slab.h> 15#include <linux/types.h> 16#include <linux/spinlock.h> 17#include <uapi/linux/xattr.h> 18 19struct inode; 20struct dentry; 21 22struct xattr_handler { 23 const char *prefix; 24 int flags; /* fs private flags */ 25 size_t (*list)(const struct xattr_handler *, struct dentry *dentry, 26 char *list, size_t list_size, const char *name, 27 size_t name_len); 28 int (*get)(const struct xattr_handler *, struct dentry *dentry, 29 const char *name, void *buffer, size_t size); 30 int (*set)(const struct xattr_handler *, struct dentry *dentry, 31 const char *name, const void *buffer, size_t size, 32 int flags); 33}; 34 35const char *xattr_full_name(const struct xattr_handler *, const char *); 36 37struct xattr { 38 const char *name; 39 void *value; 40 size_t value_len; 41}; 42 43ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t); 44ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t); 45ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); 46int __vfs_setxattr_noperm(struct dentry *, const char *, const void *, size_t, int); 47int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int); 48int vfs_removexattr(struct dentry *, const char *); 49 50ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size); 51ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); 52int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); 53int generic_removexattr(struct dentry *dentry, const char *name); 54ssize_t vfs_getxattr_alloc(struct dentry *dentry, const char *name, 55 char **xattr_value, size_t size, gfp_t flags); 56int vfs_xattr_cmp(struct dentry *dentry, const char *xattr_name, 57 const char *value, size_t size, gfp_t flags); 58 59struct simple_xattrs { 60 struct list_head head; 61 spinlock_t lock; 62}; 63 64struct simple_xattr { 65 struct list_head list; 66 char *name; 67 size_t size; 68 char value[0]; 69}; 70 71/* 72 * initialize the simple_xattrs structure 73 */ 74static inline void simple_xattrs_init(struct simple_xattrs *xattrs) 75{ 76 INIT_LIST_HEAD(&xattrs->head); 77 spin_lock_init(&xattrs->lock); 78} 79 80/* 81 * free all the xattrs 82 */ 83static inline void simple_xattrs_free(struct simple_xattrs *xattrs) 84{ 85 struct simple_xattr *xattr, *node; 86 87 list_for_each_entry_safe(xattr, node, &xattrs->head, list) { 88 kfree(xattr->name); 89 kfree(xattr); 90 } 91} 92 93struct simple_xattr *simple_xattr_alloc(const void *value, size_t size); 94int simple_xattr_get(struct simple_xattrs *xattrs, const char *name, 95 void *buffer, size_t size); 96int simple_xattr_set(struct simple_xattrs *xattrs, const char *name, 97 const void *value, size_t size, int flags); 98int simple_xattr_remove(struct simple_xattrs *xattrs, const char *name); 99ssize_t simple_xattr_list(struct simple_xattrs *xattrs, char *buffer, 100 size_t size); 101void simple_xattr_list_add(struct simple_xattrs *xattrs, 102 struct simple_xattr *new_xattr); 103 104#endif /* _LINUX_XATTR_H */