NFSv4: Refactor nfs4_opendata_check_deleg()
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 17 Jun 2024 01:21:20 +0000 (21:21 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 8 Jul 2024 17:47:25 +0000 (13:47 -0400)
Modify it to no longer depend directly on the struct opendata.
This will enable sharing with WANT_DELEGATION.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Lance Shelton <lance.shelton@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4proc.c

index 7a74dc1bcfbd806a5143fba524e675d42311dfc0..7f294085e887c12967cf3b5c05971ecaf9f42f90 100644 (file)
@@ -1954,51 +1954,39 @@ out_return_state:
 }
 
 static void
-nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state)
+nfs4_process_delegation(struct inode *inode, const struct cred *cred,
+                       enum open_claim_type4 claim,
+                       const struct nfs4_open_delegation *delegation)
 {
-       struct nfs_client *clp = NFS_SERVER(state->inode)->nfs_client;
-       struct nfs_delegation *delegation;
-       int delegation_flags = 0;
-
-       switch (data->o_res.delegation.open_delegation_type) {
+       switch (delegation->open_delegation_type) {
        case NFS4_OPEN_DELEGATE_READ:
        case NFS4_OPEN_DELEGATE_WRITE:
                break;
        default:
                return;
-       };
-       rcu_read_lock();
-       delegation = rcu_dereference(NFS_I(state->inode)->delegation);
-       if (delegation)
-               delegation_flags = delegation->flags;
-       rcu_read_unlock();
-       switch (data->o_arg.claim) {
-       default:
-               break;
+       }
+       switch (claim) {
        case NFS4_OPEN_CLAIM_DELEGATE_CUR:
        case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
                pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
                                   "returning a delegation for "
                                   "OPEN(CLAIM_DELEGATE_CUR)\n",
-                                  clp->cl_hostname);
-               return;
+                                  NFS_SERVER(inode)->nfs_client->cl_hostname);
+               break;
+       case NFS4_OPEN_CLAIM_PREVIOUS:
+               nfs_inode_reclaim_delegation(inode, cred,
+                               delegation->type,
+                               &delegation->stateid,
+                               delegation->pagemod_limit);
+               break;
+       default:
+               nfs_inode_set_delegation(inode, cred,
+                               delegation->type,
+                               &delegation->stateid,
+                               delegation->pagemod_limit);
        }
-       if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
-               nfs_inode_set_delegation(state->inode,
-                               data->owner->so_cred,
-                               data->o_res.delegation.type,
-                               &data->o_res.delegation.stateid,
-                               data->o_res.delegation.pagemod_limit);
-       else
-               nfs_inode_reclaim_delegation(state->inode,
-                               data->owner->so_cred,
-                               data->o_res.delegation.type,
-                               &data->o_res.delegation.stateid,
-                               data->o_res.delegation.pagemod_limit);
-
-       if (data->o_res.delegation.do_recall)
-               nfs_async_inode_return_delegation(state->inode,
-                                                 &data->o_res.delegation.stateid);
+       if (delegation->do_recall)
+               nfs_async_inode_return_delegation(inode, &delegation->stateid);
 }
 
 /*
@@ -2022,7 +2010,10 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data)
        if (ret)
                return ERR_PTR(ret);
 
-       nfs4_opendata_check_deleg(data, state);
+       nfs4_process_delegation(state->inode,
+                               data->owner->so_cred,
+                               data->o_arg.claim,
+                               &data->o_res.delegation);
 
        if (!update_open_stateid(state, &data->o_res.stateid,
                                NULL, data->o_arg.fmode))
@@ -2089,8 +2080,11 @@ _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
        if (IS_ERR(state))
                goto out;
 
-       if (data->o_res.delegation.type != 0)
-               nfs4_opendata_check_deleg(data, state);
+       nfs4_process_delegation(state->inode,
+                               data->owner->so_cred,
+                               data->o_arg.claim,
+                               &data->o_res.delegation);
+
        if (!update_open_stateid(state, &data->o_res.stateid,
                                NULL, data->o_arg.fmode)) {
                nfs4_put_open_state(state);