* [RFC PATCH 0/2] Remove union from struct knfsd_fh
@ 2025-06-20 12:31 Chuck Lever
2025-06-20 12:31 ` [RFC PATCH 1/2] NFSD: Access a knfsd_fh's fsid by pointer Chuck Lever
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Chuck Lever @ 2025-06-20 12:31 UTC (permalink / raw)
To: NeilBrown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Christoph Hellwig, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
This is a low-risk way to simplify the knfsd_fh struct, based on
Christoph's suggestion of using array indices rather than u8
fields.
Compile-tested only.
Chuck Lever (2):
NFSD: Access a knfsd_fh's fsid by pointer
NFSD: Simplify struct knfsd_fh
fs/nfsd/nfs4layouts.c | 4 ++--
fs/nfsd/nfsfh.c | 16 +++++++++-------
fs/nfsd/nfsfh.h | 26 +++++++++++++++-----------
3 files changed, 26 insertions(+), 20 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [RFC PATCH 1/2] NFSD: Access a knfsd_fh's fsid by pointer 2025-06-20 12:31 [RFC PATCH 0/2] Remove union from struct knfsd_fh Chuck Lever @ 2025-06-20 12:31 ` Chuck Lever 2025-06-23 7:32 ` Christoph Hellwig 2025-06-20 12:31 ` [RFC PATCH 2/2] NFSD: Simplify struct knfsd_fh Chuck Lever 2025-06-20 13:32 ` [RFC PATCH 0/2] Remove union from " Jeff Layton 2 siblings, 1 reply; 6+ messages in thread From: Chuck Lever @ 2025-06-20 12:31 UTC (permalink / raw) To: NeilBrown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey Cc: linux-nfs, Christoph Hellwig, Chuck Lever From: Chuck Lever <chuck.lever@oracle.com> I'm about to remove the union in struct knfsd_fh. First step is to add an accessor function for the file handle's fsid portion. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- fs/nfsd/nfs4layouts.c | 4 ++-- fs/nfsd/nfsfh.c | 16 +++++++++------- fs/nfsd/nfsfh.h | 11 +++++++++-- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/fs/nfsd/nfs4layouts.c b/fs/nfsd/nfs4layouts.c index 290271ac4245..aea905fcaf87 100644 --- a/fs/nfsd/nfs4layouts.c +++ b/fs/nfsd/nfs4layouts.c @@ -65,7 +65,7 @@ nfsd4_alloc_devid_map(const struct svc_fh *fhp) return; map->fsid_type = fh->fh_fsid_type; - memcpy(&map->fsid, fh->fh_fsid, fsid_len); + memcpy(&map->fsid, fh_fsid(fh), fsid_len); spin_lock(&nfsd_devid_lock); if (fhp->fh_export->ex_devid_map) @@ -75,7 +75,7 @@ nfsd4_alloc_devid_map(const struct svc_fh *fhp) list_for_each_entry(old, &nfsd_devid_hash[i], hash) { if (old->fsid_type != fh->fh_fsid_type) continue; - if (memcmp(old->fsid, fh->fh_fsid, + if (memcmp(old->fsid, fh_fsid(fh), key_len(old->fsid_type))) continue; diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index aef474f1b84b..4565112d0324 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -172,6 +172,8 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct net *net, if (len == 0) return error; if (fh->fh_fsid_type == FSID_MAJOR_MINOR) { + u32 *fsid = fh_fsid(fh); + /* deprecated, convert to type 3 */ len = key_len(FSID_ENCODE_DEV)/4; fh->fh_fsid_type = FSID_ENCODE_DEV; @@ -181,17 +183,17 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct net *net, * confuses sparse, so we must use __force here to * keep it from complaining. */ - fh->fh_fsid[0] = new_encode_dev(MKDEV(ntohl((__force __be32)fh->fh_fsid[0]), - ntohl((__force __be32)fh->fh_fsid[1]))); - fh->fh_fsid[1] = fh->fh_fsid[2]; + fsid[0] = new_encode_dev(MKDEV(ntohl((__force __be32)fsid[0]), + ntohl((__force __be32)fsid[1]))); + fsid[1] = fsid[2]; } data_left -= len; if (data_left < 0) return error; exp = rqst_exp_find(rqstp ? &rqstp->rq_chandle : NULL, net, client, gssclient, - fh->fh_fsid_type, fh->fh_fsid); - fid = (struct fid *)(fh->fh_fsid + len); + fh->fh_fsid_type, fh_fsid(fh)); + fid = (struct fid *)(fh_fsid(fh) + len); error = nfserr_stale; if (IS_ERR(exp)) { @@ -463,7 +465,7 @@ static void _fh_update(struct svc_fh *fhp, struct svc_export *exp, { if (dentry != exp->ex_path.dentry) { struct fid *fid = (struct fid *) - (fhp->fh_handle.fh_fsid + fhp->fh_handle.fh_size/4 - 1); + (fh_fsid(&fhp->fh_handle) + fhp->fh_handle.fh_size/4 - 1); int maxsize = (fhp->fh_maxsize - fhp->fh_handle.fh_size)/4; int fh_flags = (exp->ex_flags & NFSEXP_NOSUBTREECHECK) ? 0 : EXPORT_FH_CONNECTABLE; @@ -614,7 +616,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, fhp->fh_handle.fh_auth_type = 0; mk_fsid(fhp->fh_handle.fh_fsid_type, - fhp->fh_handle.fh_fsid, + fh_fsid(&fhp->fh_handle), ex_dev, d_inode(exp->ex_path.dentry)->i_ino, exp->ex_fsid, exp->ex_uuid); diff --git a/fs/nfsd/nfsfh.h b/fs/nfsd/nfsfh.h index 760e77f3630b..4569b5950b55 100644 --- a/fs/nfsd/nfsfh.h +++ b/fs/nfsd/nfsfh.h @@ -56,11 +56,15 @@ struct knfsd_fh { u8 fh_auth_type; /* deprecated */ u8 fh_fsid_type; u8 fh_fileid_type; - u32 fh_fsid[NFS4_FHSIZE / 4 - 1]; }; }; }; +static inline u32 *fh_fsid(const struct knfsd_fh *fh) +{ + return (u32 *)&fh->fh_raw[4]; +} + static inline __u32 ino_t_to_u32(ino_t ino) { return (__u32) ino; @@ -260,9 +264,12 @@ static inline bool fh_match(const struct knfsd_fh *fh1, static inline bool fh_fsid_match(const struct knfsd_fh *fh1, const struct knfsd_fh *fh2) { + u32 *fsid1 = fh_fsid(fh1); + u32 *fsid2 = fh_fsid(fh2); + if (fh1->fh_fsid_type != fh2->fh_fsid_type) return false; - if (memcmp(fh1->fh_fsid, fh2->fh_fsid, key_len(fh1->fh_fsid_type)) != 0) + if (memcmp(fsid1, fsid2, key_len(fh1->fh_fsid_type)) != 0) return false; return true; } -- 2.49.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFC PATCH 1/2] NFSD: Access a knfsd_fh's fsid by pointer 2025-06-20 12:31 ` [RFC PATCH 1/2] NFSD: Access a knfsd_fh's fsid by pointer Chuck Lever @ 2025-06-23 7:32 ` Christoph Hellwig 0 siblings, 0 replies; 6+ messages in thread From: Christoph Hellwig @ 2025-06-23 7:32 UTC (permalink / raw) To: Chuck Lever Cc: NeilBrown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey, linux-nfs, Christoph Hellwig, Chuck Lever On Fri, Jun 20, 2025 at 08:31:54AM -0400, Chuck Lever wrote: > + fsid[0] = new_encode_dev(MKDEV(ntohl((__force __be32)fsid[0]), > + ntohl((__force __be32)fsid[1]))); Maybe avoid the overly long line by reducing the somewhat pointlessly large indentation? Otherwise looks good: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [RFC PATCH 2/2] NFSD: Simplify struct knfsd_fh 2025-06-20 12:31 [RFC PATCH 0/2] Remove union from struct knfsd_fh Chuck Lever 2025-06-20 12:31 ` [RFC PATCH 1/2] NFSD: Access a knfsd_fh's fsid by pointer Chuck Lever @ 2025-06-20 12:31 ` Chuck Lever 2025-06-23 7:33 ` Christoph Hellwig 2025-06-20 13:32 ` [RFC PATCH 0/2] Remove union from " Jeff Layton 2 siblings, 1 reply; 6+ messages in thread From: Chuck Lever @ 2025-06-20 12:31 UTC (permalink / raw) To: NeilBrown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey Cc: linux-nfs, Christoph Hellwig, Chuck Lever From: Chuck Lever <chuck.lever@oracle.com> Compilers are allowed to insert padding and reorder the fields in a struct, so using a union of an array and a struct in struct knfsd_fh is not reliable. The position of elements in an array is more reliable. Suggested-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- fs/nfsd/nfsfh.h | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/fs/nfsd/nfsfh.h b/fs/nfsd/nfsfh.h index 4569b5950b55..1cf979722521 100644 --- a/fs/nfsd/nfsfh.h +++ b/fs/nfsd/nfsfh.h @@ -49,17 +49,14 @@ struct knfsd_fh { * Points to the current size while * building a new file handle. */ - union { - char fh_raw[NFS4_FHSIZE]; - struct { - u8 fh_version; /* == 1 */ - u8 fh_auth_type; /* deprecated */ - u8 fh_fsid_type; - u8 fh_fileid_type; - }; - }; + u8 fh_raw[NFS4_FHSIZE]; }; +#define fh_version fh_raw[0] +#define fh_auth_type fh_raw[1] +#define fh_fsid_type fh_raw[2] +#define fh_fileid_type fh_raw[3] + static inline u32 *fh_fsid(const struct knfsd_fh *fh) { return (u32 *)&fh->fh_raw[4]; -- 2.49.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFC PATCH 2/2] NFSD: Simplify struct knfsd_fh 2025-06-20 12:31 ` [RFC PATCH 2/2] NFSD: Simplify struct knfsd_fh Chuck Lever @ 2025-06-23 7:33 ` Christoph Hellwig 0 siblings, 0 replies; 6+ messages in thread From: Christoph Hellwig @ 2025-06-23 7:33 UTC (permalink / raw) To: Chuck Lever Cc: NeilBrown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey, linux-nfs, Christoph Hellwig, Chuck Lever > +#define fh_version fh_raw[0] > +#define fh_auth_type fh_raw[1] > +#define fh_fsid_type fh_raw[2] > +#define fh_fileid_type fh_raw[3] I guess that works, even if I find struct field defines a bit confusing. Either way it is better than what we had before, so: Reviewed-by: Christoph Hellwig <hch@lst.de> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC PATCH 0/2] Remove union from struct knfsd_fh 2025-06-20 12:31 [RFC PATCH 0/2] Remove union from struct knfsd_fh Chuck Lever 2025-06-20 12:31 ` [RFC PATCH 1/2] NFSD: Access a knfsd_fh's fsid by pointer Chuck Lever 2025-06-20 12:31 ` [RFC PATCH 2/2] NFSD: Simplify struct knfsd_fh Chuck Lever @ 2025-06-20 13:32 ` Jeff Layton 2 siblings, 0 replies; 6+ messages in thread From: Jeff Layton @ 2025-06-20 13:32 UTC (permalink / raw) To: Chuck Lever, NeilBrown, Olga Kornievskaia, Dai Ngo, Tom Talpey Cc: linux-nfs, Christoph Hellwig, Chuck Lever On Fri, 2025-06-20 at 08:31 -0400, Chuck Lever wrote: > From: Chuck Lever <chuck.lever@oracle.com> > > This is a low-risk way to simplify the knfsd_fh struct, based on > Christoph's suggestion of using array indices rather than u8 > fields. > > Compile-tested only. > > Chuck Lever (2): > NFSD: Access a knfsd_fh's fsid by pointer > NFSD: Simplify struct knfsd_fh > > fs/nfsd/nfs4layouts.c | 4 ++-- > fs/nfsd/nfsfh.c | 16 +++++++++------- > fs/nfsd/nfsfh.h | 26 +++++++++++++++----------- > 3 files changed, 26 insertions(+), 20 deletions(-) This all looks pretty sane to me. Overall, just a simpler way to define this struct. Reviewed-by: Jeff Layton <jlayton@kernel.org> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-06-23 7:33 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-20 12:31 [RFC PATCH 0/2] Remove union from struct knfsd_fh Chuck Lever 2025-06-20 12:31 ` [RFC PATCH 1/2] NFSD: Access a knfsd_fh's fsid by pointer Chuck Lever 2025-06-23 7:32 ` Christoph Hellwig 2025-06-20 12:31 ` [RFC PATCH 2/2] NFSD: Simplify struct knfsd_fh Chuck Lever 2025-06-23 7:33 ` Christoph Hellwig 2025-06-20 13:32 ` [RFC PATCH 0/2] Remove union from " Jeff Layton
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox