]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFSD: Access a knfsd_fh's fsid by pointer
authorChuck Lever <chuck.lever@oracle.com>
Fri, 20 Jun 2025 12:31:54 +0000 (08:31 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 14 Jul 2025 16:46:46 +0000 (12:46 -0400)
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.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4layouts.c
fs/nfsd/nfsfh.c
fs/nfsd/nfsfh.h

index 290271ac424540e4405a5fd0eacc8db9f47603cd..aea905fcaf87aa1c11481f04b819ab3a41cf19c5 100644 (file)
@@ -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;
 
index aef474f1b84b67eb707e31d7363aebb00d5a1a8d..74cf1f4de17410eab4d8edea867fb114823f809a 100644 (file)
@@ -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);
index 760e77f3630bc7d10a31a4c132155b8cfa483756..4569b5950b55f43e8341d051b8205a35a324f5d4 100644 (file)
@@ -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;
 }