LCOV - code coverage report
Current view: top level - fs - internal.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwx @ Mon Jul 31 20:08:22 PDT 2023 Lines: 12 12 100.0 %
Date: 2023-07-31 20:08:22 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2             : /* fs/ internal definitions
       3             :  *
       4             :  * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
       5             :  * Written by David Howells (dhowells@redhat.com)
       6             :  */
       7             : 
       8             : struct super_block;
       9             : struct file_system_type;
      10             : struct iomap;
      11             : struct iomap_ops;
      12             : struct linux_binprm;
      13             : struct path;
      14             : struct mount;
      15             : struct shrink_control;
      16             : struct fs_context;
      17             : struct pipe_inode_info;
      18             : struct iov_iter;
      19             : struct mnt_idmap;
      20             : 
      21             : /*
      22             :  * block/bdev.c
      23             :  */
      24             : #ifdef CONFIG_BLOCK
      25             : extern void __init bdev_cache_init(void);
      26             : 
      27             : void emergency_thaw_bdev(struct super_block *sb);
      28             : #else
      29             : static inline void bdev_cache_init(void)
      30             : {
      31             : }
      32             : static inline int emergency_thaw_bdev(struct super_block *sb)
      33             : {
      34             :         return 0;
      35             : }
      36             : #endif /* CONFIG_BLOCK */
      37             : 
      38             : /*
      39             :  * buffer.c
      40             :  */
      41             : int __block_write_begin_int(struct folio *folio, loff_t pos, unsigned len,
      42             :                 get_block_t *get_block, const struct iomap *iomap);
      43             : 
      44             : /*
      45             :  * char_dev.c
      46             :  */
      47             : extern void __init chrdev_init(void);
      48             : 
      49             : /*
      50             :  * fs_context.c
      51             :  */
      52             : extern const struct fs_context_operations legacy_fs_context_ops;
      53             : extern int parse_monolithic_mount_data(struct fs_context *, void *);
      54             : extern void vfs_clean_context(struct fs_context *fc);
      55             : extern int finish_clean_context(struct fs_context *fc);
      56             : 
      57             : /*
      58             :  * namei.c
      59             :  */
      60             : extern int filename_lookup(int dfd, struct filename *name, unsigned flags,
      61             :                            struct path *path, struct path *root);
      62             : int do_rmdir(int dfd, struct filename *name);
      63             : int do_unlinkat(int dfd, struct filename *name);
      64             : int may_linkat(struct mnt_idmap *idmap, const struct path *link);
      65             : int do_renameat2(int olddfd, struct filename *oldname, int newdfd,
      66             :                  struct filename *newname, unsigned int flags);
      67             : int do_mkdirat(int dfd, struct filename *name, umode_t mode);
      68             : int do_symlinkat(struct filename *from, int newdfd, struct filename *to);
      69             : int do_linkat(int olddfd, struct filename *old, int newdfd,
      70             :                         struct filename *new, int flags);
      71             : 
      72             : /*
      73             :  * namespace.c
      74             :  */
      75             : extern struct vfsmount *lookup_mnt(const struct path *);
      76             : extern int finish_automount(struct vfsmount *, const struct path *);
      77             : 
      78             : extern int sb_prepare_remount_readonly(struct super_block *);
      79             : 
      80             : extern void __init mnt_init(void);
      81             : 
      82             : extern int __mnt_want_write_file(struct file *);
      83             : extern void __mnt_drop_write_file(struct file *);
      84             : 
      85             : extern void dissolve_on_fput(struct vfsmount *);
      86             : extern bool may_mount(void);
      87             : 
      88             : int path_mount(const char *dev_name, struct path *path,
      89             :                 const char *type_page, unsigned long flags, void *data_page);
      90             : int path_umount(struct path *path, int flags);
      91             : 
      92             : /*
      93             :  * fs_struct.c
      94             :  */
      95             : extern void chroot_fs_refs(const struct path *, const struct path *);
      96             : 
      97             : /*
      98             :  * file_table.c
      99             :  */
     100             : struct file *alloc_empty_file(int flags, const struct cred *cred);
     101             : struct file *alloc_empty_file_noaccount(int flags, const struct cred *cred);
     102             : struct file *alloc_empty_backing_file(int flags, const struct cred *cred);
     103             : 
     104  1094260625 : static inline void put_file_access(struct file *file)
     105             : {
     106  1094260625 :         if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
     107   621448532 :                 i_readcount_dec(file->f_inode);
     108   472812093 :         } else if (file->f_mode & FMODE_WRITER) {
     109   369185552 :                 put_write_access(file->f_inode);
     110   369726062 :                 __mnt_drop_write(file->f_path.mnt);
     111             :         }
     112  1096010790 : }
     113             : 
     114             : /*
     115             :  * super.c
     116             :  */
     117             : extern int reconfigure_super(struct fs_context *);
     118             : extern bool trylock_super(struct super_block *sb);
     119             : struct super_block *user_get_super(dev_t, bool excl);
     120             : void put_super(struct super_block *sb);
     121             : extern bool mount_capable(struct fs_context *);
     122             : int sb_init_dio_done_wq(struct super_block *sb);
     123             : 
     124             : /*
     125             :  * Prepare superblock for changing its read-only state (i.e., either remount
     126             :  * read-write superblock read-only or vice versa). After this function returns
     127             :  * mnt_is_readonly() will return true for any mount of the superblock if its
     128             :  * caller is able to observe any changes done by the remount. This holds until
     129             :  * sb_end_ro_state_change() is called.
     130             :  */
     131             : static inline void sb_start_ro_state_change(struct super_block *sb)
     132             : {
     133        1214 :         WRITE_ONCE(sb->s_readonly_remount, 1);
     134             :         /*
     135             :          * For RO->RW transition, the barrier pairs with the barrier in
     136             :          * mnt_is_readonly() making sure if mnt_is_readonly() sees SB_RDONLY
     137             :          * cleared, it will see s_readonly_remount set.
     138             :          * For RW->RO transition, the barrier pairs with the barrier in
     139             :          * __mnt_want_write() before the mnt_is_readonly() check. The barrier
     140             :          * makes sure if __mnt_want_write() sees MNT_WRITE_HOLD already
     141             :          * cleared, it will see s_readonly_remount set.
     142             :          */
     143        1214 :         smp_wmb();
     144        1214 : }
     145             : 
     146             : /*
     147             :  * Ends section changing read-only state of the superblock. After this function
     148             :  * returns if mnt_is_readonly() returns false, the caller will be able to
     149             :  * observe all the changes remount did to the superblock.
     150             :  */
     151             : static inline void sb_end_ro_state_change(struct super_block *sb)
     152             : {
     153             :         /*
     154             :          * This barrier provides release semantics that pairs with
     155             :          * the smp_rmb() acquire semantics in mnt_is_readonly().
     156             :          * This barrier pair ensure that when mnt_is_readonly() sees
     157             :          * 0 for sb->s_readonly_remount, it will also see all the
     158             :          * preceding flag changes that were made during the RO state
     159             :          * change.
     160             :          */
     161        2106 :         smp_wmb();
     162        2106 :         WRITE_ONCE(sb->s_readonly_remount, 0);
     163             : }
     164             : 
     165             : /*
     166             :  * open.c
     167             :  */
     168             : struct open_flags {
     169             :         int open_flag;
     170             :         umode_t mode;
     171             :         int acc_mode;
     172             :         int intent;
     173             :         int lookup_flags;
     174             : };
     175             : extern struct file *do_filp_open(int dfd, struct filename *pathname,
     176             :                 const struct open_flags *op);
     177             : extern struct file *do_file_open_root(const struct path *,
     178             :                 const char *, const struct open_flags *);
     179             : extern struct open_how build_open_how(int flags, umode_t mode);
     180             : extern int build_open_flags(const struct open_how *how, struct open_flags *op);
     181             : extern struct file *__close_fd_get_file(unsigned int fd);
     182             : 
     183             : long do_sys_ftruncate(unsigned int fd, loff_t length, int small);
     184             : int chmod_common(const struct path *path, umode_t mode);
     185             : int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
     186             :                 int flag);
     187             : int chown_common(const struct path *path, uid_t user, gid_t group);
     188             : extern int vfs_open(const struct path *, struct file *);
     189             : 
     190             : /*
     191             :  * inode.c
     192             :  */
     193             : extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc);
     194             : int dentry_needs_remove_privs(struct mnt_idmap *, struct dentry *dentry);
     195             : bool in_group_or_capable(struct mnt_idmap *idmap,
     196             :                          const struct inode *inode, vfsgid_t vfsgid);
     197             : void lock_two_inodes(struct inode *inode1, struct inode *inode2,
     198             :                      unsigned subclass1, unsigned subclass2);
     199             : 
     200             : /*
     201             :  * fs-writeback.c
     202             :  */
     203             : extern long get_nr_dirty_inodes(void);
     204             : extern int invalidate_inodes(struct super_block *, bool);
     205             : 
     206             : /*
     207             :  * dcache.c
     208             :  */
     209             : extern int d_set_mounted(struct dentry *dentry);
     210             : extern long prune_dcache_sb(struct super_block *sb, struct shrink_control *sc);
     211             : extern struct dentry *d_alloc_cursor(struct dentry *);
     212             : extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
     213             : extern char *simple_dname(struct dentry *, char *, int);
     214             : extern void dput_to_list(struct dentry *, struct list_head *);
     215             : extern void shrink_dentry_list(struct list_head *);
     216             : 
     217             : /*
     218             :  * pipe.c
     219             :  */
     220             : extern const struct file_operations pipefifo_fops;
     221             : 
     222             : /*
     223             :  * fs_pin.c
     224             :  */
     225             : extern void group_pin_kill(struct hlist_head *p);
     226             : extern void mnt_pin_kill(struct mount *m);
     227             : 
     228             : /*
     229             :  * fs/nsfs.c
     230             :  */
     231             : extern const struct dentry_operations ns_dentry_operations;
     232             : 
     233             : /*
     234             :  * fs/stat.c:
     235             :  */
     236             : 
     237             : int getname_statx_lookup_flags(int flags);
     238             : int do_statx(int dfd, struct filename *filename, unsigned int flags,
     239             :              unsigned int mask, struct statx __user *buffer);
     240             : 
     241             : /*
     242             :  * fs/splice.c:
     243             :  */
     244             : long splice_file_to_pipe(struct file *in,
     245             :                          struct pipe_inode_info *opipe,
     246             :                          loff_t *offset,
     247             :                          size_t len, unsigned int flags);
     248             : 
     249             : /*
     250             :  * fs/xattr.c:
     251             :  */
     252             : struct xattr_name {
     253             :         char name[XATTR_NAME_MAX + 1];
     254             : };
     255             : 
     256             : struct xattr_ctx {
     257             :         /* Value of attribute */
     258             :         union {
     259             :                 const void __user *cvalue;
     260             :                 void __user *value;
     261             :         };
     262             :         void *kvalue;
     263             :         size_t size;
     264             :         /* Attribute name */
     265             :         struct xattr_name *kname;
     266             :         unsigned int flags;
     267             : };
     268             : 
     269             : 
     270             : ssize_t do_getxattr(struct mnt_idmap *idmap,
     271             :                     struct dentry *d,
     272             :                     struct xattr_ctx *ctx);
     273             : 
     274             : int setxattr_copy(const char __user *name, struct xattr_ctx *ctx);
     275             : int do_setxattr(struct mnt_idmap *idmap, struct dentry *dentry,
     276             :                 struct xattr_ctx *ctx);
     277             : int may_write_xattr(struct mnt_idmap *idmap, struct inode *inode);
     278             : 
     279             : #ifdef CONFIG_FS_POSIX_ACL
     280             : int do_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
     281             :                const char *acl_name, const void *kvalue, size_t size);
     282             : ssize_t do_get_acl(struct mnt_idmap *idmap, struct dentry *dentry,
     283             :                    const char *acl_name, void *kvalue, size_t size);
     284             : #else
     285             : static inline int do_set_acl(struct mnt_idmap *idmap,
     286             :                              struct dentry *dentry, const char *acl_name,
     287             :                              const void *kvalue, size_t size)
     288             : {
     289             :         return -EOPNOTSUPP;
     290             : }
     291             : static inline ssize_t do_get_acl(struct mnt_idmap *idmap,
     292             :                                  struct dentry *dentry, const char *acl_name,
     293             :                                  void *kvalue, size_t size)
     294             : {
     295             :         return -EOPNOTSUPP;
     296             : }
     297             : #endif
     298             : 
     299             : ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *pos);
     300             : 
     301             : /*
     302             :  * fs/attr.c
     303             :  */
     304             : struct mnt_idmap *alloc_mnt_idmap(struct user_namespace *mnt_userns);
     305             : struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap);
     306             : void mnt_idmap_put(struct mnt_idmap *idmap);

Generated by: LCOV version 1.14