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