OSDN Git Service

NFSD: simplify struct nfsfh
authorNeilBrown <neilb@suse.de>
Thu, 2 Sep 2021 01:16:32 +0000 (11:16 +1000)
committerJ. Bruce Fields <bfields@redhat.com>
Sat, 2 Oct 2021 19:51:10 +0000 (15:51 -0400)
Most of the fields in 'struct knfsd_fh' are 2 levels deep (a union and a
struct) and are accessed using macros like:

 #define fh_FOO fh_base.fh_new.fb_FOO

This patch makes the union and struct anonymous, so that "fh_FOO" can be
a name directly within 'struct knfsd_fh' and the #defines aren't needed.

The file handle as a whole is sometimes accessed as "fh_base" or
"fh_base.fh_pad", neither of which are particularly helpful names.
As the struct holding the filehandle is now anonymous, we
cannot use the name of that, so we union it with 'fh_raw' and use that
where the raw filehandle is needed.  fh_raw also ensure the structure is
large enough for the largest possible filehandle.

fh_raw is a 'char' array, removing any need to cast it for memcpy etc.

SVCFH_fmt() is simplified using the "%ph" printk format.  This
changes the appearance of filehandles in dprintk() debugging, making
them a little more precise.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/flexfilelayout.c
fs/nfsd/lockd.c
fs/nfsd/nfs3xdr.c
fs/nfsd/nfs4callback.c
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4state.c
fs/nfsd/nfs4xdr.c
fs/nfsd/nfsctl.c
fs/nfsd/nfsfh.c
fs/nfsd/nfsfh.h
fs/nfsd/nfsxdr.c

index db7ef07..2e2f1d5 100644 (file)
@@ -61,7 +61,7 @@ nfsd4_ff_proc_layoutget(struct inode *inode, const struct svc_fh *fhp,
                goto out_error;
 
        fl->fh.size = fhp->fh_handle.fh_size;
-       memcpy(fl->fh.data, &fhp->fh_handle.fh_base, fl->fh.size);
+       memcpy(fl->fh.data, &fhp->fh_handle.fh_raw, fl->fh.size);
 
        /* Give whole file layout segments */
        seg->offset = 0;
index 606fa15..46a7f9b 100644 (file)
@@ -35,7 +35,7 @@ nlm_fopen(struct svc_rqst *rqstp, struct nfs_fh *f, struct file **filp,
        /* must initialize before using! but maxsize doesn't matter */
        fh_init(&fh,0);
        fh.fh_handle.fh_size = f->size;
-       memcpy((char*)&fh.fh_handle.fh_base, f->data, f->size);
+       memcpy(&fh.fh_handle.fh_raw, f->data, f->size);
        fh.fh_export = NULL;
 
        access = (mode == O_WRONLY) ? NFSD_MAY_WRITE : NFSD_MAY_READ;
index 0a5ebc5..3d37923 100644 (file)
@@ -92,7 +92,7 @@ svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, struct svc_fh *fhp)
                return false;
        fh_init(fhp, NFS3_FHSIZE);
        fhp->fh_handle.fh_size = size;
-       memcpy(&fhp->fh_handle.fh_base, p, size);
+       memcpy(&fhp->fh_handle.fh_raw, p, size);
 
        return true;
 }
@@ -131,7 +131,7 @@ svcxdr_encode_nfs_fh3(struct xdr_stream *xdr, const struct svc_fh *fhp)
        *p++ = cpu_to_be32(size);
        if (size)
                p[XDR_QUADLEN(size) - 1] = 0;
-       memcpy(p, &fhp->fh_handle.fh_base, size);
+       memcpy(p, &fhp->fh_handle.fh_raw, size);
 
        return true;
 }
index 0f8b10f..11f8715 100644 (file)
@@ -121,7 +121,7 @@ static void encode_nfs_fh4(struct xdr_stream *xdr, const struct knfsd_fh *fh)
 
        BUG_ON(length > NFS4_FHSIZE);
        p = xdr_reserve_space(xdr, 4 + length);
-       xdr_encode_opaque(p, &fh->fh_base, length);
+       xdr_encode_opaque(p, &fh->fh_raw, length);
 }
 
 /*
index 486c5db..3f7e59e 100644 (file)
@@ -519,7 +519,7 @@ nfsd4_putfh(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        fh_put(&cstate->current_fh);
        cstate->current_fh.fh_handle.fh_size = putfh->pf_fhlen;
-       memcpy(&cstate->current_fh.fh_handle.fh_base, putfh->pf_fhval,
+       memcpy(&cstate->current_fh.fh_handle.fh_raw, putfh->pf_fhval,
               putfh->pf_fhlen);
        ret = fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_BYPASS_GSS);
 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
@@ -1383,7 +1383,7 @@ nfsd4_setup_inter_ssc(struct svc_rqst *rqstp,
        s_fh = &cstate->save_fh;
 
        copy->c_fh.size = s_fh->fh_handle.fh_size;
-       memcpy(copy->c_fh.data, &s_fh->fh_handle.fh_base, copy->c_fh.size);
+       memcpy(copy->c_fh.data, &s_fh->fh_handle.fh_raw, copy->c_fh.size);
        copy->stateid.seqid = cpu_to_be32(s_stid->si_generation);
        memcpy(copy->stateid.other, (void *)&s_stid->si_opaque,
               sizeof(stateid_opaque_t));
index 4235641..88c0a5c 100644 (file)
@@ -1010,7 +1010,7 @@ static int delegation_blocked(struct knfsd_fh *fh)
                }
                spin_unlock(&blocked_delegations_lock);
        }
-       hash = jhash(&fh->fh_base, fh->fh_size, 0);
+       hash = jhash(&fh->fh_raw, fh->fh_size, 0);
        if (test_bit(hash&255, bd->set[0]) &&
            test_bit((hash>>8)&255, bd->set[0]) &&
            test_bit((hash>>16)&255, bd->set[0]))
@@ -1029,7 +1029,7 @@ static void block_delegations(struct knfsd_fh *fh)
        u32 hash;
        struct bloom_pair *bd = &blocked_delegations;
 
-       hash = jhash(&fh->fh_base, fh->fh_size, 0);
+       hash = jhash(&fh->fh_raw, fh->fh_size, 0);
 
        spin_lock(&blocked_delegations_lock);
        __set_bit(hash&255, bd->set[bd->new]);
index 7abeccb..a54b284 100644 (file)
@@ -3110,7 +3110,7 @@ out_acl:
                p = xdr_reserve_space(xdr, fhp->fh_handle.fh_size + 4);
                if (!p)
                        goto out_resource;
-               p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base,
+               p = xdr_encode_opaque(p, &fhp->fh_handle.fh_raw,
                                        fhp->fh_handle.fh_size);
        }
        if (bmval0 & FATTR4_WORD0_FILEID) {
@@ -3667,7 +3667,7 @@ nfsd4_encode_getfh(struct nfsd4_compoundres *resp, __be32 nfserr, struct svc_fh
        p = xdr_reserve_space(xdr, len + 4);
        if (!p)
                return nfserr_resource;
-       p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base, len);
+       p = xdr_encode_opaque(p, &fhp->fh_handle.fh_raw, len);
        return 0;
 }
 
index c2c3d90..5e48bc4 100644 (file)
@@ -395,12 +395,12 @@ static ssize_t write_filehandle(struct file *file, char *buf, size_t size)
        auth_domain_put(dom);
        if (len)
                return len;
-       
+
        mesg = buf;
        len = SIMPLE_TRANSACTION_LIMIT;
-       qword_addhex(&mesg, &len, (char*)&fh.fh_base, fh.fh_size);
+       qword_addhex(&mesg, &len, fh.fh_raw, fh.fh_size);
        mesg[-1] = '\n';
-       return mesg - buf;      
+       return mesg - buf;
 }
 
 /*
index 149f9bb..f3779fa 100644 (file)
@@ -640,16 +640,11 @@ fh_put(struct svc_fh *fhp)
 char * SVCFH_fmt(struct svc_fh *fhp)
 {
        struct knfsd_fh *fh = &fhp->fh_handle;
+       static char buf[2+1+1+64*3+1];
 
-       static char buf[80];
-       sprintf(buf, "%d: %08x %08x %08x %08x %08x %08x",
-               fh->fh_size,
-               fh->fh_base.fh_pad[0],
-               fh->fh_base.fh_pad[1],
-               fh->fh_base.fh_pad[2],
-               fh->fh_base.fh_pad[3],
-               fh->fh_base.fh_pad[4],
-               fh->fh_base.fh_pad[5]);
+       if (fh->fh_size < 0 || fh->fh_size> 64)
+               return "bad-fh";
+       sprintf(buf, "%d: %*ph", fh->fh_size, fh->fh_size, fh->fh_raw);
        return buf;
 }
 
index 8b5587f..d11e4b6 100644 (file)
  *   filesystems must not use the values '0' or '0xff'. 'See enum fid_type'
  *   in include/linux/exportfs.h for currently registered values.
  */
-struct nfs_fhbase_new {
-       union {
-               struct {
-                       u8              fb_version_aux; /* == 1 */
-                       u8              fb_auth_type_aux;
-                       u8              fb_fsid_type_aux;
-                       u8              fb_fileid_type_aux;
-                       u32             fb_auth[1];
-               /*      u32             fb_fsid[0]; floating */
-               /*      u32             fb_fileid[0]; floating */
-               };
-               struct {
-                       u8              fb_version;     /* == 1 */
-                       u8              fb_auth_type;
-                       u8              fb_fsid_type;
-                       u8              fb_fileid_type;
-                       u32             fb_auth_flex[]; /* flexible-array member */
-               };
-       };
-};
 
 struct knfsd_fh {
-       unsigned int    fh_size;        /* significant for NFSv3.
-                                        * Points to the current size while building
-                                        * a new file handle
+       unsigned int    fh_size;        /*
+                                        * Points to the current size while
+                                        * building a new file handle.
                                         */
        union {
-               u32                     fh_pad[NFS4_FHSIZE/4];
-               struct nfs_fhbase_new   fh_new;
-       } fh_base;
+               char                    fh_raw[NFS4_FHSIZE];
+               struct {
+                       u8              fh_version;     /* == 1 */
+                       u8              fh_auth_type;   /* deprecated */
+                       u8              fh_fsid_type;
+                       u8              fh_fileid_type;
+                       u32             fh_fsid[]; /* flexible-array member */
+               };
+       };
 };
 
-#define        fh_version              fh_base.fh_new.fb_version
-#define        fh_fsid_type            fh_base.fh_new.fb_fsid_type
-#define        fh_auth_type            fh_base.fh_new.fb_auth_type
-#define        fh_fileid_type          fh_base.fh_new.fb_fileid_type
-#define        fh_fsid                 fh_base.fh_new.fb_auth_flex
-
 static inline __u32 ino_t_to_u32(ino_t ino)
 {
        return (__u32) ino;
@@ -255,7 +235,7 @@ static inline void
 fh_copy_shallow(struct knfsd_fh *dst, struct knfsd_fh *src)
 {
        dst->fh_size = src->fh_size;
-       memcpy(&dst->fh_base, &src->fh_base, src->fh_size);
+       memcpy(&dst->fh_raw, &src->fh_raw, src->fh_size);
 }
 
 static __inline__ struct svc_fh *
@@ -270,7 +250,7 @@ static inline bool fh_match(struct knfsd_fh *fh1, struct knfsd_fh *fh2)
 {
        if (fh1->fh_size != fh2->fh_size)
                return false;
-       if (memcmp(fh1->fh_base.fh_pad, fh2->fh_base.fh_pad, fh1->fh_size) != 0)
+       if (memcmp(fh1->fh_raw, fh2->fh_raw, fh1->fh_size) != 0)
                return false;
        return true;
 }
@@ -294,7 +274,7 @@ static inline bool fh_fsid_match(struct knfsd_fh *fh1, struct knfsd_fh *fh2)
  */
 static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
 {
-       return ~crc32_le(0xFFFFFFFF, (unsigned char *)&fh->fh_base, fh->fh_size);
+       return ~crc32_le(0xFFFFFFFF, fh->fh_raw, fh->fh_size);
 }
 #else
 static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
index a06c05f..082449c 100644 (file)
@@ -64,7 +64,7 @@ svcxdr_decode_fhandle(struct xdr_stream *xdr, struct svc_fh *fhp)
        if (!p)
                return false;
        fh_init(fhp, NFS_FHSIZE);
-       memcpy(&fhp->fh_handle.fh_base, p, NFS_FHSIZE);
+       memcpy(&fhp->fh_handle.fh_raw, p, NFS_FHSIZE);
        fhp->fh_handle.fh_size = NFS_FHSIZE;
 
        return true;
@@ -78,7 +78,7 @@ svcxdr_encode_fhandle(struct xdr_stream *xdr, const struct svc_fh *fhp)
        p = xdr_reserve_space(xdr, NFS_FHSIZE);
        if (!p)
                return false;
-       memcpy(p, &fhp->fh_handle.fh_base, NFS_FHSIZE);
+       memcpy(p, &fhp->fh_handle.fh_raw, NFS_FHSIZE);
 
        return true;
 }