From nobody Thu Nov 28 05:40:46 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81ED12139CB; Fri, 4 Oct 2024 13:18:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728047893; cv=none; b=F8hGUW/0Rtdqg7p/FHMN24ibJ6hziKoj8cGA5ftWbkZoudBaFLEMFoBoWb3KZeHzW560Ut5/cG8KZDKG0k+lZ7o7GF/f4DpipUQDHrJ2aw4tEj8OtUI0hoDByQopKx88p+Tf6Rd56ob49xUtGZd1JBOagIozWA95vLV3h0noJPE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728047893; c=relaxed/simple; bh=wdyYzZq0+G9ux3/rTIfsXgQJrGKaLW5LmDc1q+J42rc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EA4bhU4gX+xWcOGZzxGXrWao35DCgzO8a3e2wNZitl5WihiwLGouJsQsssp24++iwPjQ6IVrheCTxDb/gA1hH7+wajljlR/sRf5H9T/4Y7vc17kSVZyt49CC1j2aCnag7pF172Q3cXTs32rkbg46P/EMRRTzajT9ZJnvA1zFsrE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O4ElXL6z; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="O4ElXL6z" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B1076C4CECF; Fri, 4 Oct 2024 13:18:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728047893; bh=wdyYzZq0+G9ux3/rTIfsXgQJrGKaLW5LmDc1q+J42rc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=O4ElXL6zhPGPLtMH/7UytZRdX/vhodfBlLVvvA5lT3NAjBVquML/uHW8nsCKz/wqc irlv38n413ws8sQmqtngGEwxtviLMQchb3CQTovbJqhChOoCdYXDpuHOz9nDbL0f+X amnRIkBldgjwFsmWDeyGr2pq3gO3GinLsHombSZhSSW9iALpsrWeDD08/rfbMQ2RD5 DrMtbfMjUTlP46kurCrHOBWB6yBYGvxPGqU/2P54uFdc2+gwnt7ix+lUYYUk8BJRqe UlTrH868U8weZ/QoVuq9OfYLH/4cJwd9XkMf9AvJGFEr6fb+ziy8tfTsX6gozR2pW4 PwCqE0gzwWWIg== From: Jeff Layton Date: Fri, 04 Oct 2024 09:16:46 -0400 Subject: [PATCH v4 3/9] nfsd: have nfsd4_deleg_getattr_conflict pass back write deleg pointer Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241004-delstid-v4-3-62ac29c49c2e@kernel.org> References: <20241004-delstid-v4-0-62ac29c49c2e@kernel.org> In-Reply-To: <20241004-delstid-v4-0-62ac29c49c2e@kernel.org> To: Chuck Lever , Neil Brown , Olga Kornievskaia , Dai Ngo , Tom Talpey , Trond Myklebust , Anna Schumaker , Olga Kornievskaia , Alexander Viro , Christian Brauner , Jan Kara , Jonathan Corbet Cc: Tom Haynes , linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-doc@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4873; i=jlayton@kernel.org; h=from:subject:message-id; bh=wdyYzZq0+G9ux3/rTIfsXgQJrGKaLW5LmDc1q+J42rc=; b=owEBbQKS/ZANAwAIAQAOaEEZVoIVAcsmYgBm/+sNw3fB1vxMaL4GxIKXO2DXC7BVNXG2Y5bD5 nQIHhxNROmJAjMEAAEIAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCZv/rDQAKCRAADmhBGVaC FSTKD/421tVlQzGBDN4CZ5TMFPBHb6Fc1aDfaux1BSHaqcTJja0Q6ptEJSMXJVcXBDdHH2uQg2P 4J8SM6VzeFwbmYXiuAhBIvLkCv0ytT07DFUBXR+cHrzWWBgtYG+j6ODS5to/CENMEVkg3N0lTHH IdOEJ+JpZxPyH6mTNRdL2QY55UM7heS4XY3XP6eUpiPu/8epgxqFnf/CAoZ7Qsu/nYxTxYyRzd1 7QlpSUG/Si7OYT5VZm6xexQOc9ldHolPDIpo4dTGJVXfcJv4hvv8oErZ/YW0AqraeZFLNIDXbOO m1PtEQ/uGwi8oxicHv92epcrDpwYh1GbebL3FH6df3pT5ULgh4MrdqLoCAFOzrYA81NcO0Tge06 ecFG6Sd5GqwS78ENkegPAVtVm/GmB7o3enmPijPDIypWprvT3DtEgk46bBVTite1/AD/pP8ZB7I hi3JUCquT9U2DKQutP4PzqYRBV3peuMDGphug7f60LEvie9tmHtp/wTkhcwWoOe5zuxDoycs9zg teGXCjKvN5mp+X62qt78IS63WF68jIDkXjFMh/34vUd9+owsaxZ7x55721tzbdyPXpUGxXuSeWt x83iINHSiVWKtvB5fPtuvtup27JEvy8ZY7ql0jX/yvUd0DjNSSaFdz0+I9QVwnjNRj6Rro8Iozs 4T1mDIESSf78AZQ== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 Currently we pass back the size and whether it has been modified, but those just mirror values tracked inside the delegation. In a later patch, we'll need to get at the timestamps in the delegation too, so just pass back a reference to the write delegation, and use that to properly override values in the iattr. Signed-off-by: Jeff Layton --- fs/nfsd/nfs4state.c | 17 ++++++++--------- fs/nfsd/nfs4xdr.c | 16 ++++++++++------ fs/nfsd/state.h | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 1cb09daa7dc2033af37e4e5b2c6d500217d67cf3..ecf02badf598d147feb5133cb43= 225e3611d6d8e 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -8831,8 +8831,7 @@ nfsd4_get_writestateid(struct nfsd4_compound_state *c= state, * nfsd4_deleg_getattr_conflict - Recall if GETATTR causes conflict * @rqstp: RPC transaction context * @dentry: dentry of inode to be checked for a conflict - * @modified: return true if file was modified - * @size: new size of file if modified is true + * @pdp: returned WRITE delegation, if one was found * * This function is called when there is a conflict between a write * delegation and a change/size GETATTR from another client. The server @@ -8842,11 +8841,12 @@ nfsd4_get_writestateid(struct nfsd4_compound_state = *cstate, * 18.7.4. * * Returns 0 if there is no conflict; otherwise an nfs_stat - * code is returned. + * code is returned. If @pdp is set to a non-NULL value, then the + * caller must put the reference. */ __be32 nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct dentry *dentry, - bool *modified, u64 *size) + struct nfs4_delegation **pdp) { __be32 status; struct nfsd_net *nn =3D net_generic(SVC_NET(rqstp), nfsd_net_id); @@ -8857,10 +8857,9 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp,= struct dentry *dentry, struct nfs4_cb_fattr *ncf; struct inode *inode =3D d_inode(dentry); =20 - *modified =3D false; ctx =3D locks_inode_context(inode); if (!ctx) - return 0; + return nfs_ok; =20 #define NON_NFSD_LEASE ((void *)1) =20 @@ -8926,10 +8925,10 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp= , struct dentry *dentry, goto out_status; } ncf->ncf_cur_fsize =3D ncf->ncf_cb_fsize; - *size =3D ncf->ncf_cur_fsize; - *modified =3D true; + *pdp =3D dp; + return nfs_ok; } - status =3D 0; + status =3D nfs_ok; out_status: nfs4_put_stid(&dp->dl_stid); return status; diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index d028daf77549c75ba1bb5e4b7c11ffd9896ff320..ccaee73de72bfd85b6b1ff59570= 8a99e9bd5b8a4 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -3511,6 +3511,7 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xd= r_stream *xdr, int ignore_crossmnt) { DECLARE_BITMAP(attr_bitmap, ARRAY_SIZE(nfsd4_enc_fattr4_encode_ops)); + struct nfs4_delegation *dp =3D NULL; struct nfsd4_fattr_args args; struct svc_fh *tempfh =3D NULL; int starting_len =3D xdr->buf->len; @@ -3525,8 +3526,6 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xd= r_stream *xdr, .dentry =3D dentry, }; unsigned long bit; - bool file_modified =3D false; - u64 size =3D 0; =20 WARN_ON_ONCE(bmval[1] & NFSD_WRITEONLY_ATTRS_WORD1); WARN_ON_ONCE(!nfsd_attrs_supported(minorversion, bmval)); @@ -3555,8 +3554,7 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xd= r_stream *xdr, goto out; } if (attrmask[0] & (FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE)) { - status =3D nfsd4_deleg_getattr_conflict(rqstp, dentry, - &file_modified, &size); + status =3D nfsd4_deleg_getattr_conflict(rqstp, dentry, &dp); if (status) goto out; } @@ -3564,10 +3562,16 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct = xdr_stream *xdr, err =3D vfs_getattr(&path, &args.stat, STATX_BASIC_STATS | STATX_BTIME | STATX_CHANGE_COOKIE, AT_STATX_SYNC_AS_STAT); + if (dp) { + struct nfs4_cb_fattr *ncf =3D &dp->dl_cb_fattr; + + if (ncf->ncf_file_modified) + args.stat.size =3D ncf->ncf_cur_fsize; + + nfs4_put_stid(&dp->dl_stid); + } if (err) goto out_nfserr; - if (file_modified) - args.stat.size =3D size; =20 if (!(args.stat.result_mask & STATX_BTIME)) /* underlying FS does not offer btime so we can't share it */ diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index ac3a29224806498fb84bacf2bf046ae78cbfac82..c7c7ec21e5104761221bd78b311= 10d902df1dc9b 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -781,5 +781,5 @@ static inline bool try_to_expire_client(struct nfs4_cli= ent *clp) } =20 extern __be32 nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, - struct dentry *dentry, bool *file_modified, u64 *size); + struct dentry *dentry, struct nfs4_delegation **pdp); #endif /* NFSD4_STATE_H */ --=20 2.46.2