ovl: simplify arguments to ovl_check_origin_fh()
authorAmir Goldstein <amir73il@gmail.com>
Tue, 12 Dec 2017 20:40:46 +0000 (22:40 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 24 Jan 2018 09:19:46 +0000 (10:19 +0100)
Pass the fs instance with lower_layers array instead of the dentry
lowerstack array to ovl_check_origin_fh(), because the dentry members
of lowerstack play no role in this helper.

This change simplifies the argument list of ovl_check_origin(),
ovl_cleanup_index() and ovl_verify_index().

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/namei.c
fs/overlayfs/overlayfs.h
fs/overlayfs/readdir.c
fs/overlayfs/super.c

index a6b9bd2afca1656b3a3781d564f23f5a473c6467..27f25a61f6e443d8a3d778bc47ded3ac65c60c15 100644 (file)
@@ -291,17 +291,15 @@ static int ovl_lookup_layer(struct dentry *base, struct ovl_lookup_data *d,
 }
 
 
-static int ovl_check_origin_fh(struct ovl_fh *fh, struct dentry *upperdentry,
-                              struct ovl_path *lower, unsigned int numlower,
+static int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh,
+                              struct dentry *upperdentry,
                               struct ovl_path **stackp)
 {
-       struct vfsmount *mnt;
        struct dentry *origin = NULL;
        int i;
 
-       for (i = 0; i < numlower; i++) {
-               mnt = lower[i].layer->mnt;
-               origin = ovl_decode_fh(fh, mnt);
+       for (i = 0; i < ofs->numlower; i++) {
+               origin = ovl_decode_fh(fh, ofs->lower_layers[i].mnt);
                if (origin)
                        break;
        }
@@ -321,7 +319,10 @@ static int ovl_check_origin_fh(struct ovl_fh *fh, struct dentry *upperdentry,
                dput(origin);
                return -ENOMEM;
        }
-       **stackp = (struct ovl_path){.dentry = origin, .layer = lower[i].layer};
+       **stackp = (struct ovl_path){
+               .dentry = origin,
+               .layer = &ofs->lower_layers[i]
+       };
 
        return 0;
 
@@ -333,8 +334,7 @@ invalid:
        return -EIO;
 }
 
-static int ovl_check_origin(struct dentry *upperdentry,
-                           struct ovl_path *lower, unsigned int numlower,
+static int ovl_check_origin(struct ovl_fs *ofs, struct dentry *upperdentry,
                            struct ovl_path **stackp, unsigned int *ctrp)
 {
        struct ovl_fh *fh = ovl_get_origin_fh(upperdentry);
@@ -343,7 +343,7 @@ static int ovl_check_origin(struct dentry *upperdentry,
        if (IS_ERR_OR_NULL(fh))
                return PTR_ERR(fh);
 
-       err = ovl_check_origin_fh(fh, upperdentry, lower, numlower, stackp);
+       err = ovl_check_origin_fh(ofs, fh, upperdentry, stackp);
        kfree(fh);
 
        if (err) {
@@ -423,8 +423,7 @@ fail:
  * OVL_XATTR_ORIGIN and that origin file handle can be decoded to lower path.
  * Return 0 on match, -ESTALE on mismatch or stale origin, < 0 on error.
  */
-int ovl_verify_index(struct dentry *index, struct ovl_path *lower,
-                    unsigned int numlower)
+int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index)
 {
        struct ovl_fh *fh = NULL;
        size_t len;
@@ -471,7 +470,7 @@ int ovl_verify_index(struct dentry *index, struct ovl_path *lower,
        if (err)
                goto fail;
 
-       err = ovl_check_origin_fh(fh, index, lower, numlower, &stack);
+       err = ovl_check_origin_fh(ofs, fh, index, &stack);
        if (err)
                goto fail;
 
@@ -689,8 +688,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
                         * number - it's the same as if we held a reference
                         * to a dentry in lower layer that was moved under us.
                         */
-                       err = ovl_check_origin(upperdentry, roe->lowerstack,
-                                              roe->numlower, &stack, &ctr);
+                       err = ovl_check_origin(ofs, upperdentry, &stack, &ctr);
                        if (err)
                                goto out_put_upper;
                }
index d1cfa69c98b5451059276505b88b3abcc4b668f8..d55afb6646b08b889e3d86b90f14b9043bb04471 100644 (file)
@@ -251,11 +251,11 @@ static inline bool ovl_is_impuredir(struct dentry *dentry)
 /* namei.c */
 int ovl_verify_origin(struct dentry *dentry, struct dentry *origin,
                      bool is_upper, bool set);
-int ovl_verify_index(struct dentry *index, struct ovl_path *lower,
-                    unsigned int numlower);
+int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index);
 int ovl_get_index_name(struct dentry *origin, struct qstr *name);
 int ovl_path_next(int idx, struct dentry *dentry, struct path *path);
-struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags);
+struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
+                         unsigned int flags);
 bool ovl_lower_positive(struct dentry *dentry);
 
 /* readdir.c */
@@ -267,8 +267,7 @@ void ovl_dir_cache_free(struct inode *inode);
 int ovl_check_d_type_supported(struct path *realpath);
 void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt,
                         struct dentry *dentry, int level);
-int ovl_indexdir_cleanup(struct dentry *dentry, struct vfsmount *mnt,
-                        struct ovl_path *lower, unsigned int numlower);
+int ovl_indexdir_cleanup(struct ovl_fs *ofs);
 
 /* inode.c */
 int ovl_set_nlink_upper(struct dentry *dentry);
index 1a8c39887992e9bbcbe02bafc2a448f014c8e8ff..4c660c7085b79895b5de9a1a8e72a5309ad70a4b 100644 (file)
@@ -1030,13 +1030,13 @@ void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt,
        }
 }
 
-int ovl_indexdir_cleanup(struct dentry *dentry, struct vfsmount *mnt,
-                        struct ovl_path *lower, unsigned int numlower)
+int ovl_indexdir_cleanup(struct ovl_fs *ofs)
 {
        int err;
+       struct dentry *indexdir = ofs->indexdir;
        struct dentry *index = NULL;
-       struct inode *dir = dentry->d_inode;
-       struct path path = { .mnt = mnt, .dentry = dentry };
+       struct inode *dir = indexdir->d_inode;
+       struct path path = { .mnt = ofs->upper_mnt, .dentry = indexdir };
        LIST_HEAD(list);
        struct rb_root root = RB_ROOT;
        struct ovl_cache_entry *p;
@@ -1060,13 +1060,13 @@ int ovl_indexdir_cleanup(struct dentry *dentry, struct vfsmount *mnt,
                        if (p->len == 2 && p->name[1] == '.')
                                continue;
                }
-               index = lookup_one_len(p->name, dentry, p->len);
+               index = lookup_one_len(p->name, indexdir, p->len);
                if (IS_ERR(index)) {
                        err = PTR_ERR(index);
                        index = NULL;
                        break;
                }
-               err = ovl_verify_index(index, lower, numlower);
+               err = ovl_verify_index(ofs, index);
                /* Cleanup stale and orphan index entries */
                if (err && (err == -ESTALE || err == -ENOENT))
                        err = ovl_cleanup(dir, index);
index b34a002ab4b57dd2463f0db1e20bbba91d1a0808..4345c3f83fde01536ad040d95e4fdafd1696abf1 100644 (file)
@@ -1057,10 +1057,7 @@ static int ovl_get_indexdir(struct ovl_fs *ofs, struct ovl_entry *oe,
 
                /* Cleanup bad/stale/orphan index entries */
                if (!err)
-                       err = ovl_indexdir_cleanup(ofs->indexdir,
-                                                  ofs->upper_mnt,
-                                                  oe->lowerstack,
-                                                  oe->numlower);
+                       err = ovl_indexdir_cleanup(ofs);
        }
        if (err || !ofs->indexdir)
                pr_warn("overlayfs: try deleting index dir or mounting with '-o index=off' to disable inodes index.\n");