diff options
| author | Jeff Layton <jlayton@kernel.org> | 2026-07-10 10:00:14 -0400 |
|---|---|---|
| committer | Chuck Lever <cel@kernel.org> | 2026-08-10 09:54:35 -0400 |
| commit | d6edc2a72513efce59eaf85acb204d2ddac71892 (patch) | |
| tree | 2cfa857d2a9c5bc72ccfd720df36e3a4e591ade7 | |
| parent | 80c376183411300b4c99977c66f3f84f64b38676 (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.c | 30 | ||||
| -rw-r--r-- | fs/nfsd/state.h | 1 |
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(<, cps->cpntf_time)) + if (state_expired(<, 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; |
