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-03-27 20:00:47 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             : };
      51             : 
      52             : /* +1 to avoid triggering overflow warning when negating it */
      53             : #define KN_DEACTIVATED_BIAS             (INT_MIN + 1)
      54             : 
      55             : /* KERNFS_TYPE_MASK and types are defined in include/linux/kernfs.h */
      56             : 
      57             : /**
      58             :  * kernfs_root - find out the kernfs_root a kernfs_node belongs to
      59             :  * @kn: kernfs_node of interest
      60             :  *
      61             :  * Return: the kernfs_root @kn belongs to.
      62             :  */
      63             : static inline struct kernfs_root *kernfs_root(struct kernfs_node *kn)
      64             : {
      65             :         /* if parent exists, it's always a dir; otherwise, @sd is a dir */
      66       75173 :         if (kn->parent)
      67       36956 :                 kn = kn->parent;
      68       36977 :         return kn->dir.root;
      69             : }
      70             : 
      71             : /*
      72             :  * mount.c
      73             :  */
      74             : struct kernfs_super_info {
      75             :         struct super_block      *sb;
      76             : 
      77             :         /*
      78             :          * The root associated with this super_block.  Each super_block is
      79             :          * identified by the root and ns it's associated with.
      80             :          */
      81             :         struct kernfs_root      *root;
      82             : 
      83             :         /*
      84             :          * Each sb is associated with one namespace tag, currently the
      85             :          * network namespace of the task which mounted this kernfs
      86             :          * instance.  If multiple tags become necessary, make the following
      87             :          * an array and compare kernfs_node tag against every entry.
      88             :          */
      89             :         const void              *ns;
      90             : 
      91             :         /* anchored at kernfs_root->supers, protected by kernfs_rwsem */
      92             :         struct list_head        node;
      93             : };
      94             : #define kernfs_info(SB) ((struct kernfs_super_info *)(SB->s_fs_info))
      95             : 
      96             : static inline struct kernfs_node *kernfs_dentry_node(struct dentry *dentry)
      97             : {
      98           0 :         if (d_really_is_negative(dentry))
      99             :                 return NULL;
     100           0 :         return d_inode(dentry)->i_private;
     101             : }
     102             : 
     103             : static inline void kernfs_set_rev(struct kernfs_node *parent,
     104             :                                   struct dentry *dentry)
     105             : {
     106           0 :         dentry->d_time = parent->dir.rev;
     107             : }
     108             : 
     109             : static inline void kernfs_inc_rev(struct kernfs_node *parent)
     110             : {
     111        9077 :         parent->dir.rev++;
     112             : }
     113             : 
     114             : static inline bool kernfs_dir_changed(struct kernfs_node *parent,
     115             :                                       struct dentry *dentry)
     116             : {
     117           0 :         if (parent->dir.rev != dentry->d_time)
     118             :                 return true;
     119             :         return false;
     120             : }
     121             : 
     122             : extern const struct super_operations kernfs_sops;
     123             : extern struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache;
     124             : 
     125             : /*
     126             :  * inode.c
     127             :  */
     128             : extern const struct xattr_handler *kernfs_xattr_handlers[];
     129             : void kernfs_evict_inode(struct inode *inode);
     130             : int kernfs_iop_permission(struct mnt_idmap *idmap,
     131             :                           struct inode *inode, int mask);
     132             : int kernfs_iop_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
     133             :                        struct iattr *iattr);
     134             : int kernfs_iop_getattr(struct mnt_idmap *idmap,
     135             :                        const struct path *path, struct kstat *stat,
     136             :                        u32 request_mask, unsigned int query_flags);
     137             : ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size);
     138             : int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
     139             : 
     140             : /*
     141             :  * dir.c
     142             :  */
     143             : extern const struct dentry_operations kernfs_dops;
     144             : extern const struct file_operations kernfs_dir_fops;
     145             : extern const struct inode_operations kernfs_dir_iops;
     146             : 
     147             : struct kernfs_node *kernfs_get_active(struct kernfs_node *kn);
     148             : void kernfs_put_active(struct kernfs_node *kn);
     149             : int kernfs_add_one(struct kernfs_node *kn);
     150             : struct kernfs_node *kernfs_new_node(struct kernfs_node *parent,
     151             :                                     const char *name, umode_t mode,
     152             :                                     kuid_t uid, kgid_t gid,
     153             :                                     unsigned flags);
     154             : 
     155             : /*
     156             :  * file.c
     157             :  */
     158             : extern const struct file_operations kernfs_file_fops;
     159             : 
     160             : bool kernfs_should_drain_open_files(struct kernfs_node *kn);
     161             : void kernfs_drain_open_files(struct kernfs_node *kn);
     162             : 
     163             : /*
     164             :  * symlink.c
     165             :  */
     166             : extern const struct inode_operations kernfs_symlink_iops;
     167             : 
     168             : /*
     169             :  * kernfs locks
     170             :  */
     171             : extern struct kernfs_global_locks *kernfs_locks;
     172             : #endif  /* __KERNFS_INTERNAL_H */

Generated by: LCOV version 1.14