NFS: Remove the label from the nfs4_lookup_res struct
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 22 Oct 2021 17:11:04 +0000 (13:11 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 5 Nov 2021 18:54:39 +0000 (14:54 -0400)
And usethe fattr's label field instead. I also adjust function calls to
remove labels along the way.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/dir.c
fs/nfs/namespace.c
fs/nfs/nfs3proc.c
fs/nfs/nfs4proc.c
fs/nfs/nfs4xdr.c
fs/nfs/proc.c
include/linux/nfs_xdr.h

index 92530c3c1694e6f329783270d84b90b42088a66d..8a327971d4858dc0424f2ec09bdd59b091b14cb0 100644 (file)
@@ -1494,19 +1494,17 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
 {
        struct nfs_fh *fhandle;
        struct nfs_fattr *fattr;
-       struct nfs4_label *label;
        unsigned long dir_verifier;
        int ret;
 
        ret = -ENOMEM;
        fhandle = nfs_alloc_fhandle();
-       fattr = nfs_alloc_fattr();
-       label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
-       if (fhandle == NULL || fattr == NULL || IS_ERR(label))
+       fattr = nfs_alloc_fattr_with_label(NFS_SERVER(inode));
+       if (fhandle == NULL || fattr == NULL)
                goto out;
 
        dir_verifier = nfs_save_change_attribute(dir);
-       ret = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, label);
+       ret = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
        if (ret < 0) {
                switch (ret) {
                case -ESTALE:
@@ -1525,7 +1523,7 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
        if (nfs_refresh_inode(inode, fattr) < 0)
                goto out;
 
-       nfs_setsecurity(inode, fattr, label);
+       nfs_setsecurity(inode, fattr, fattr->label);
        nfs_set_verifier(dentry, dir_verifier);
 
        /* set a readdirplus hint that we had a cache miss */
@@ -1534,7 +1532,6 @@ nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
 out:
        nfs_free_fattr(fattr);
        nfs_free_fhandle(fhandle);
-       nfs4_label_free(label);
 
        /*
         * If the lookup failed despite the dentry change attribute being
@@ -1754,7 +1751,6 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
        struct inode *inode = NULL;
        struct nfs_fh *fhandle = NULL;
        struct nfs_fattr *fattr = NULL;
-       struct nfs4_label *label = NULL;
        unsigned long dir_verifier;
        int error;
 
@@ -1773,27 +1769,23 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned in
 
        res = ERR_PTR(-ENOMEM);
        fhandle = nfs_alloc_fhandle();
-       fattr = nfs_alloc_fattr();
+       fattr = nfs_alloc_fattr_with_label(NFS_SERVER(dir));
        if (fhandle == NULL || fattr == NULL)
                goto out;
 
-       label = nfs4_label_alloc(NFS_SERVER(dir), GFP_NOWAIT);
-       if (IS_ERR(label))
-               goto out;
-
        dir_verifier = nfs_save_change_attribute(dir);
        trace_nfs_lookup_enter(dir, dentry, flags);
-       error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, label);
+       error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
        if (error == -ENOENT)
                goto no_entry;
        if (error < 0) {
                res = ERR_PTR(error);
-               goto out_label;
+               goto out;
        }
-       inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
+       inode = nfs_fhget(dentry->d_sb, fhandle, fattr, fattr->label);
        res = ERR_CAST(inode);
        if (IS_ERR(res))
-               goto out_label;
+               goto out;
 
        /* Notify readdir to use READDIRPLUS */
        nfs_force_use_readdirplus(dir);
@@ -1802,14 +1794,12 @@ no_entry:
        res = d_splice_alias(inode, dentry);
        if (res != NULL) {
                if (IS_ERR(res))
-                       goto out_label;
+                       goto out;
                dentry = res;
        }
        nfs_set_verifier(dentry, dir_verifier);
-out_label:
-       trace_nfs_lookup_exit(dir, dentry, flags, PTR_ERR_OR_ZERO(res));
-       nfs4_label_free(label);
 out:
+       trace_nfs_lookup_exit(dir, dentry, flags, PTR_ERR_OR_ZERO(res));
        nfs_free_fattr(fattr);
        nfs_free_fhandle(fhandle);
        return res;
@@ -2058,7 +2048,7 @@ nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
        d_drop(dentry);
 
        if (fhandle->size == 0) {
-               error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, NULL);
+               error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr);
                if (error)
                        goto out_error;
        }
index bc0c698f3350814d9411886e216a5ca7db8f1db7..3295af4110f1b1c5890f110c3d49424a3d19406f 100644 (file)
@@ -308,8 +308,7 @@ int nfs_submount(struct fs_context *fc, struct nfs_server *server)
 
        /* Look it up again to get its attributes */
        err = server->nfs_client->rpc_ops->lookup(d_inode(parent), dentry,
-                                                 ctx->mntfh, ctx->clone_data.fattr,
-                                                 NULL);
+                                                 ctx->mntfh, ctx->clone_data.fattr);
        dput(parent);
        if (err != 0)
                return err;
index f7524310ddf4b0b04a1bd2244b274e2fb4d6d19c..717eb651f0fd5915fa0733c70d21900d89d36f0b 100644 (file)
@@ -193,8 +193,7 @@ __nfs3_proc_lookup(struct inode *dir, const char *name, size_t len,
 
 static int
 nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
-                struct nfs_fh *fhandle, struct nfs_fattr *fattr,
-                struct nfs4_label *label)
+                struct nfs_fh *fhandle, struct nfs_fattr *fattr)
 {
        unsigned short task_flags = 0;
 
index bde5b572304650d6d0ed7cc3ca9f0bab16784b50..7af73fd34b224ead581d0dd820daf0c3963beb88 100644 (file)
@@ -4294,7 +4294,7 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
 
 static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
                struct dentry *dentry, struct nfs_fh *fhandle,
-               struct nfs_fattr *fattr, struct nfs4_label *label)
+               struct nfs_fattr *fattr)
 {
        struct nfs_server *server = NFS_SERVER(dir);
        int                    status;
@@ -4306,7 +4306,6 @@ static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
        struct nfs4_lookup_res res = {
                .server = server,
                .fattr = fattr,
-               .label = label,
                .fh = fhandle,
        };
        struct rpc_message msg = {
@@ -4323,7 +4322,7 @@ static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
        if (nfs_lookup_is_soft_revalidate(dentry))
                task_flags |= RPC_TASK_TIMEOUT;
 
-       args.bitmask = nfs4_bitmask(server, label);
+       args.bitmask = nfs4_bitmask(server, fattr->label);
 
        nfs_fattr_init(fattr);
 
@@ -4345,7 +4344,7 @@ static void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr)
 
 static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
                                   struct dentry *dentry, struct nfs_fh *fhandle,
-                                  struct nfs_fattr *fattr, struct nfs4_label *label)
+                                  struct nfs_fattr *fattr)
 {
        struct nfs4_exception exception = {
                .interruptible = true,
@@ -4354,7 +4353,7 @@ static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
        const struct qstr *name = &dentry->d_name;
        int err;
        do {
-               err = _nfs4_proc_lookup(client, dir, dentry, fhandle, fattr, label);
+               err = _nfs4_proc_lookup(client, dir, dentry, fhandle, fattr);
                trace_nfs4_lookup(dir, name, err);
                switch (err) {
                case -NFS4ERR_BADNAME:
@@ -4390,13 +4389,12 @@ out:
 }
 
 static int nfs4_proc_lookup(struct inode *dir, struct dentry *dentry,
-                           struct nfs_fh *fhandle, struct nfs_fattr *fattr,
-                           struct nfs4_label *label)
+                           struct nfs_fh *fhandle, struct nfs_fattr *fattr)
 {
        int status;
        struct rpc_clnt *client = NFS_CLIENT(dir);
 
-       status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, label);
+       status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr);
        if (client != NFS_CLIENT(dir)) {
                rpc_shutdown_client(client);
                nfs_fixup_secinfo_attributes(fattr);
@@ -4411,7 +4409,7 @@ nfs4_proc_lookup_mountpoint(struct inode *dir, struct dentry *dentry,
        struct rpc_clnt *client = NFS_CLIENT(dir);
        int status;
 
-       status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, NULL);
+       status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr);
        if (status < 0)
                return ERR_PTR(status);
        return (client == NFS_CLIENT(dir)) ? rpc_clone_client(client) : client;
index 4c9d66fac3fd88534a12a4a874d1c0e39785c57b..960e2b2a7a58bf94c4aad427dc14f894c6600e5b 100644 (file)
@@ -6171,7 +6171,7 @@ static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
        status = decode_getfh(xdr, res->fh);
        if (status)
                goto out;
-       status = decode_getfattr_label(xdr, res->fattr, res->label, res->server);
+       status = decode_getfattr_label(xdr, res->fattr, res->fattr->label, res->server);
 out:
        return status;
 }
@@ -6229,7 +6229,7 @@ static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp,
        status = decode_getfh(xdr, res->fh);
        if (status == 0)
                status = decode_getfattr_label(xdr, res->fattr,
-                                               res->label, res->server);
+                                               res->fattr->label, res->server);
 out:
        return status;
 }
index ecc4e717808c4ee5958b30d1b5f513c260a427df..98a8901ede2ea5a3abb51f749646ab917504d050 100644 (file)
@@ -154,8 +154,7 @@ nfs_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
 
 static int
 nfs_proc_lookup(struct inode *dir, struct dentry *dentry,
-               struct nfs_fh *fhandle, struct nfs_fattr *fattr,
-               struct nfs4_label *label)
+               struct nfs_fh *fhandle, struct nfs_fattr *fattr)
 {
        struct nfs_diropargs    arg = {
                .fh             = NFS_FH(dir),
index d55bf3fd51670359f93229a0d77e5f1fec934b3c..95219d5a8668d02cf7aecf34cec42c77cb595a49 100644 (file)
@@ -1095,7 +1095,6 @@ struct nfs4_lookup_res {
        const struct nfs_server *       server;
        struct nfs_fattr *              fattr;
        struct nfs_fh *                 fh;
-       struct nfs4_label               *label;
 };
 
 struct nfs4_lookupp_arg {
@@ -1740,8 +1739,7 @@ struct nfs_rpc_ops {
        int     (*setattr) (struct dentry *, struct nfs_fattr *,
                            struct iattr *);
        int     (*lookup)  (struct inode *, struct dentry *,
-                           struct nfs_fh *, struct nfs_fattr *,
-                           struct nfs4_label *);
+                           struct nfs_fh *, struct nfs_fattr *);
        int     (*lookupp) (struct inode *, struct nfs_fh *,
                            struct nfs_fattr *, struct nfs4_label *);
        int     (*access)  (struct inode *, struct nfs_access_entry *);