forked from Minki/linux
NFSD: simplify struct nfsfh
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>
This commit is contained in:
parent
c645a883df
commit
d8b26071e6
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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));
|
||||
|
@ -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]);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -43,44 +43,24 @@
|
||||
* 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 {
|
||||
|
||||
struct knfsd_fh {
|
||||
unsigned int fh_size; /*
|
||||
* Points to the current size while
|
||||
* building a new file handle.
|
||||
*/
|
||||
union {
|
||||
char fh_raw[NFS4_FHSIZE];
|
||||
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 */
|
||||
u8 fh_version; /* == 1 */
|
||||
u8 fh_auth_type; /* deprecated */
|
||||
u8 fh_fsid_type;
|
||||
u8 fh_fileid_type;
|
||||
u32 fh_fsid[]; /* flexible-array member */
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
struct knfsd_fh {
|
||||
unsigned int fh_size; /* significant for NFSv3.
|
||||
* 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;
|
||||
};
|
||||
|
||||
#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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user