LCOV - code coverage report
Current view: top level - include/linux - xattr.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsa @ Mon Jul 31 20:08:27 PDT 2023 Lines: 4 6 66.7 %
Date: 2023-07-31 20:08:27 Functions: 1 2 50.0 %

          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  1259429619 : static inline bool is_posix_acl_xattr(const char *name)
      26             : {
      27  1259429619 :         return (strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) == 0) ||
      28  1256598340 :                (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           0 : static inline bool xattr_handler_can_list(const struct xattr_handler *handler,
      61             :                                           struct dentry *dentry)
      62             : {
      63           0 :         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  1186152987 :         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 */

Generated by: LCOV version 1.14