root/fs/overlayfs/overlayfs.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ovl_do_rmdir
  2. ovl_do_unlink
  3. ovl_do_link
  4. ovl_do_create
  5. ovl_do_mkdir
  6. ovl_do_mknod
  7. ovl_do_symlink
  8. ovl_do_setxattr
  9. ovl_do_removexattr
  10. ovl_do_rename
  11. ovl_do_whiteout
  12. ovl_do_tmpfile
  13. ovl_open_flags_need_copy_up
  14. ovl_is_impuredir
  15. ovl_xino_bits
  16. ovl_inode_lock
  17. ovl_inode_unlock
  18. ovl_verify_origin
  19. ovl_verify_upper
  20. ovl_copyattr
  21. ovl_copyflags

   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 enum ovl_path_type {
  13         __OVL_PATH_UPPER        = (1 << 0),
  14         __OVL_PATH_MERGE        = (1 << 1),
  15         __OVL_PATH_ORIGIN       = (1 << 2),
  16 };
  17 
  18 #define OVL_TYPE_UPPER(type)    ((type) & __OVL_PATH_UPPER)
  19 #define OVL_TYPE_MERGE(type)    ((type) & __OVL_PATH_MERGE)
  20 #define OVL_TYPE_ORIGIN(type)   ((type) & __OVL_PATH_ORIGIN)
  21 
  22 #define OVL_XATTR_PREFIX XATTR_TRUSTED_PREFIX "overlay."
  23 #define OVL_XATTR_OPAQUE OVL_XATTR_PREFIX "opaque"
  24 #define OVL_XATTR_REDIRECT OVL_XATTR_PREFIX "redirect"
  25 #define OVL_XATTR_ORIGIN OVL_XATTR_PREFIX "origin"
  26 #define OVL_XATTR_IMPURE OVL_XATTR_PREFIX "impure"
  27 #define OVL_XATTR_NLINK OVL_XATTR_PREFIX "nlink"
  28 #define OVL_XATTR_UPPER OVL_XATTR_PREFIX "upper"
  29 #define OVL_XATTR_METACOPY OVL_XATTR_PREFIX "metacopy"
  30 
  31 enum ovl_inode_flag {
  32         /* Pure upper dir that may contain non pure upper entries */
  33         OVL_IMPURE,
  34         /* Non-merge dir that may contain whiteout entries */
  35         OVL_WHITEOUTS,
  36         OVL_INDEX,
  37         OVL_UPPERDATA,
  38         /* Inode number will remain constant over copy up. */
  39         OVL_CONST_INO,
  40 };
  41 
  42 enum ovl_entry_flag {
  43         OVL_E_UPPER_ALIAS,
  44         OVL_E_OPAQUE,
  45         OVL_E_CONNECTED,
  46 };
  47 
  48 /*
  49  * The tuple (fh,uuid) is a universal unique identifier for a copy up origin,
  50  * where:
  51  * origin.fh    - exported file handle of the lower file
  52  * origin.uuid  - uuid of the lower filesystem
  53  */
  54 #define OVL_FH_VERSION  0
  55 #define OVL_FH_MAGIC    0xfb
  56 
  57 /* CPU byte order required for fid decoding:  */
  58 #define OVL_FH_FLAG_BIG_ENDIAN  (1 << 0)
  59 #define OVL_FH_FLAG_ANY_ENDIAN  (1 << 1)
  60 /* Is the real inode encoded in fid an upper inode? */
  61 #define OVL_FH_FLAG_PATH_UPPER  (1 << 2)
  62 
  63 #define OVL_FH_FLAG_ALL (OVL_FH_FLAG_BIG_ENDIAN | OVL_FH_FLAG_ANY_ENDIAN | \
  64                          OVL_FH_FLAG_PATH_UPPER)
  65 
  66 #if defined(__LITTLE_ENDIAN)
  67 #define OVL_FH_FLAG_CPU_ENDIAN 0
  68 #elif defined(__BIG_ENDIAN)
  69 #define OVL_FH_FLAG_CPU_ENDIAN OVL_FH_FLAG_BIG_ENDIAN
  70 #else
  71 #error Endianness not defined
  72 #endif
  73 
  74 /* The type returned by overlay exportfs ops when encoding an ovl_fh handle */
  75 #define OVL_FILEID      0xfb
  76 
  77 /* On-disk and in-memeory format for redirect by file handle */
  78 struct ovl_fh {
  79         u8 version;     /* 0 */
  80         u8 magic;       /* 0xfb */
  81         u8 len;         /* size of this header + size of fid */
  82         u8 flags;       /* OVL_FH_FLAG_* */
  83         u8 type;        /* fid_type of fid */
  84         uuid_t uuid;    /* uuid of filesystem */
  85         u8 fid[0];      /* file identifier */
  86 } __packed;
  87 
  88 static inline int ovl_do_rmdir(struct inode *dir, struct dentry *dentry)
  89 {
  90         int err = vfs_rmdir(dir, dentry);
  91 
  92         pr_debug("rmdir(%pd2) = %i\n", dentry, err);
  93         return err;
  94 }
  95 
  96 static inline int ovl_do_unlink(struct inode *dir, struct dentry *dentry)
  97 {
  98         int err = vfs_unlink(dir, dentry, NULL);
  99 
 100         pr_debug("unlink(%pd2) = %i\n", dentry, err);
 101         return err;
 102 }
 103 
 104 static inline int ovl_do_link(struct dentry *old_dentry, struct inode *dir,
 105                               struct dentry *new_dentry)
 106 {
 107         int err = vfs_link(old_dentry, dir, new_dentry, NULL);
 108 
 109         pr_debug("link(%pd2, %pd2) = %i\n", old_dentry, new_dentry, err);
 110         return err;
 111 }
 112 
 113 static inline int ovl_do_create(struct inode *dir, struct dentry *dentry,
 114                                 umode_t mode)
 115 {
 116         int err = vfs_create(dir, dentry, mode, true);
 117 
 118         pr_debug("create(%pd2, 0%o) = %i\n", dentry, mode, err);
 119         return err;
 120 }
 121 
 122 static inline int ovl_do_mkdir(struct inode *dir, struct dentry *dentry,
 123                                umode_t mode)
 124 {
 125         int err = vfs_mkdir(dir, dentry, mode);
 126         pr_debug("mkdir(%pd2, 0%o) = %i\n", dentry, mode, err);
 127         return err;
 128 }
 129 
 130 static inline int ovl_do_mknod(struct inode *dir, struct dentry *dentry,
 131                                umode_t mode, dev_t dev)
 132 {
 133         int err = vfs_mknod(dir, dentry, mode, dev);
 134 
 135         pr_debug("mknod(%pd2, 0%o, 0%o) = %i\n", dentry, mode, dev, err);
 136         return err;
 137 }
 138 
 139 static inline int ovl_do_symlink(struct inode *dir, struct dentry *dentry,
 140                                  const char *oldname)
 141 {
 142         int err = vfs_symlink(dir, dentry, oldname);
 143 
 144         pr_debug("symlink(\"%s\", %pd2) = %i\n", oldname, dentry, err);
 145         return err;
 146 }
 147 
 148 static inline int ovl_do_setxattr(struct dentry *dentry, const char *name,
 149                                   const void *value, size_t size, int flags)
 150 {
 151         int err = vfs_setxattr(dentry, name, value, size, flags);
 152         pr_debug("setxattr(%pd2, \"%s\", \"%*pE\", %zu, 0x%x) = %i\n",
 153                  dentry, name, min((int)size, 48), value, size, flags, err);
 154         return err;
 155 }
 156 
 157 static inline int ovl_do_removexattr(struct dentry *dentry, const char *name)
 158 {
 159         int err = vfs_removexattr(dentry, name);
 160         pr_debug("removexattr(%pd2, \"%s\") = %i\n", dentry, name, err);
 161         return err;
 162 }
 163 
 164 static inline int ovl_do_rename(struct inode *olddir, struct dentry *olddentry,
 165                                 struct inode *newdir, struct dentry *newdentry,
 166                                 unsigned int flags)
 167 {
 168         int err;
 169 
 170         pr_debug("rename(%pd2, %pd2, 0x%x)\n", olddentry, newdentry, flags);
 171         err = vfs_rename(olddir, olddentry, newdir, newdentry, NULL, flags);
 172         if (err) {
 173                 pr_debug("...rename(%pd2, %pd2, ...) = %i\n",
 174                          olddentry, newdentry, err);
 175         }
 176         return err;
 177 }
 178 
 179 static inline int ovl_do_whiteout(struct inode *dir, struct dentry *dentry)
 180 {
 181         int err = vfs_whiteout(dir, dentry);
 182         pr_debug("whiteout(%pd2) = %i\n", dentry, err);
 183         return err;
 184 }
 185 
 186 static inline struct dentry *ovl_do_tmpfile(struct dentry *dentry, umode_t mode)
 187 {
 188         struct dentry *ret = vfs_tmpfile(dentry, mode, 0);
 189         int err = PTR_ERR_OR_ZERO(ret);
 190 
 191         pr_debug("tmpfile(%pd2, 0%o) = %i\n", dentry, mode, err);
 192         return ret;
 193 }
 194 
 195 static inline bool ovl_open_flags_need_copy_up(int flags)
 196 {
 197         if (!flags)
 198                 return false;
 199 
 200         return ((OPEN_FMODE(flags) & FMODE_WRITE) || (flags & O_TRUNC));
 201 }
 202 
 203 /* util.c */
 204 int ovl_want_write(struct dentry *dentry);
 205 void ovl_drop_write(struct dentry *dentry);
 206 struct dentry *ovl_workdir(struct dentry *dentry);
 207 const struct cred *ovl_override_creds(struct super_block *sb);
 208 struct super_block *ovl_same_sb(struct super_block *sb);
 209 int ovl_can_decode_fh(struct super_block *sb);
 210 struct dentry *ovl_indexdir(struct super_block *sb);
 211 bool ovl_index_all(struct super_block *sb);
 212 bool ovl_verify_lower(struct super_block *sb);
 213 struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
 214 bool ovl_dentry_remote(struct dentry *dentry);
 215 bool ovl_dentry_weird(struct dentry *dentry);
 216 enum ovl_path_type ovl_path_type(struct dentry *dentry);
 217 void ovl_path_upper(struct dentry *dentry, struct path *path);
 218 void ovl_path_lower(struct dentry *dentry, struct path *path);
 219 void ovl_path_lowerdata(struct dentry *dentry, struct path *path);
 220 enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path);
 221 struct dentry *ovl_dentry_upper(struct dentry *dentry);
 222 struct dentry *ovl_dentry_lower(struct dentry *dentry);
 223 struct dentry *ovl_dentry_lowerdata(struct dentry *dentry);
 224 struct ovl_layer *ovl_layer_lower(struct dentry *dentry);
 225 struct dentry *ovl_dentry_real(struct dentry *dentry);
 226 struct dentry *ovl_i_dentry_upper(struct inode *inode);
 227 struct inode *ovl_inode_upper(struct inode *inode);
 228 struct inode *ovl_inode_lower(struct inode *inode);
 229 struct inode *ovl_inode_lowerdata(struct inode *inode);
 230 struct inode *ovl_inode_real(struct inode *inode);
 231 struct inode *ovl_inode_realdata(struct inode *inode);
 232 struct ovl_dir_cache *ovl_dir_cache(struct inode *inode);
 233 void ovl_set_dir_cache(struct inode *inode, struct ovl_dir_cache *cache);
 234 void ovl_dentry_set_flag(unsigned long flag, struct dentry *dentry);
 235 void ovl_dentry_clear_flag(unsigned long flag, struct dentry *dentry);
 236 bool ovl_dentry_test_flag(unsigned long flag, struct dentry *dentry);
 237 bool ovl_dentry_is_opaque(struct dentry *dentry);
 238 bool ovl_dentry_is_whiteout(struct dentry *dentry);
 239 void ovl_dentry_set_opaque(struct dentry *dentry);
 240 bool ovl_dentry_has_upper_alias(struct dentry *dentry);
 241 void ovl_dentry_set_upper_alias(struct dentry *dentry);
 242 bool ovl_dentry_needs_data_copy_up(struct dentry *dentry, int flags);
 243 bool ovl_dentry_needs_data_copy_up_locked(struct dentry *dentry, int flags);
 244 bool ovl_has_upperdata(struct inode *inode);
 245 void ovl_set_upperdata(struct inode *inode);
 246 bool ovl_redirect_dir(struct super_block *sb);
 247 const char *ovl_dentry_get_redirect(struct dentry *dentry);
 248 void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect);
 249 void ovl_inode_init(struct inode *inode, struct dentry *upperdentry,
 250                     struct dentry *lowerdentry, struct dentry *lowerdata);
 251 void ovl_inode_update(struct inode *inode, struct dentry *upperdentry);
 252 void ovl_dir_modified(struct dentry *dentry, bool impurity);
 253 u64 ovl_dentry_version_get(struct dentry *dentry);
 254 bool ovl_is_whiteout(struct dentry *dentry);
 255 struct file *ovl_path_open(struct path *path, int flags);
 256 int ovl_copy_up_start(struct dentry *dentry, int flags);
 257 void ovl_copy_up_end(struct dentry *dentry);
 258 bool ovl_already_copied_up(struct dentry *dentry, int flags);
 259 bool ovl_check_origin_xattr(struct dentry *dentry);
 260 bool ovl_check_dir_xattr(struct dentry *dentry, const char *name);
 261 int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry,
 262                        const char *name, const void *value, size_t size,
 263                        int xerr);
 264 int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry);
 265 void ovl_set_flag(unsigned long flag, struct inode *inode);
 266 void ovl_clear_flag(unsigned long flag, struct inode *inode);
 267 bool ovl_test_flag(unsigned long flag, struct inode *inode);
 268 bool ovl_inuse_trylock(struct dentry *dentry);
 269 void ovl_inuse_unlock(struct dentry *dentry);
 270 bool ovl_is_inuse(struct dentry *dentry);
 271 bool ovl_need_index(struct dentry *dentry);
 272 int ovl_nlink_start(struct dentry *dentry);
 273 void ovl_nlink_end(struct dentry *dentry);
 274 int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir);
 275 int ovl_check_metacopy_xattr(struct dentry *dentry);
 276 bool ovl_is_metacopy_dentry(struct dentry *dentry);
 277 char *ovl_get_redirect_xattr(struct dentry *dentry, int padding);
 278 ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
 279                      size_t padding);
 280 
 281 static inline bool ovl_is_impuredir(struct dentry *dentry)
 282 {
 283         return ovl_check_dir_xattr(dentry, OVL_XATTR_IMPURE);
 284 }
 285 
 286 static inline unsigned int ovl_xino_bits(struct super_block *sb)
 287 {
 288         struct ovl_fs *ofs = sb->s_fs_info;
 289 
 290         return ofs->xino_bits;
 291 }
 292 
 293 static inline int ovl_inode_lock(struct inode *inode)
 294 {
 295         return mutex_lock_interruptible(&OVL_I(inode)->lock);
 296 }
 297 
 298 static inline void ovl_inode_unlock(struct inode *inode)
 299 {
 300         mutex_unlock(&OVL_I(inode)->lock);
 301 }
 302 
 303 
 304 /* namei.c */
 305 int ovl_check_fh_len(struct ovl_fh *fh, int fh_len);
 306 struct dentry *ovl_decode_real_fh(struct ovl_fh *fh, struct vfsmount *mnt,
 307                                   bool connected);
 308 int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, bool connected,
 309                         struct dentry *upperdentry, struct ovl_path **stackp);
 310 int ovl_verify_set_fh(struct dentry *dentry, const char *name,
 311                       struct dentry *real, bool is_upper, bool set);
 312 struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index);
 313 int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index);
 314 int ovl_get_index_name(struct dentry *origin, struct qstr *name);
 315 struct dentry *ovl_get_index_fh(struct ovl_fs *ofs, struct ovl_fh *fh);
 316 struct dentry *ovl_lookup_index(struct ovl_fs *ofs, struct dentry *upper,
 317                                 struct dentry *origin, bool verify);
 318 int ovl_path_next(int idx, struct dentry *dentry, struct path *path);
 319 struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
 320                           unsigned int flags);
 321 bool ovl_lower_positive(struct dentry *dentry);
 322 
 323 static inline int ovl_verify_origin(struct dentry *upper,
 324                                     struct dentry *origin, bool set)
 325 {
 326         return ovl_verify_set_fh(upper, OVL_XATTR_ORIGIN, origin, false, set);
 327 }
 328 
 329 static inline int ovl_verify_upper(struct dentry *index,
 330                                     struct dentry *upper, bool set)
 331 {
 332         return ovl_verify_set_fh(index, OVL_XATTR_UPPER, upper, true, set);
 333 }
 334 
 335 /* readdir.c */
 336 extern const struct file_operations ovl_dir_operations;
 337 int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list);
 338 void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list);
 339 void ovl_cache_free(struct list_head *list);
 340 void ovl_dir_cache_free(struct inode *inode);
 341 int ovl_check_d_type_supported(struct path *realpath);
 342 void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt,
 343                          struct dentry *dentry, int level);
 344 int ovl_indexdir_cleanup(struct ovl_fs *ofs);
 345 
 346 /* inode.c */
 347 int ovl_set_nlink_upper(struct dentry *dentry);
 348 int ovl_set_nlink_lower(struct dentry *dentry);
 349 unsigned int ovl_get_nlink(struct dentry *lowerdentry,
 350                            struct dentry *upperdentry,
 351                            unsigned int fallback);
 352 int ovl_setattr(struct dentry *dentry, struct iattr *attr);
 353 int ovl_getattr(const struct path *path, struct kstat *stat,
 354                 u32 request_mask, unsigned int flags);
 355 int ovl_permission(struct inode *inode, int mask);
 356 int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
 357                   const void *value, size_t size, int flags);
 358 int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
 359                   void *value, size_t size);
 360 ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
 361 struct posix_acl *ovl_get_acl(struct inode *inode, int type);
 362 int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags);
 363 bool ovl_is_private_xattr(const char *name);
 364 
 365 struct ovl_inode_params {
 366         struct inode *newinode;
 367         struct dentry *upperdentry;
 368         struct ovl_path *lowerpath;
 369         struct dentry *index;
 370         unsigned int numlower;
 371         char *redirect;
 372         struct dentry *lowerdata;
 373 };
 374 struct inode *ovl_new_inode(struct super_block *sb, umode_t mode, dev_t rdev);
 375 struct inode *ovl_lookup_inode(struct super_block *sb, struct dentry *real,
 376                                bool is_upper);
 377 bool ovl_lookup_trap_inode(struct super_block *sb, struct dentry *dir);
 378 struct inode *ovl_get_trap_inode(struct super_block *sb, struct dentry *dir);
 379 struct inode *ovl_get_inode(struct super_block *sb,
 380                             struct ovl_inode_params *oip);
 381 static inline void ovl_copyattr(struct inode *from, struct inode *to)
 382 {
 383         to->i_uid = from->i_uid;
 384         to->i_gid = from->i_gid;
 385         to->i_mode = from->i_mode;
 386         to->i_atime = from->i_atime;
 387         to->i_mtime = from->i_mtime;
 388         to->i_ctime = from->i_ctime;
 389         i_size_write(to, i_size_read(from));
 390 }
 391 
 392 static inline void ovl_copyflags(struct inode *from, struct inode *to)
 393 {
 394         unsigned int mask = S_SYNC | S_IMMUTABLE | S_APPEND | S_NOATIME;
 395 
 396         inode_set_flags(to, from->i_flags & mask, mask);
 397 }
 398 
 399 /* dir.c */
 400 extern const struct inode_operations ovl_dir_inode_operations;
 401 int ovl_cleanup_and_whiteout(struct dentry *workdir, struct inode *dir,
 402                              struct dentry *dentry);
 403 struct ovl_cattr {
 404         dev_t rdev;
 405         umode_t mode;
 406         const char *link;
 407         struct dentry *hardlink;
 408 };
 409 
 410 #define OVL_CATTR(m) (&(struct ovl_cattr) { .mode = (m) })
 411 
 412 struct dentry *ovl_create_real(struct inode *dir, struct dentry *newdentry,
 413                                struct ovl_cattr *attr);
 414 int ovl_cleanup(struct inode *dir, struct dentry *dentry);
 415 struct dentry *ovl_create_temp(struct dentry *workdir, struct ovl_cattr *attr);
 416 
 417 /* file.c */
 418 extern const struct file_operations ovl_file_operations;
 419 
 420 /* copy_up.c */
 421 int ovl_copy_up(struct dentry *dentry);
 422 int ovl_copy_up_with_data(struct dentry *dentry);
 423 int ovl_copy_up_flags(struct dentry *dentry, int flags);
 424 int ovl_maybe_copy_up(struct dentry *dentry, int flags);
 425 int ovl_copy_xattr(struct dentry *old, struct dentry *new);
 426 int ovl_set_attr(struct dentry *upper, struct kstat *stat);
 427 struct ovl_fh *ovl_encode_real_fh(struct dentry *real, bool is_upper);
 428 int ovl_set_origin(struct dentry *dentry, struct dentry *lower,
 429                    struct dentry *upper);
 430 
 431 /* export.c */
 432 extern const struct export_operations ovl_export_operations;

/* [<][>][^][v][top][bottom][index][help] */