NFSv4: Fix the nfs_inode_set_delegation() arguments
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 20 Mar 2018 21:03:13 +0000 (17:03 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 10 Apr 2018 20:06:22 +0000 (16:06 -0400)
Neither nfs_inode_set_delegation() nor nfs_inode_reclaim_delegation() are
generic code. They have no business delving into NFSv4 OPEN xdr structures,
so let's replace the "struct nfs_openres" parameter.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/delegation.c
fs/nfs/delegation.h
fs/nfs/nfs4proc.c

index a5cb4437510057504bce37ec03861c9cd9947899..1819d0d0ba4b14b92ad311ae2cf588f7f1ecb6a2 100644 (file)
@@ -172,11 +172,15 @@ again:
  * nfs_inode_reclaim_delegation - process a delegation reclaim request
  * @inode: inode to process
  * @cred: credential to use for request
- * @res: new delegation state from server
+ * @type: delegation type
+ * @stateid: delegation stateid
+ * @pagemod_limit: write delegation "space_limit"
  *
  */
 void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
-                                 struct nfs_openres *res)
+                                 fmode_t type,
+                                 const nfs4_stateid *stateid,
+                                 unsigned long pagemod_limit)
 {
        struct nfs_delegation *delegation;
        struct rpc_cred *oldcred = NULL;
@@ -186,9 +190,9 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
        if (delegation != NULL) {
                spin_lock(&delegation->lock);
                if (delegation->inode != NULL) {
-                       nfs4_stateid_copy(&delegation->stateid, &res->delegation);
-                       delegation->type = res->delegation_type;
-                       delegation->pagemod_limit = res->pagemod_limit;
+                       nfs4_stateid_copy(&delegation->stateid, stateid);
+                       delegation->type = type;
+                       delegation->pagemod_limit = pagemod_limit;
                        oldcred = delegation->cred;
                        delegation->cred = get_rpccred(cred);
                        clear_bit(NFS_DELEGATION_NEED_RECLAIM,
@@ -196,14 +200,14 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
                        spin_unlock(&delegation->lock);
                        rcu_read_unlock();
                        put_rpccred(oldcred);
-                       trace_nfs4_reclaim_delegation(inode, res->delegation_type);
+                       trace_nfs4_reclaim_delegation(inode, type);
                        return;
                }
                /* We appear to have raced with a delegation return. */
                spin_unlock(&delegation->lock);
        }
        rcu_read_unlock();
-       nfs_inode_set_delegation(inode, cred, res);
+       nfs_inode_set_delegation(inode, cred, type, stateid, pagemod_limit);
 }
 
 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync)
@@ -330,11 +334,16 @@ nfs_update_inplace_delegation(struct nfs_delegation *delegation,
  * nfs_inode_set_delegation - set up a delegation on an inode
  * @inode: inode to which delegation applies
  * @cred: cred to use for subsequent delegation processing
- * @res: new delegation state from server
+ * @type: delegation type
+ * @stateid: delegation stateid
+ * @pagemod_limit: write delegation "space_limit"
  *
  * Returns zero on success, or a negative errno value.
  */
-int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res)
+int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred,
+                                 fmode_t type,
+                                 const nfs4_stateid *stateid,
+                                 unsigned long pagemod_limit)
 {
        struct nfs_server *server = NFS_SERVER(inode);
        struct nfs_client *clp = server->nfs_client;
@@ -346,9 +355,9 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct
        delegation = kmalloc(sizeof(*delegation), GFP_NOFS);
        if (delegation == NULL)
                return -ENOMEM;
-       nfs4_stateid_copy(&delegation->stateid, &res->delegation);
-       delegation->type = res->delegation_type;
-       delegation->pagemod_limit = res->pagemod_limit;
+       nfs4_stateid_copy(&delegation->stateid, stateid);
+       delegation->type = type;
+       delegation->pagemod_limit = pagemod_limit;
        delegation->change_attr = inode_peek_iversion_raw(inode);
        delegation->cred = get_rpccred(cred);
        delegation->inode = inode;
@@ -393,7 +402,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct
        rcu_assign_pointer(nfsi->delegation, delegation);
        delegation = NULL;
 
-       trace_nfs4_set_delegation(inode, res->delegation_type);
+       trace_nfs4_set_delegation(inode, type);
 
 out:
        spin_unlock(&clp->cl_lock);
index dcc8a783a6e12abc5ace201f362ee7f5062f6f58..bb1ef8c37af42706c909d9f6880ca44fd33b5d00 100644 (file)
@@ -36,8 +36,10 @@ enum {
        NFS_DELEGATION_TEST_EXPIRED,
 };
 
-int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res);
-void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res);
+int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred,
+               fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit);
+void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
+               fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit);
 int nfs4_inode_return_delegation(struct inode *inode);
 int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid);
 void nfs_inode_return_delegation_noreclaim(struct inode *inode);
index 924238db5983b927ed1c68d13f9b0b11d11f934b..3eb53d7784e2318d9ff0494efa9576c065015c94 100644 (file)
@@ -1754,12 +1754,16 @@ nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state)
        }
        if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
                nfs_inode_set_delegation(state->inode,
-                                        data->owner->so_cred,
-                                        &data->o_res);
+                               data->owner->so_cred,
+                               data->o_res.delegation_type,
+                               &data->o_res.delegation,
+                               data->o_res.pagemod_limit);
        else
                nfs_inode_reclaim_delegation(state->inode,
-                                            data->owner->so_cred,
-                                            &data->o_res);
+                               data->owner->so_cred,
+                               data->o_res.delegation_type,
+                               &data->o_res.delegation,
+                               data->o_res.pagemod_limit);
 }
 
 /*