]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ovl: remove redundant ofs->indexdir member
authorAmir Goldstein <amir73il@gmail.com>
Sun, 19 Nov 2023 18:55:00 +0000 (20:55 +0200)
committerAmir Goldstein <amir73il@gmail.com>
Mon, 20 Nov 2023 07:49:09 +0000 (09:49 +0200)
When the index feature is disabled, ofs->indexdir is NULL.
When the index feature is enabled, ofs->indexdir has the same value as
ofs->workdir and takes an extra reference.

This makes the code harder to understand when it is not always clear
that ofs->indexdir in one function is the same dentry as ofs->workdir
in another function.

Remove this redundancy, by referencing ofs->workdir directly in index
helpers and by using the ovl_indexdir() accessor in generic code.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
fs/overlayfs/export.c
fs/overlayfs/namei.c
fs/overlayfs/ovl_entry.h
fs/overlayfs/params.c
fs/overlayfs/readdir.c
fs/overlayfs/super.c
fs/overlayfs/util.c

index 7e16bbcad95e631921b5fe5fe97d220dc10fa08a..6909c4a5da561ea3c9017ad522b594e28e4a91ac 100644 (file)
@@ -460,7 +460,7 @@ static struct dentry *ovl_lookup_real_inode(struct super_block *sb,
         * For decoded lower dir file handle, lookup index by origin to check
         * if lower dir was copied up and and/or removed.
         */
-       if (!this && layer->idx && ofs->indexdir && !WARN_ON(!d_is_dir(real))) {
+       if (!this && layer->idx && ovl_indexdir(sb) && !WARN_ON(!d_is_dir(real))) {
                index = ovl_lookup_index(ofs, NULL, real, false);
                if (IS_ERR(index))
                        return index;
@@ -733,7 +733,7 @@ static struct dentry *ovl_lower_fh_to_d(struct super_block *sb,
        }
 
        /* Then lookup indexed upper/whiteout by origin fh */
-       if (ofs->indexdir) {
+       if (ovl_indexdir(sb)) {
                index = ovl_get_index_fh(ofs, fh);
                err = PTR_ERR(index);
                if (IS_ERR(index)) {
index 03bc8d5dfa318889da1aa00899664bf0c28c910c..984ffdaeed6ca8efcf8acb7852a481628ee3c380 100644 (file)
@@ -754,7 +754,7 @@ struct dentry *ovl_get_index_fh(struct ovl_fs *ofs, struct ovl_fh *fh)
        if (err)
                return ERR_PTR(err);
 
-       index = lookup_positive_unlocked(name.name, ofs->indexdir, name.len);
+       index = lookup_positive_unlocked(name.name, ofs->workdir, name.len);
        kfree(name.name);
        if (IS_ERR(index)) {
                if (PTR_ERR(index) == -ENOENT)
@@ -787,7 +787,7 @@ struct dentry *ovl_lookup_index(struct ovl_fs *ofs, struct dentry *upper,
                return ERR_PTR(err);
 
        index = lookup_one_positive_unlocked(ovl_upper_mnt_idmap(ofs), name.name,
-                                            ofs->indexdir, name.len);
+                                            ofs->workdir, name.len);
        if (IS_ERR(index)) {
                err = PTR_ERR(index);
                if (err == -ENOENT) {
index d82d2a043da2c7b7ea055a5c7dbbe0b3c2544dbc..5fa9c58af65f2107c19524fc58808a3140820f5c 100644 (file)
@@ -63,10 +63,8 @@ struct ovl_fs {
        struct ovl_sb *fs;
        /* workbasedir is the path at workdir= mount option */
        struct dentry *workbasedir;
-       /* workdir is the 'work' directory under workbasedir */
+       /* workdir is the 'work' or 'index' directory under workbasedir */
        struct dentry *workdir;
-       /* index directory listing overlay inodes by origin file handle */
-       struct dentry *indexdir;
        long namelen;
        /* pathnames of lower and upper dirs, for show_options */
        struct ovl_config config;
@@ -81,7 +79,6 @@ struct ovl_fs {
        /* Traps in ovl inode cache */
        struct inode *workbasedir_trap;
        struct inode *workdir_trap;
-       struct inode *indexdir_trap;
        /* -1: disabled, 0: same fs, 1..32: number of unused ino bits */
        int xino_mode;
        /* For allocation of non-persistent inode numbers */
index 3fe2dde1598f9ead48dbbaafcd2c9660fd358f00..112b4b12f8252affb5267cc4a908cb63d9bdd3c2 100644 (file)
@@ -743,10 +743,8 @@ void ovl_free_fs(struct ovl_fs *ofs)
        unsigned i;
 
        iput(ofs->workbasedir_trap);
-       iput(ofs->indexdir_trap);
        iput(ofs->workdir_trap);
        dput(ofs->whiteout);
-       dput(ofs->indexdir);
        dput(ofs->workdir);
        if (ofs->workdir_locked)
                ovl_inuse_unlock(ofs->workbasedir);
index a490fc47c3e7ea351f53187b487efb166713332c..e71156baa7bccae2d15c1830938d62116f546b74 100644 (file)
@@ -1169,7 +1169,7 @@ int ovl_workdir_cleanup(struct ovl_fs *ofs, struct inode *dir,
 int ovl_indexdir_cleanup(struct ovl_fs *ofs)
 {
        int err;
-       struct dentry *indexdir = ofs->indexdir;
+       struct dentry *indexdir = ofs->workdir;
        struct dentry *index = NULL;
        struct inode *dir = indexdir->d_inode;
        struct path path = { .mnt = ovl_upper_mnt(ofs), .dentry = indexdir };
index a0967bb250036d38c6ee922950aec7f46608aed3..f78161cf838813553c59f5c92687eb1cae66d6c4 100644 (file)
@@ -853,10 +853,8 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs,
        if (IS_ERR(indexdir)) {
                err = PTR_ERR(indexdir);
        } else if (indexdir) {
-               ofs->indexdir = indexdir;
-               ofs->workdir = dget(indexdir);
-
-               err = ovl_setup_trap(sb, ofs->indexdir, &ofs->indexdir_trap,
+               ofs->workdir = indexdir;
+               err = ovl_setup_trap(sb, indexdir, &ofs->workdir_trap,
                                     "indexdir");
                if (err)
                        goto out;
@@ -869,16 +867,15 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs,
                 * ".overlay.upper" to indicate that index may have
                 * directory entries.
                 */
-               if (ovl_check_origin_xattr(ofs, ofs->indexdir)) {
-                       err = ovl_verify_origin_xattr(ofs, ofs->indexdir,
+               if (ovl_check_origin_xattr(ofs, indexdir)) {
+                       err = ovl_verify_origin_xattr(ofs, indexdir,
                                                      OVL_XATTR_ORIGIN,
                                                      upperpath->dentry, true,
                                                      false);
                        if (err)
                                pr_err("failed to verify index dir 'origin' xattr\n");
                }
-               err = ovl_verify_upper(ofs, ofs->indexdir, upperpath->dentry,
-                                      true);
+               err = ovl_verify_upper(ofs, indexdir, upperpath->dentry, true);
                if (err)
                        pr_err("failed to verify index dir 'upper' xattr\n");
 
@@ -886,7 +883,7 @@ static int ovl_get_indexdir(struct super_block *sb, struct ovl_fs *ofs,
                if (!err)
                        err = ovl_indexdir_cleanup(ofs);
        }
-       if (err || !ofs->indexdir)
+       if (err || !indexdir)
                pr_warn("try deleting index dir or mounting with '-o index=off' to disable inodes index.\n");
 
 out:
@@ -1406,7 +1403,7 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc)
                        goto out_free_oe;
 
                /* Force r/o mount with no index dir */
-               if (!ofs->indexdir)
+               if (!ofs->workdir)
                        sb->s_flags |= SB_RDONLY;
        }
 
@@ -1415,7 +1412,7 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc)
                goto out_free_oe;
 
        /* Show index=off in /proc/mounts for forced r/o mount */
-       if (!ofs->indexdir) {
+       if (!ofs->workdir) {
                ofs->config.index = false;
                if (ovl_upper_mnt(ofs) && ofs->config.nfs_export) {
                        pr_warn("NFS export requires an index dir, falling back to nfs_export=off.\n");
index c3f020ca13a8c705e312400390b5727e8b4dd312..22b519763267f5018a9949da7b2c74b2f3422853 100644 (file)
@@ -91,7 +91,7 @@ struct dentry *ovl_indexdir(struct super_block *sb)
 {
        struct ovl_fs *ofs = OVL_FS(sb);
 
-       return ofs->indexdir;
+       return ofs->config.index ? ofs->workdir : NULL;
 }
 
 /* Index all files on copy up. For now only enabled for NFS export */