LCOV - code coverage report
Current view: top level - fs/overlayfs - overlayfs.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 69 99 69.7 %
Date: 2021-04-22 12:43:58 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-only */
       2             : /*
       3             :  *
       4             :  * Copyright (C) 2011 Novell Inc.
       5             :  */
       6             : 
       7             : #include <linux/kernel.h>
       8             : #include <linux/uuid.h>
       9             : #include <linux/fs.h>
      10             : #include "ovl_entry.h"
      11             : 
      12             : #undef pr_fmt
      13             : #define pr_fmt(fmt) "overlayfs: " fmt
      14             : 
      15             : enum ovl_path_type {
      16             :         __OVL_PATH_UPPER        = (1 << 0),
      17             :         __OVL_PATH_MERGE        = (1 << 1),
      18             :         __OVL_PATH_ORIGIN       = (1 << 2),
      19             : };
      20             : 
      21             : #define OVL_TYPE_UPPER(type)    ((type) & __OVL_PATH_UPPER)
      22             : #define OVL_TYPE_MERGE(type)    ((type) & __OVL_PATH_MERGE)
      23             : #define OVL_TYPE_ORIGIN(type)   ((type) & __OVL_PATH_ORIGIN)
      24             : 
      25             : #define OVL_XATTR_NAMESPACE "overlay."
      26             : #define OVL_XATTR_TRUSTED_PREFIX XATTR_TRUSTED_PREFIX OVL_XATTR_NAMESPACE
      27             : #define OVL_XATTR_USER_PREFIX XATTR_USER_PREFIX OVL_XATTR_NAMESPACE
      28             : 
      29             : enum ovl_xattr {
      30             :         OVL_XATTR_OPAQUE,
      31             :         OVL_XATTR_REDIRECT,
      32             :         OVL_XATTR_ORIGIN,
      33             :         OVL_XATTR_IMPURE,
      34             :         OVL_XATTR_NLINK,
      35             :         OVL_XATTR_UPPER,
      36             :         OVL_XATTR_METACOPY,
      37             : };
      38             : 
      39             : enum ovl_inode_flag {
      40             :         /* Pure upper dir that may contain non pure upper entries */
      41             :         OVL_IMPURE,
      42             :         /* Non-merge dir that may contain whiteout entries */
      43             :         OVL_WHITEOUTS,
      44             :         OVL_INDEX,
      45             :         OVL_UPPERDATA,
      46             :         /* Inode number will remain constant over copy up. */
      47             :         OVL_CONST_INO,
      48             : };
      49             : 
      50             : enum ovl_entry_flag {
      51             :         OVL_E_UPPER_ALIAS,
      52             :         OVL_E_OPAQUE,
      53             :         OVL_E_CONNECTED,
      54             : };
      55             : 
      56             : enum {
      57             :         OVL_XINO_OFF,
      58             :         OVL_XINO_AUTO,
      59             :         OVL_XINO_ON,
      60             : };
      61             : 
      62             : /*
      63             :  * The tuple (fh,uuid) is a universal unique identifier for a copy up origin,
      64             :  * where:
      65             :  * origin.fh    - exported file handle of the lower file
      66             :  * origin.uuid  - uuid of the lower filesystem
      67             :  */
      68             : #define OVL_FH_VERSION  0
      69             : #define OVL_FH_MAGIC    0xfb
      70             : 
      71             : /* CPU byte order required for fid decoding:  */
      72             : #define OVL_FH_FLAG_BIG_ENDIAN  (1 << 0)
      73             : #define OVL_FH_FLAG_ANY_ENDIAN  (1 << 1)
      74             : /* Is the real inode encoded in fid an upper inode? */
      75             : #define OVL_FH_FLAG_PATH_UPPER  (1 << 2)
      76             : 
      77             : #define OVL_FH_FLAG_ALL (OVL_FH_FLAG_BIG_ENDIAN | OVL_FH_FLAG_ANY_ENDIAN | \
      78             :                          OVL_FH_FLAG_PATH_UPPER)
      79             : 
      80             : #if defined(__LITTLE_ENDIAN)
      81             : #define OVL_FH_FLAG_CPU_ENDIAN 0
      82             : #elif defined(__BIG_ENDIAN)
      83             : #define OVL_FH_FLAG_CPU_ENDIAN OVL_FH_FLAG_BIG_ENDIAN
      84             : #else
      85             : #error Endianness not defined
      86             : #endif
      87             : 
      88             : /* The type used to be returned by overlay exportfs for misaligned fid */
      89             : #define OVL_FILEID_V0   0xfb
      90             : /* The type returned by overlay exportfs for 32bit aligned fid */
      91             : #define OVL_FILEID_V1   0xf8
      92             : 
      93             : /* On-disk format for "origin" file handle */
      94             : struct ovl_fb {
      95             :         u8 version;     /* 0 */
      96             :         u8 magic;       /* 0xfb */
      97             :         u8 len;         /* size of this header + size of fid */
      98             :         u8 flags;       /* OVL_FH_FLAG_* */
      99             :         u8 type;        /* fid_type of fid */
     100             :         uuid_t uuid;    /* uuid of filesystem */
     101             :         u32 fid[];      /* file identifier should be 32bit aligned in-memory */
     102             : } __packed;
     103             : 
     104             : /* In-memory and on-wire format for overlay file handle */
     105             : struct ovl_fh {
     106             :         u8 padding[3];  /* make sure fb.fid is 32bit aligned */
     107             :         union {
     108             :                 struct ovl_fb fb;
     109             :                 u8 buf[0];
     110             :         };
     111             : } __packed;
     112             : 
     113             : #define OVL_FH_WIRE_OFFSET      offsetof(struct ovl_fh, fb)
     114             : #define OVL_FH_LEN(fh)          (OVL_FH_WIRE_OFFSET + (fh)->fb.len)
     115             : #define OVL_FH_FID_OFFSET       (OVL_FH_WIRE_OFFSET + \
     116             :                                  offsetof(struct ovl_fb, fid))
     117             : 
     118             : extern const char *const ovl_xattr_table[][2];
     119          60 : static inline const char *ovl_xattr(struct ovl_fs *ofs, enum ovl_xattr ox)
     120             : {
     121          14 :         return ovl_xattr_table[ox][ofs->config.userxattr];
     122             : }
     123             : 
     124           0 : static inline int ovl_do_rmdir(struct inode *dir, struct dentry *dentry)
     125             : {
     126           0 :         int err = vfs_rmdir(&init_user_ns, dir, dentry);
     127             : 
     128           0 :         pr_debug("rmdir(%pd2) = %i\n", dentry, err);
     129           0 :         return err;
     130             : }
     131             : 
     132           4 : static inline int ovl_do_unlink(struct inode *dir, struct dentry *dentry)
     133             : {
     134           4 :         int err = vfs_unlink(&init_user_ns, dir, dentry, NULL);
     135             : 
     136           4 :         pr_debug("unlink(%pd2) = %i\n", dentry, err);
     137           4 :         return err;
     138             : }
     139             : 
     140           3 : static inline int ovl_do_link(struct dentry *old_dentry, struct inode *dir,
     141             :                               struct dentry *new_dentry)
     142             : {
     143           3 :         int err = vfs_link(old_dentry, &init_user_ns, dir, new_dentry, NULL);
     144             : 
     145           3 :         pr_debug("link(%pd2, %pd2) = %i\n", old_dentry, new_dentry, err);
     146           3 :         return err;
     147             : }
     148             : 
     149           2 : static inline int ovl_do_create(struct inode *dir, struct dentry *dentry,
     150             :                                 umode_t mode)
     151             : {
     152           2 :         int err = vfs_create(&init_user_ns, dir, dentry, mode, true);
     153             : 
     154           2 :         pr_debug("create(%pd2, 0%o) = %i\n", dentry, mode, err);
     155           2 :         return err;
     156             : }
     157             : 
     158           3 : static inline int ovl_do_mkdir(struct inode *dir, struct dentry *dentry,
     159             :                                umode_t mode)
     160             : {
     161           3 :         int err = vfs_mkdir(&init_user_ns, dir, dentry, mode);
     162           3 :         pr_debug("mkdir(%pd2, 0%o) = %i\n", dentry, mode, err);
     163           3 :         return err;
     164             : }
     165             : 
     166           0 : static inline int ovl_do_mknod(struct inode *dir, struct dentry *dentry,
     167             :                                umode_t mode, dev_t dev)
     168             : {
     169           0 :         int err = vfs_mknod(&init_user_ns, dir, dentry, mode, dev);
     170             : 
     171           0 :         pr_debug("mknod(%pd2, 0%o, 0%o) = %i\n", dentry, mode, dev, err);
     172           0 :         return err;
     173             : }
     174             : 
     175           0 : static inline int ovl_do_symlink(struct inode *dir, struct dentry *dentry,
     176             :                                  const char *oldname)
     177             : {
     178           0 :         int err = vfs_symlink(&init_user_ns, dir, dentry, oldname);
     179             : 
     180           0 :         pr_debug("symlink(\"%s\", %pd2) = %i\n", oldname, dentry, err);
     181           0 :         return err;
     182             : }
     183             : 
     184          46 : static inline ssize_t ovl_do_getxattr(struct ovl_fs *ofs, struct dentry *dentry,
     185             :                                       enum ovl_xattr ox, void *value,
     186             :                                       size_t size)
     187             : {
     188          46 :         const char *name = ovl_xattr(ofs, ox);
     189          46 :         return vfs_getxattr(&init_user_ns, dentry, name, value, size);
     190             : }
     191             : 
     192          12 : static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
     193             :                                   enum ovl_xattr ox, const void *value,
     194             :                                   size_t size)
     195             : {
     196          12 :         const char *name = ovl_xattr(ofs, ox);
     197          12 :         int err = vfs_setxattr(&init_user_ns, dentry, name, value, size, 0);
     198          12 :         pr_debug("setxattr(%pd2, \"%s\", \"%*pE\", %zu, 0) = %i\n",
     199             :                  dentry, name, min((int)size, 48), value, size, err);
     200          12 :         return err;
     201             : }
     202             : 
     203           2 : static inline int ovl_do_removexattr(struct ovl_fs *ofs, struct dentry *dentry,
     204             :                                      enum ovl_xattr ox)
     205             : {
     206           2 :         const char *name = ovl_xattr(ofs, ox);
     207           2 :         int err = vfs_removexattr(&init_user_ns, dentry, name);
     208           2 :         pr_debug("removexattr(%pd2, \"%s\") = %i\n", dentry, name, err);
     209           2 :         return err;
     210             : }
     211             : 
     212           3 : static inline int ovl_do_rename(struct inode *olddir, struct dentry *olddentry,
     213             :                                 struct inode *newdir, struct dentry *newdentry,
     214             :                                 unsigned int flags)
     215             : {
     216           3 :         int err;
     217           3 :         struct renamedata rd = {
     218             :                 .old_mnt_userns = &init_user_ns,
     219             :                 .old_dir        = olddir,
     220             :                 .old_dentry     = olddentry,
     221             :                 .new_mnt_userns = &init_user_ns,
     222             :                 .new_dir        = newdir,
     223             :                 .new_dentry     = newdentry,
     224             :                 .flags          = flags,
     225             :         };
     226             : 
     227           3 :         pr_debug("rename(%pd2, %pd2, 0x%x)\n", olddentry, newdentry, flags);
     228           3 :         err = vfs_rename(&rd);
     229           3 :         if (err) {
     230             :                 pr_debug("...rename(%pd2, %pd2, ...) = %i\n",
     231             :                          olddentry, newdentry, err);
     232             :         }
     233           3 :         return err;
     234             : }
     235             : 
     236           0 : static inline int ovl_do_whiteout(struct inode *dir, struct dentry *dentry)
     237             : {
     238           0 :         int err = vfs_whiteout(&init_user_ns, dir, dentry);
     239           0 :         pr_debug("whiteout(%pd2) = %i\n", dentry, err);
     240           0 :         return err;
     241             : }
     242             : 
     243           5 : static inline struct dentry *ovl_do_tmpfile(struct dentry *dentry, umode_t mode)
     244             : {
     245           5 :         struct dentry *ret = vfs_tmpfile(&init_user_ns, dentry, mode, 0);
     246           5 :         int err = PTR_ERR_OR_ZERO(ret);
     247             : 
     248           5 :         pr_debug("tmpfile(%pd2, 0%o) = %i\n", dentry, mode, err);
     249           5 :         return ret;
     250             : }
     251             : 
     252          46 : static inline bool ovl_open_flags_need_copy_up(int flags)
     253             : {
     254          46 :         if (!flags)
     255             :                 return false;
     256             : 
     257          54 :         return ((OPEN_FMODE(flags) & FMODE_WRITE) || (flags & O_TRUNC));
     258             : }
     259             : 
     260             : /* util.c */
     261             : int ovl_want_write(struct dentry *dentry);
     262             : void ovl_drop_write(struct dentry *dentry);
     263             : struct dentry *ovl_workdir(struct dentry *dentry);
     264             : const struct cred *ovl_override_creds(struct super_block *sb);
     265             : int ovl_can_decode_fh(struct super_block *sb);
     266             : struct dentry *ovl_indexdir(struct super_block *sb);
     267             : bool ovl_index_all(struct super_block *sb);
     268             : bool ovl_verify_lower(struct super_block *sb);
     269             : struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
     270             : bool ovl_dentry_remote(struct dentry *dentry);
     271             : void ovl_dentry_update_reval(struct dentry *dentry, struct dentry *upperdentry,
     272             :                              unsigned int mask);
     273             : bool ovl_dentry_weird(struct dentry *dentry);
     274             : enum ovl_path_type ovl_path_type(struct dentry *dentry);
     275             : void ovl_path_upper(struct dentry *dentry, struct path *path);
     276             : void ovl_path_lower(struct dentry *dentry, struct path *path);
     277             : void ovl_path_lowerdata(struct dentry *dentry, struct path *path);
     278             : enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path);
     279             : struct dentry *ovl_dentry_upper(struct dentry *dentry);
     280             : struct dentry *ovl_dentry_lower(struct dentry *dentry);
     281             : struct dentry *ovl_dentry_lowerdata(struct dentry *dentry);
     282             : const struct ovl_layer *ovl_layer_lower(struct dentry *dentry);
     283             : struct dentry *ovl_dentry_real(struct dentry *dentry);
     284             : struct dentry *ovl_i_dentry_upper(struct inode *inode);
     285             : struct inode *ovl_inode_upper(struct inode *inode);
     286             : struct inode *ovl_inode_lower(struct inode *inode);
     287             : struct inode *ovl_inode_lowerdata(struct inode *inode);
     288             : struct inode *ovl_inode_real(struct inode *inode);
     289             : struct inode *ovl_inode_realdata(struct inode *inode);
     290             : struct ovl_dir_cache *ovl_dir_cache(struct inode *inode);
     291             : void ovl_set_dir_cache(struct inode *inode, struct ovl_dir_cache *cache);
     292             : void ovl_dentry_set_flag(unsigned long flag, struct dentry *dentry);
     293             : void ovl_dentry_clear_flag(unsigned long flag, struct dentry *dentry);
     294             : bool ovl_dentry_test_flag(unsigned long flag, struct dentry *dentry);
     295             : bool ovl_dentry_is_opaque(struct dentry *dentry);
     296             : bool ovl_dentry_is_whiteout(struct dentry *dentry);
     297             : void ovl_dentry_set_opaque(struct dentry *dentry);
     298             : bool ovl_dentry_has_upper_alias(struct dentry *dentry);
     299             : void ovl_dentry_set_upper_alias(struct dentry *dentry);
     300             : bool ovl_dentry_needs_data_copy_up(struct dentry *dentry, int flags);
     301             : bool ovl_dentry_needs_data_copy_up_locked(struct dentry *dentry, int flags);
     302             : bool ovl_has_upperdata(struct inode *inode);
     303             : void ovl_set_upperdata(struct inode *inode);
     304             : bool ovl_redirect_dir(struct super_block *sb);
     305             : const char *ovl_dentry_get_redirect(struct dentry *dentry);
     306             : void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect);
     307             : void ovl_inode_update(struct inode *inode, struct dentry *upperdentry);
     308             : void ovl_dir_modified(struct dentry *dentry, bool impurity);
     309             : u64 ovl_dentry_version_get(struct dentry *dentry);
     310             : bool ovl_is_whiteout(struct dentry *dentry);
     311             : struct file *ovl_path_open(struct path *path, int flags);
     312             : int ovl_copy_up_start(struct dentry *dentry, int flags);
     313             : void ovl_copy_up_end(struct dentry *dentry);
     314             : bool ovl_already_copied_up(struct dentry *dentry, int flags);
     315             : bool ovl_check_origin_xattr(struct ovl_fs *ofs, struct dentry *dentry);
     316             : bool ovl_check_dir_xattr(struct super_block *sb, struct dentry *dentry,
     317             :                          enum ovl_xattr ox);
     318             : int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry,
     319             :                        enum ovl_xattr ox, const void *value, size_t size,
     320             :                        int xerr);
     321             : int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry);
     322             : void ovl_set_flag(unsigned long flag, struct inode *inode);
     323             : void ovl_clear_flag(unsigned long flag, struct inode *inode);
     324             : bool ovl_test_flag(unsigned long flag, struct inode *inode);
     325             : bool ovl_inuse_trylock(struct dentry *dentry);
     326             : void ovl_inuse_unlock(struct dentry *dentry);
     327             : bool ovl_is_inuse(struct dentry *dentry);
     328             : bool ovl_need_index(struct dentry *dentry);
     329             : int ovl_nlink_start(struct dentry *dentry);
     330             : void ovl_nlink_end(struct dentry *dentry);
     331             : int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir);
     332             : int ovl_check_metacopy_xattr(struct ovl_fs *ofs, struct dentry *dentry);
     333             : bool ovl_is_metacopy_dentry(struct dentry *dentry);
     334             : char *ovl_get_redirect_xattr(struct ovl_fs *ofs, struct dentry *dentry,
     335             :                              int padding);
     336             : int ovl_sync_status(struct ovl_fs *ofs);
     337             : 
     338          16 : static inline bool ovl_is_impuredir(struct super_block *sb,
     339             :                                     struct dentry *dentry)
     340             : {
     341          16 :         return ovl_check_dir_xattr(sb, dentry, OVL_XATTR_IMPURE);
     342             : }
     343             : 
     344             : /*
     345             :  * With xino=auto, we do best effort to keep all inodes on same st_dev and
     346             :  * d_ino consistent with st_ino.
     347             :  * With xino=on, we do the same effort but we warn if we failed.
     348             :  */
     349           0 : static inline bool ovl_xino_warn(struct super_block *sb)
     350             : {
     351           0 :         return OVL_FS(sb)->config.xino == OVL_XINO_ON;
     352             : }
     353             : 
     354             : /* All layers on same fs? */
     355          24 : static inline bool ovl_same_fs(struct super_block *sb)
     356             : {
     357          24 :         return OVL_FS(sb)->xino_mode == 0;
     358             : }
     359             : 
     360             : /* All overlay inodes have same st_dev? */
     361          24 : static inline bool ovl_same_dev(struct super_block *sb)
     362             : {
     363           0 :         return OVL_FS(sb)->xino_mode >= 0;
     364             : }
     365             : 
     366          24 : static inline unsigned int ovl_xino_bits(struct super_block *sb)
     367             : {
     368          24 :         return ovl_same_dev(sb) ? OVL_FS(sb)->xino_mode : 0;
     369             : }
     370             : 
     371           0 : static inline void ovl_inode_lock(struct inode *inode)
     372             : {
     373           0 :         mutex_lock(&OVL_I(inode)->lock);
     374             : }
     375             : 
     376           4 : static inline int ovl_inode_lock_interruptible(struct inode *inode)
     377             : {
     378           4 :         return mutex_lock_interruptible(&OVL_I(inode)->lock);
     379             : }
     380             : 
     381           4 : static inline void ovl_inode_unlock(struct inode *inode)
     382             : {
     383           4 :         mutex_unlock(&OVL_I(inode)->lock);
     384           0 : }
     385             : 
     386             : 
     387             : /* namei.c */
     388             : int ovl_check_fb_len(struct ovl_fb *fb, int fb_len);
     389             : 
     390           0 : static inline int ovl_check_fh_len(struct ovl_fh *fh, int fh_len)
     391             : {
     392           0 :         if (fh_len < sizeof(struct ovl_fh))
     393             :                 return -EINVAL;
     394             : 
     395           0 :         return ovl_check_fb_len(&fh->fb, fh_len - OVL_FH_WIRE_OFFSET);
     396             : }
     397             : 
     398             : struct dentry *ovl_decode_real_fh(struct ovl_fs *ofs, struct ovl_fh *fh,
     399             :                                   struct vfsmount *mnt, bool connected);
     400             : int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, bool connected,
     401             :                         struct dentry *upperdentry, struct ovl_path **stackp);
     402             : int ovl_verify_set_fh(struct ovl_fs *ofs, struct dentry *dentry,
     403             :                       enum ovl_xattr ox, struct dentry *real, bool is_upper,
     404             :                       bool set);
     405             : struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index);
     406             : int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index);
     407             : int ovl_get_index_name(struct ovl_fs *ofs, struct dentry *origin,
     408             :                        struct qstr *name);
     409             : struct dentry *ovl_get_index_fh(struct ovl_fs *ofs, struct ovl_fh *fh);
     410             : struct dentry *ovl_lookup_index(struct ovl_fs *ofs, struct dentry *upper,
     411             :                                 struct dentry *origin, bool verify);
     412             : int ovl_path_next(int idx, struct dentry *dentry, struct path *path);
     413             : struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
     414             :                           unsigned int flags);
     415             : bool ovl_lower_positive(struct dentry *dentry);
     416             : 
     417           0 : static inline int ovl_verify_origin(struct ovl_fs *ofs, struct dentry *upper,
     418             :                                     struct dentry *origin, bool set)
     419             : {
     420           0 :         return ovl_verify_set_fh(ofs, upper, OVL_XATTR_ORIGIN, origin,
     421             :                                  false, set);
     422             : }
     423             : 
     424           0 : static inline int ovl_verify_upper(struct ovl_fs *ofs, struct dentry *index,
     425             :                                    struct dentry *upper, bool set)
     426             : {
     427           0 :         return ovl_verify_set_fh(ofs, index, OVL_XATTR_UPPER, upper, true, set);
     428             : }
     429             : 
     430             : /* readdir.c */
     431             : extern const struct file_operations ovl_dir_operations;
     432             : struct file *ovl_dir_real_file(const struct file *file, bool want_upper);
     433             : int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list);
     434             : void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list);
     435             : void ovl_cache_free(struct list_head *list);
     436             : void ovl_dir_cache_free(struct inode *inode);
     437             : int ovl_check_d_type_supported(struct path *realpath);
     438             : int ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt,
     439             :                         struct dentry *dentry, int level);
     440             : int ovl_indexdir_cleanup(struct ovl_fs *ofs);
     441             : 
     442             : /* inode.c */
     443             : int ovl_set_nlink_upper(struct dentry *dentry);
     444             : int ovl_set_nlink_lower(struct dentry *dentry);
     445             : unsigned int ovl_get_nlink(struct ovl_fs *ofs, struct dentry *lowerdentry,
     446             :                            struct dentry *upperdentry,
     447             :                            unsigned int fallback);
     448             : int ovl_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
     449             :                 struct iattr *attr);
     450             : int ovl_getattr(struct user_namespace *mnt_userns, const struct path *path,
     451             :                 struct kstat *stat, u32 request_mask, unsigned int flags);
     452             : int ovl_permission(struct user_namespace *mnt_userns, struct inode *inode,
     453             :                    int mask);
     454             : int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
     455             :                   const void *value, size_t size, int flags);
     456             : int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
     457             :                   void *value, size_t size);
     458             : ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
     459             : struct posix_acl *ovl_get_acl(struct inode *inode, int type);
     460             : int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags);
     461             : bool ovl_is_private_xattr(struct super_block *sb, const char *name);
     462             : 
     463             : struct ovl_inode_params {
     464             :         struct inode *newinode;
     465             :         struct dentry *upperdentry;
     466             :         struct ovl_path *lowerpath;
     467             :         bool index;
     468             :         unsigned int numlower;
     469             :         char *redirect;
     470             :         struct dentry *lowerdata;
     471             : };
     472             : void ovl_inode_init(struct inode *inode, struct ovl_inode_params *oip,
     473             :                     unsigned long ino, int fsid);
     474             : struct inode *ovl_new_inode(struct super_block *sb, umode_t mode, dev_t rdev);
     475             : struct inode *ovl_lookup_inode(struct super_block *sb, struct dentry *real,
     476             :                                bool is_upper);
     477             : bool ovl_lookup_trap_inode(struct super_block *sb, struct dentry *dir);
     478             : struct inode *ovl_get_trap_inode(struct super_block *sb, struct dentry *dir);
     479             : struct inode *ovl_get_inode(struct super_block *sb,
     480             :                             struct ovl_inode_params *oip);
     481          24 : static inline void ovl_copyattr(struct inode *from, struct inode *to)
     482             : {
     483          24 :         to->i_uid = from->i_uid;
     484          24 :         to->i_gid = from->i_gid;
     485          24 :         to->i_mode = from->i_mode;
     486          24 :         to->i_atime = from->i_atime;
     487          24 :         to->i_mtime = from->i_mtime;
     488          24 :         to->i_ctime = from->i_ctime;
     489          24 :         i_size_write(to, i_size_read(from));
     490          24 : }
     491             : 
     492          24 : static inline void ovl_copyflags(struct inode *from, struct inode *to)
     493             : {
     494          24 :         unsigned int mask = S_SYNC | S_IMMUTABLE | S_APPEND | S_NOATIME;
     495             : 
     496          24 :         inode_set_flags(to, from->i_flags & mask, mask);
     497           0 : }
     498             : 
     499             : /* dir.c */
     500             : extern const struct inode_operations ovl_dir_inode_operations;
     501             : int ovl_cleanup_and_whiteout(struct ovl_fs *ofs, struct inode *dir,
     502             :                              struct dentry *dentry);
     503             : struct ovl_cattr {
     504             :         dev_t rdev;
     505             :         umode_t mode;
     506             :         const char *link;
     507             :         struct dentry *hardlink;
     508             : };
     509             : 
     510             : #define OVL_CATTR(m) (&(struct ovl_cattr) { .mode = (m) })
     511             : 
     512             : struct dentry *ovl_create_real(struct inode *dir, struct dentry *newdentry,
     513             :                                struct ovl_cattr *attr);
     514             : int ovl_cleanup(struct inode *dir, struct dentry *dentry);
     515             : struct dentry *ovl_lookup_temp(struct dentry *workdir);
     516             : struct dentry *ovl_create_temp(struct dentry *workdir, struct ovl_cattr *attr);
     517             : 
     518             : /* file.c */
     519             : extern const struct file_operations ovl_file_operations;
     520             : int __init ovl_aio_request_cache_init(void);
     521             : void ovl_aio_request_cache_destroy(void);
     522             : long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
     523             : long ovl_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
     524             : 
     525             : /* copy_up.c */
     526             : int ovl_copy_up(struct dentry *dentry);
     527             : int ovl_copy_up_with_data(struct dentry *dentry);
     528             : int ovl_maybe_copy_up(struct dentry *dentry, int flags);
     529             : int ovl_copy_xattr(struct super_block *sb, struct dentry *old,
     530             :                    struct dentry *new);
     531             : int ovl_set_attr(struct dentry *upper, struct kstat *stat);
     532             : struct ovl_fh *ovl_encode_real_fh(struct ovl_fs *ofs, struct dentry *real,
     533             :                                   bool is_upper);
     534             : int ovl_set_origin(struct ovl_fs *ofs, struct dentry *dentry,
     535             :                    struct dentry *lower, struct dentry *upper);
     536             : 
     537             : /* export.c */
     538             : extern const struct export_operations ovl_export_operations;

Generated by: LCOV version 1.14