summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Layton <jlayton@kernel.org>2026-07-10 10:00:14 -0400
committerChuck Lever <cel@kernel.org>2026-08-10 09:54:35 -0400
commitd6edc2a72513efce59eaf85acb204d2ddac71892 (patch)
tree2cfa857d2a9c5bc72ccfd720df36e3a4e591ade7
parent80c376183411300b4c99977c66f3f84f64b38676 (diff)
nfsd: drop dead COPY-vs-COPYNOTIFY type handling from s2s stateid IDR
Now that the COPY offload stateid is a first-class nfs4_stid, nn->s2s_cp_stateids holds COPY_NOTIFY stateids exclusively (its only inserter, nfs4_init_cp_state(), runs only from nfs4_alloc_init_cpntf_state()). The type-distinguishing machinery is dead: - remove the unreferenced NFS4_COPY_STID definition; - drop nfs4_init_cp_state()'s cs_type argument (hardcode NFS4_COPYNOTIFY_STID) and its now-always-true "if (p_stid)" guard; - remove the cs_type == NFS4_COPYNOTIFY_STID gates in manage_cpntf_state() and the laundromat, which can no longer be false. copy_stateid_t.cs_type is retained for the WARN_ON_ONCE() sanity checks on the free paths. No functional change. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Jeff Layton <jlayton@kernel.org> Link: https://patch.msgid.link/20260710-nfsd-testing-v3-10-a0ff7db6aa3e@kernel.org Signed-off-by: Chuck Lever <cel@kernel.org>
-rw-r--r--fs/nfsd/nfs4state.c30
-rw-r--r--fs/nfsd/state.h1
2 files changed, 12 insertions, 19 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 015a67abd1e7..0976da2508ce 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -979,10 +979,11 @@ out_free:
}
/*
- * Create a unique stateid_t to represent each COPY.
+ * Publish a COPY_NOTIFY stateid in nn->s2s_cp_stateids and link it onto the
+ * parent's sc_cp_list. That IDR holds only COPY_NOTIFY stateids.
*/
static int nfs4_init_cp_state(struct nfsd_net *nn, copy_stateid_t *stid,
- unsigned char cs_type, struct nfs4_stid *p_stid)
+ struct nfs4_stid *p_stid)
{
int new_id;
@@ -993,6 +994,9 @@ static int nfs4_init_cp_state(struct nfsd_net *nn, copy_stateid_t *stid,
spin_lock(&nn->s2s_cp_lock);
new_id = idr_alloc_cyclic(&nn->s2s_cp_stateids, stid, 0, 0, GFP_NOWAIT);
if (new_id >= 0) {
+ struct nfs4_cpntf_state *cps =
+ container_of(stid, struct nfs4_cpntf_state, cp_stateid);
+
stid->cs_stid.si_opaque.so_id = new_id;
stid->cs_stid.si_generation = 1;
/*
@@ -1001,14 +1005,8 @@ static int nfs4_init_cp_state(struct nfsd_net *nn, copy_stateid_t *stid,
* manage_cpntf_state() sees either no entry or a fully
* linked cp_list.
*/
- stid->cs_type = cs_type;
- if (p_stid) {
- struct nfs4_cpntf_state *cps =
- container_of(stid, struct nfs4_cpntf_state,
- cp_stateid);
-
- list_add(&cps->cp_list, &p_stid->sc_cp_list);
- }
+ stid->cs_type = NFS4_COPYNOTIFY_STID;
+ list_add(&cps->cp_list, &p_stid->sc_cp_list);
}
spin_unlock(&nn->s2s_cp_lock);
idr_preload_end();
@@ -1068,8 +1066,7 @@ struct nfs4_cpntf_state *nfs4_alloc_init_cpntf_state(struct nfsd_net *nn,
memcpy(&cps->cp_p_clid, &p_stid->sc_client->cl_clientid,
sizeof(clientid_t));
refcount_set(&cps->cp_stateid.cs_count, 2);
- if (!nfs4_init_cp_state(nn, &cps->cp_stateid, NFS4_COPYNOTIFY_STID,
- p_stid))
+ if (!nfs4_init_cp_state(nn, &cps->cp_stateid, p_stid))
goto out_free;
return cps;
out_free:
@@ -7635,10 +7632,10 @@ nfs4_laundromat(struct nfsd_net *nn)
nfsd4_end_grace(nn);
spin_lock(&nn->s2s_cp_lock);
+ /* s2s_cp_stateids holds only COPY_NOTIFY stateids */
idr_for_each_entry(&nn->s2s_cp_stateids, cps_t, i) {
cps = container_of(cps_t, struct nfs4_cpntf_state, cp_stateid);
- if (cps->cp_stateid.cs_type == NFS4_COPYNOTIFY_STID &&
- state_expired(&lt, cps->cpntf_time))
+ if (state_expired(&lt, cps->cpntf_time))
revoke_cpntf_state_locked(nn, cps);
}
spin_unlock(&nn->s2s_cp_lock);
@@ -8076,14 +8073,11 @@ __be32 manage_cpntf_state(struct nfsd_net *nn, stateid_t *st,
if (st->si_opaque.so_clid.cl_id != nn->s2s_cp_cl_id)
return nfserr_bad_stateid;
spin_lock(&nn->s2s_cp_lock);
+ /* s2s_cp_stateids holds only COPY_NOTIFY stateids */
cps_t = idr_find(&nn->s2s_cp_stateids, st->si_opaque.so_id);
if (cps_t) {
state = container_of(cps_t, struct nfs4_cpntf_state,
cp_stateid);
- if (state->cp_stateid.cs_type != NFS4_COPYNOTIFY_STID) {
- state = NULL;
- goto unlock;
- }
if (!clp) {
refcount_inc(&state->cp_stateid.cs_count);
} else if (memcmp(&clp->cl_clientid, &state->cp_p_clid,
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index 5dc4a473246e..ee5c429edfa2 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -59,7 +59,6 @@ typedef struct {
typedef struct {
stateid_t cs_stid;
-#define NFS4_COPY_STID 1
#define NFS4_COPYNOTIFY_STID 2
unsigned char cs_type;
refcount_t cs_count;