LCOV - code coverage report
Current view: top level - fs/kernfs - kernfs-internal.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 8 50.0 %
Date: 2023-07-19 18:55:55 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-only */
       2             : /*
       3             :  * fs/kernfs/kernfs-internal.h - kernfs internal header file
       4             :  *
       5             :  * Copyright (c) 2001-3 Patrick Mochel
       6             :  * Copyright (c) 2007 SUSE Linux Products GmbH
       7             :  * Copyright (c) 2007, 2013 Tejun Heo <teheo@suse.de>
       8             :  */
       9             : 
      10             : #ifndef __KERNFS_INTERNAL_H
      11             : #define __KERNFS_INTERNAL_H
      12             : 
      13             : #include <linux/lockdep.h>
      14             : #include <linux/fs.h>
      15             : #include <linux/mutex.h>
      16             : #include <linux/rwsem.h>
      17             : #include <linux/xattr.h>
      18             : 
      19             : #include <linux/kernfs.h>
      20             : #include <linux/fs_context.h>
      21             : 
      22             : struct kernfs_iattrs {
      23             :         kuid_t                  ia_uid;
      24             :         kgid_t                  ia_gid;
      25             :         struct timespec64       ia_atime;
      26             :         struct timespec64       ia_mtime;
      27             :         struct timespec64       ia_ctime;
      28             : 
      29             :         struct simple_xattrs    xattrs;
      30             :         atomic_t                nr_user_xattrs;
      31             :         atomic_t                user_xattr_size;
      32             : };
      33             : 
      34             : struct kernfs_root {
      35             :         /* published fields */
      36             :         struct kernfs_node      *kn;
      37             :         unsigned int            flags;  /* KERNFS_ROOT_* flags */
      38             : 
      39             :         /* private fields, do not use outside kernfs proper */
      40             :         struct idr              ino_idr;
      41             :         u32                     last_id_lowbits;
      42             :         u32                     id_highbits;
      43             :         struct kernfs_syscall_ops *syscall_ops;
      44             : 
      45             :         /* list of kernfs_super_info of this root, protected by kernfs_rwsem */
      46             :         struct list_head        supers;
      47             : 
      48             :         wait_queue_head_t       deactivate_waitq;
      49             :         struct rw_semaphore     kernfs_rwsem;
      50             :         struct rw_semaphore     kernfs_iattr_rwsem;
      51             :         struct rw_semaphore     kernfs_supers_rwsem;
      52             : };
      53             : 
      54             : /* +1 to avoid triggering overflow warning when negating it */
      55             : #define KN_DEACTIVATED_BIAS             (INT_MIN + 1)
      56             : 
      57             : /* KERNFS_TYPE_MASK and types are defined in include/linux/kernfs.h */
      58             : 
      59             : /**
      60             :  * kernfs_root - find out the kernfs_root a kernfs_node belongs to
      61             :  * @kn: kernfs_node of interest
      62             :  *
      63             :  * Return: the kernfs_root @kn belongs to.
      64             :  */
      65             : static inline struct kernfs_root *kernfs_root(struct kernfs_node *kn)
      66             : {
      67             :         /* if parent exists, it's always a dir; otherwise, @sd is a dir */
      68       78194 :         if (kn->parent)
      69       38863 :                 kn = kn->parent;
      70       38884 :         return kn->dir.root;
      71             : }
      72             : 
      73             : /*
      74             :  * mount.c
      75             :  */
      76             : struct kernfs_super_info {
      77             :         struct super_block      *sb;
      78             : 
      79             :         /*
      80             :          * The root associated with this super_block.  Each super_block is
      81             :          * identified by the root and ns it's associated with.
      82             :          */
      83             :         struct kernfs_root      *root;
      84             : 
      85             :         /*
      86             :          * Each sb is associated with one namespace tag, currently the
      87             :          * network namespace of the task which mounted this kernfs
      88             :          * instance.  If multiple tags become necessary, make the following
      89             :          * an array and compare kernfs_node tag against every entry.
      90             :          */
      91             :         const void              *ns;
      92             : 
      93             :         /* anchored at kernfs_root->supers, protected by kernfs_rwsem */
      94             :         struct list_head        node;
      95             : };
      96             : #define kernfs_info(SB) ((struct kernfs_super_info *)(SB->s_fs_info))
      97             : 
      98             : static inline struct kernfs_node *kernfs_dentry_node(struct dentry *dentry)
      99             : {
     100           0 :         if (d_really_is_negative(dentry))
     101             :                 return NULL;
     102           0 :         return d_inode(dentry)->i_private;
     103             : }
     104             : 
     105             : static inline void kernfs_set_rev(struct kernfs_node *parent,
     106             :                                   struct dentry *dentry)
     107             : {
     108           0 :         dentry->d_time = parent->dir.rev;
     109             : }
     110             : 
     111             : static inline void kernfs_inc_rev(struct kernfs_node *parent)
     112             : {
     113        9283 :         parent->dir.rev++;
     114             : }
     115             : 
     116             : static inline bool kernfs_dir_changed(struct kernfs_node *parent,
     117             :                                       struct dentry *dentry)
     118             : {
     119           0 :         if (parent->dir.rev != dentry->d_time)
     120             :                 return true;
     121             :         return false;
     122             : }
     123             : 
     124             : extern const struct super_operations kernfs_sops;
     125             : extern struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache;
     126             : 
     127             : /*
     128             :  * inode.c
     129             :  */
     130             : extern const struct xattr_handler *kernfs_xattr_handlers[];
     131             : void kernfs_evict_inode(struct inode *inode);
     132             : int kernfs_iop_permission(struct mnt_idmap *idmap,
     133             :                           struct inode *inode, int mask);
     134             : int kernfs_iop_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
     135             :                        struct iattr *iattr);
     136             : int kernfs_iop_getattr(struct mnt_idmap *idmap,
     137             :                        const struct path *path, struct kstat *stat,
     138             :                        u32 request_mask, unsigned int query_flags);
     139             : ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size);
     140             : int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
     141             : 
     142             : /*
     143             :  * dir.c
     144             :  */
     145             : extern const struct dentry_operations kernfs_dops;
     146             : extern const struct file_operations kernfs_dir_fops;
     147             : extern const struct inode_operations kernfs_dir_iops;
     148             : 
     149             : struct kernfs_node *kernfs_get_active(struct kernfs_node *kn);
     150             : void kernfs_put_active(struct kernfs_node *kn);
     151             : int kernfs_add_one(struct kernfs_node *kn);
     152             : struct kernfs_node *kernfs_new_node(struct kernfs_node *parent,
     153             :                                     const char *name, umode_t mode,
     154             :                                     kuid_t uid, kgid_t gid,
     155             :                                     unsigned flags);
     156             : 
     157             : /*
     158             :  * file.c
     159             :  */
     160             : extern const struct file_operations kernfs_file_fops;
     161             : 
     162             : bool kernfs_should_drain_open_files(struct kernfs_node *kn);
     163             : void kernfs_drain_open_files(struct kernfs_node *kn);
     164             : 
     165             : /*
     166             :  * symlink.c
     167             :  */
     168             : extern const struct inode_operations kernfs_symlink_iops;
     169             : 
     170             : /*
     171             :  * kernfs locks
     172             :  */
     173             : extern struct kernfs_global_locks *kernfs_locks;
     174             : #endif  /* __KERNFS_INTERNAL_H */

Generated by: LCOV version 1.14