Merge tag 'vfs-6.7.fsid' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[linux-2.6-microblaze.git] / fs / overlayfs / super.c
index 17864a8..a0967bb 100644 (file)
@@ -445,68 +445,6 @@ static bool ovl_workdir_ok(struct dentry *workdir, struct dentry *upperdir)
        return ok;
 }
 
-static int ovl_own_xattr_get(const struct xattr_handler *handler,
-                            struct dentry *dentry, struct inode *inode,
-                            const char *name, void *buffer, size_t size)
-{
-       return -EOPNOTSUPP;
-}
-
-static int ovl_own_xattr_set(const struct xattr_handler *handler,
-                            struct mnt_idmap *idmap,
-                            struct dentry *dentry, struct inode *inode,
-                            const char *name, const void *value,
-                            size_t size, int flags)
-{
-       return -EOPNOTSUPP;
-}
-
-static int ovl_other_xattr_get(const struct xattr_handler *handler,
-                              struct dentry *dentry, struct inode *inode,
-                              const char *name, void *buffer, size_t size)
-{
-       return ovl_xattr_get(dentry, inode, name, buffer, size);
-}
-
-static int ovl_other_xattr_set(const struct xattr_handler *handler,
-                              struct mnt_idmap *idmap,
-                              struct dentry *dentry, struct inode *inode,
-                              const char *name, const void *value,
-                              size_t size, int flags)
-{
-       return ovl_xattr_set(dentry, inode, name, value, size, flags);
-}
-
-static const struct xattr_handler ovl_own_trusted_xattr_handler = {
-       .prefix = OVL_XATTR_TRUSTED_PREFIX,
-       .get = ovl_own_xattr_get,
-       .set = ovl_own_xattr_set,
-};
-
-static const struct xattr_handler ovl_own_user_xattr_handler = {
-       .prefix = OVL_XATTR_USER_PREFIX,
-       .get = ovl_own_xattr_get,
-       .set = ovl_own_xattr_set,
-};
-
-static const struct xattr_handler ovl_other_xattr_handler = {
-       .prefix = "", /* catch all */
-       .get = ovl_other_xattr_get,
-       .set = ovl_other_xattr_set,
-};
-
-static const struct xattr_handler * const ovl_trusted_xattr_handlers[] = {
-       &ovl_own_trusted_xattr_handler,
-       &ovl_other_xattr_handler,
-       NULL
-};
-
-static const struct xattr_handler * const ovl_user_xattr_handlers[] = {
-       &ovl_own_user_xattr_handler,
-       &ovl_other_xattr_handler,
-       NULL
-};
-
 static int ovl_setup_trap(struct super_block *sb, struct dentry *dir,
                          struct inode **ptrap, const char *name)
 {
@@ -647,7 +585,7 @@ static int ovl_check_rename_whiteout(struct ovl_fs *ofs)
        if (IS_ERR(whiteout))
                goto cleanup_temp;
 
-       err = ovl_is_whiteout(whiteout);
+       err = ovl_upper_is_whiteout(ofs, whiteout);
 
        /* Best effort cleanup of whiteout and temp file */
        if (err)
@@ -887,15 +825,20 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs,
 {
        struct vfsmount *mnt = ovl_upper_mnt(ofs);
        struct dentry *indexdir;
+       struct dentry *origin = ovl_lowerstack(oe)->dentry;
+       const struct ovl_fh *fh;
        int err;
 
+       fh = ovl_get_origin_fh(ofs, origin);
+       if (IS_ERR(fh))
+               return PTR_ERR(fh);
+
        err = mnt_want_write(mnt);
        if (err)
-               return err;
+               goto out_free_fh;
 
        /* Verify lower root is upper root origin */
-       err = ovl_verify_origin(ofs, upperpath->dentry,
-                               ovl_lowerstack(oe)->dentry, true);
+       err = ovl_verify_origin_fh(ofs, upperpath->dentry, fh, true);
        if (err) {
                pr_err("failed to verify upper root origin\n");
                goto out;
@@ -927,9 +870,10 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs,
                 * directory entries.
                 */
                if (ovl_check_origin_xattr(ofs, ofs->indexdir)) {
-                       err = ovl_verify_set_fh(ofs, ofs->indexdir,
-                                               OVL_XATTR_ORIGIN,
-                                               upperpath->dentry, true, false);
+                       err = ovl_verify_origin_xattr(ofs, ofs->indexdir,
+                                                     OVL_XATTR_ORIGIN,
+                                                     upperpath->dentry, true,
+                                                     false);
                        if (err)
                                pr_err("failed to verify index dir 'origin' xattr\n");
                }
@@ -947,6 +891,8 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs,
 
 out:
        mnt_drop_write(mnt);
+out_free_fh:
+       kfree(fh);
        return err;
 }
 
@@ -1382,8 +1328,11 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc)
        ofs->layers = layers;
        /*
         * Layer 0 is reserved for upper even if there's no upper.
-        * For consistency, config.lowerdirs[0] is NULL.
+        * config.lowerdirs[0] is used for storing the user provided colon
+        * separated lowerdir string.
         */
+       ofs->config.lowerdirs[0] = ctx->lowerdir_all;
+       ctx->lowerdir_all = NULL;
        ofs->numlayer = 1;
 
        sb->s_stack_depth = 0;
@@ -1493,8 +1442,7 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc)
        cap_lower(cred->cap_effective, CAP_SYS_RESOURCE);
 
        sb->s_magic = OVERLAYFS_SUPER_MAGIC;
-       sb->s_xattr = ofs->config.userxattr ? ovl_user_xattr_handlers :
-               ovl_trusted_xattr_handlers;
+       sb->s_xattr = ovl_xattr_handlers(ofs);
        sb->s_fs_info = ofs;
 #ifdef CONFIG_FS_POSIX_ACL
        sb->s_flags |= SB_POSIXACL;