1 /* 2 * 3 * Copyright (C) 2011 Novell Inc. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 as published by 7 * the Free Software Foundation. 8 */ 9 10 #include <linux/kernel.h> 11 12 struct ovl_entry; 13 14 enum ovl_path_type { 15 __OVL_PATH_PURE = (1 << 0), 16 __OVL_PATH_UPPER = (1 << 1), 17 __OVL_PATH_MERGE = (1 << 2), 18 }; 19 20 #define OVL_TYPE_UPPER(type) ((type) & __OVL_PATH_UPPER) 21 #define OVL_TYPE_MERGE(type) ((type) & __OVL_PATH_MERGE) 22 #define OVL_TYPE_PURE_UPPER(type) ((type) & __OVL_PATH_PURE) 23 #define OVL_TYPE_MERGE_OR_LOWER(type) \ 24 (OVL_TYPE_MERGE(type) || !OVL_TYPE_UPPER(type)) 25 26 27 #define OVL_XATTR_PREFIX XATTR_TRUSTED_PREFIX "overlay." 28 #define OVL_XATTR_OPAQUE OVL_XATTR_PREFIX "opaque" 29 30 #define OVL_ISUPPER_MASK 1UL 31 32 static inline int ovl_do_rmdir(struct inode *dir, struct dentry *dentry) 33 { 34 int err = vfs_rmdir(dir, dentry); 35 pr_debug("rmdir(%pd2) = %i\n", dentry, err); 36 return err; 37 } 38 39 static inline int ovl_do_unlink(struct inode *dir, struct dentry *dentry) 40 { 41 int err = vfs_unlink(dir, dentry, NULL); 42 pr_debug("unlink(%pd2) = %i\n", dentry, err); 43 return err; 44 } 45 46 static inline int ovl_do_link(struct dentry *old_dentry, struct inode *dir, 47 struct dentry *new_dentry, bool debug) 48 { 49 int err = vfs_link(old_dentry, dir, new_dentry, NULL); 50 if (debug) { 51 pr_debug("link(%pd2, %pd2) = %i\n", 52 old_dentry, new_dentry, err); 53 } 54 return err; 55 } 56 57 static inline int ovl_do_create(struct inode *dir, struct dentry *dentry, 58 umode_t mode, bool debug) 59 { 60 int err = vfs_create(dir, dentry, mode, true); 61 if (debug) 62 pr_debug("create(%pd2, 0%o) = %i\n", dentry, mode, err); 63 return err; 64 } 65 66 static inline int ovl_do_mkdir(struct inode *dir, struct dentry *dentry, 67 umode_t mode, bool debug) 68 { 69 int err = vfs_mkdir(dir, dentry, mode); 70 if (debug) 71 pr_debug("mkdir(%pd2, 0%o) = %i\n", dentry, mode, err); 72 return err; 73 } 74 75 static inline int ovl_do_mknod(struct inode *dir, struct dentry *dentry, 76 umode_t mode, dev_t dev, bool debug) 77 { 78 int err = vfs_mknod(dir, dentry, mode, dev); 79 if (debug) { 80 pr_debug("mknod(%pd2, 0%o, 0%o) = %i\n", 81 dentry, mode, dev, err); 82 } 83 return err; 84 } 85 86 static inline int ovl_do_symlink(struct inode *dir, struct dentry *dentry, 87 const char *oldname, bool debug) 88 { 89 int err = vfs_symlink(dir, dentry, oldname); 90 if (debug) 91 pr_debug("symlink(\"%s\", %pd2) = %i\n", oldname, dentry, err); 92 return err; 93 } 94 95 static inline int ovl_do_setxattr(struct dentry *dentry, const char *name, 96 const void *value, size_t size, int flags) 97 { 98 int err = vfs_setxattr(dentry, name, value, size, flags); 99 pr_debug("setxattr(%pd2, \"%s\", \"%*s\", 0x%x) = %i\n", 100 dentry, name, (int) size, (char *) value, flags, err); 101 return err; 102 } 103 104 static inline int ovl_do_removexattr(struct dentry *dentry, const char *name) 105 { 106 int err = vfs_removexattr(dentry, name); 107 pr_debug("removexattr(%pd2, \"%s\") = %i\n", dentry, name, err); 108 return err; 109 } 110 111 static inline int ovl_do_rename(struct inode *olddir, struct dentry *olddentry, 112 struct inode *newdir, struct dentry *newdentry, 113 unsigned int flags) 114 { 115 int err; 116 117 pr_debug("rename(%pd2, %pd2, 0x%x)\n", 118 olddentry, newdentry, flags); 119 120 err = vfs_rename(olddir, olddentry, newdir, newdentry, NULL, flags); 121 122 if (err) { 123 pr_debug("...rename(%pd2, %pd2, ...) = %i\n", 124 olddentry, newdentry, err); 125 } 126 return err; 127 } 128 129 static inline int ovl_do_whiteout(struct inode *dir, struct dentry *dentry) 130 { 131 int err = vfs_whiteout(dir, dentry); 132 pr_debug("whiteout(%pd2) = %i\n", dentry, err); 133 return err; 134 } 135 136 static inline struct inode *ovl_inode_real(struct inode *inode, bool *is_upper) 137 { 138 unsigned long x = (unsigned long) READ_ONCE(inode->i_private); 139 140 if (is_upper) 141 *is_upper = x & OVL_ISUPPER_MASK; 142 143 return (struct inode *) (x & ~OVL_ISUPPER_MASK); 144 } 145 146 enum ovl_path_type ovl_path_type(struct dentry *dentry); 147 u64 ovl_dentry_version_get(struct dentry *dentry); 148 void ovl_dentry_version_inc(struct dentry *dentry); 149 void ovl_path_upper(struct dentry *dentry, struct path *path); 150 void ovl_path_lower(struct dentry *dentry, struct path *path); 151 enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path); 152 int ovl_path_next(int idx, struct dentry *dentry, struct path *path); 153 struct dentry *ovl_dentry_upper(struct dentry *dentry); 154 struct dentry *ovl_dentry_lower(struct dentry *dentry); 155 struct dentry *ovl_dentry_real(struct dentry *dentry); 156 struct vfsmount *ovl_entry_mnt_real(struct ovl_entry *oe, struct inode *inode, 157 bool is_upper); 158 struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry); 159 void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache); 160 struct dentry *ovl_workdir(struct dentry *dentry); 161 int ovl_want_write(struct dentry *dentry); 162 void ovl_drop_write(struct dentry *dentry); 163 bool ovl_dentry_is_opaque(struct dentry *dentry); 164 void ovl_dentry_set_opaque(struct dentry *dentry, bool opaque); 165 bool ovl_is_whiteout(struct dentry *dentry); 166 const struct cred *ovl_override_creds(struct super_block *sb); 167 void ovl_dentry_update(struct dentry *dentry, struct dentry *upperdentry); 168 void ovl_inode_update(struct inode *inode, struct inode *upperinode); 169 struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, 170 unsigned int flags); 171 struct file *ovl_path_open(struct path *path, int flags); 172 173 struct dentry *ovl_upper_create(struct dentry *upperdir, struct dentry *dentry, 174 struct kstat *stat, const char *link); 175 176 /* readdir.c */ 177 extern const struct file_operations ovl_dir_operations; 178 int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list); 179 void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list); 180 void ovl_cache_free(struct list_head *list); 181 int ovl_check_d_type_supported(struct path *realpath); 182 void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt, 183 struct dentry *dentry, int level); 184 185 /* inode.c */ 186 int ovl_setattr(struct dentry *dentry, struct iattr *attr); 187 int ovl_permission(struct inode *inode, int mask); 188 int ovl_xattr_set(struct dentry *dentry, const char *name, const void *value, 189 size_t size, int flags); 190 int ovl_xattr_get(struct dentry *dentry, const char *name, 191 void *value, size_t size); 192 ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); 193 struct posix_acl *ovl_get_acl(struct inode *inode, int type); 194 int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags); 195 int ovl_update_time(struct inode *inode, struct timespec *ts, int flags); 196 bool ovl_is_private_xattr(const char *name); 197 198 struct inode *ovl_new_inode(struct super_block *sb, umode_t mode); 199 struct inode *ovl_get_inode(struct super_block *sb, struct inode *realinode); 200 static inline void ovl_copyattr(struct inode *from, struct inode *to) 201 { 202 to->i_uid = from->i_uid; 203 to->i_gid = from->i_gid; 204 to->i_mode = from->i_mode; 205 to->i_atime = from->i_atime; 206 to->i_mtime = from->i_mtime; 207 to->i_ctime = from->i_ctime; 208 } 209 210 /* dir.c */ 211 extern const struct inode_operations ovl_dir_inode_operations; 212 struct dentry *ovl_lookup_temp(struct dentry *workdir, struct dentry *dentry); 213 int ovl_create_real(struct inode *dir, struct dentry *newdentry, 214 struct kstat *stat, const char *link, 215 struct dentry *hardlink, bool debug); 216 void ovl_cleanup(struct inode *dir, struct dentry *dentry); 217 218 /* copy_up.c */ 219 int ovl_copy_up(struct dentry *dentry); 220 int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, 221 struct path *lowerpath, struct kstat *stat); 222 int ovl_copy_xattr(struct dentry *old, struct dentry *new); 223 int ovl_set_attr(struct dentry *upper, struct kstat *stat); 224