Commit db9b4e94 authored by Trond Myklebust's avatar Trond Myklebust

NFS: Now that file handle comparison ignores the unused parts of the

   file handle container, there is no longer any need to clear the
   file handle container before copying in a file handle.  This
   allows us to remove a 128 byte memset() from several hot paths.
Signed-off-by: default avatarChuck Lever <cel@netapp.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@fys.uio.no>
parent 14671e6f
...@@ -607,11 +607,10 @@ static int ...@@ -607,11 +607,10 @@ static int
nfs_init_locked(struct inode *inode, void *opaque) nfs_init_locked(struct inode *inode, void *opaque)
{ {
struct nfs_find_desc *desc = (struct nfs_find_desc *)opaque; struct nfs_find_desc *desc = (struct nfs_find_desc *)opaque;
struct nfs_fh *fh = desc->fh;
struct nfs_fattr *fattr = desc->fattr; struct nfs_fattr *fattr = desc->fattr;
NFS_FILEID(inode) = fattr->fileid; NFS_FILEID(inode) = fattr->fileid;
memcpy(NFS_FH(inode), fh, sizeof(struct nfs_fh)); nfs_copy_fh(NFS_FH(inode), desc->fh);
return 0; return 0;
} }
...@@ -1284,9 +1283,7 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type, ...@@ -1284,9 +1283,7 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type,
init_nfsv4_state(server); init_nfsv4_state(server);
root = &server->fh; root = &server->fh;
memcpy(root, &data->root, sizeof(*root)); nfs_copy_fh(root, (struct nfs_fh *) &data->root);
if (root->size < sizeof(root->data))
memset(root->data+root->size, 0, sizeof(root->data)-root->size);
if (data->version != NFS_MOUNT_VERSION) { if (data->version != NFS_MOUNT_VERSION) {
printk("nfs warning: mount version %s than kernel\n", printk("nfs warning: mount version %s than kernel\n",
...@@ -1297,7 +1294,6 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type, ...@@ -1297,7 +1294,6 @@ static struct super_block *nfs_get_sb(struct file_system_type *fs_type,
data->bsize = 0; data->bsize = 0;
if (data->version < 4) { if (data->version < 4) {
data->flags &= ~NFS_MOUNT_VER3; data->flags &= ~NFS_MOUNT_VER3;
memset(root, 0, sizeof(*root));
root->size = NFS2_FHSIZE; root->size = NFS2_FHSIZE;
memcpy(root->data, data->old_root.data, NFS2_FHSIZE); memcpy(root->data, data->old_root.data, NFS2_FHSIZE);
} }
......
...@@ -108,7 +108,6 @@ xdr_decode_fhstatus(struct rpc_rqst *req, u32 *p, struct mnt_fhstatus *res) ...@@ -108,7 +108,6 @@ xdr_decode_fhstatus(struct rpc_rqst *req, u32 *p, struct mnt_fhstatus *res)
{ {
struct nfs_fh *fh = res->fh; struct nfs_fh *fh = res->fh;
memset((void *)fh, 0, sizeof(*fh));
if ((res->status = ntohl(*p++)) == 0) { if ((res->status = ntohl(*p++)) == 0) {
fh->size = NFS2_FHSIZE; fh->size = NFS2_FHSIZE;
memcpy(fh->data, p, NFS2_FHSIZE); memcpy(fh->data, p, NFS2_FHSIZE);
...@@ -121,7 +120,6 @@ xdr_decode_fhstatus3(struct rpc_rqst *req, u32 *p, struct mnt_fhstatus *res) ...@@ -121,7 +120,6 @@ xdr_decode_fhstatus3(struct rpc_rqst *req, u32 *p, struct mnt_fhstatus *res)
{ {
struct nfs_fh *fh = res->fh; struct nfs_fh *fh = res->fh;
memset((void *)fh, 0, sizeof(*fh));
if ((res->status = ntohl(*p++)) == 0) { if ((res->status = ntohl(*p++)) == 0) {
int size = ntohl(*p++); int size = ntohl(*p++);
if (size <= NFS3_FHSIZE) { if (size <= NFS3_FHSIZE) {
......
...@@ -77,8 +77,6 @@ xdr_encode_fhandle(u32 *p, struct nfs_fh *fhandle) ...@@ -77,8 +77,6 @@ xdr_encode_fhandle(u32 *p, struct nfs_fh *fhandle)
static inline u32 * static inline u32 *
xdr_decode_fhandle(u32 *p, struct nfs_fh *fhandle) xdr_decode_fhandle(u32 *p, struct nfs_fh *fhandle)
{ {
/* Zero handle first to allow comparisons */
memset(fhandle, 0, sizeof(*fhandle));
/* NFSv2 handles have a fixed length */ /* NFSv2 handles have a fixed length */
fhandle->size = NFS2_FHSIZE; fhandle->size = NFS2_FHSIZE;
memcpy(fhandle->data, p, NFS2_FHSIZE); memcpy(fhandle->data, p, NFS2_FHSIZE);
......
...@@ -109,10 +109,6 @@ xdr_encode_fhandle(u32 *p, struct nfs_fh *fh) ...@@ -109,10 +109,6 @@ xdr_encode_fhandle(u32 *p, struct nfs_fh *fh)
static inline u32 * static inline u32 *
xdr_decode_fhandle(u32 *p, struct nfs_fh *fh) xdr_decode_fhandle(u32 *p, struct nfs_fh *fh)
{ {
/*
* Zero all nonused bytes
*/
memset((u8 *)fh, 0, sizeof(*fh));
if ((fh->size = ntohl(*p++)) <= NFS3_FHSIZE) { if ((fh->size = ntohl(*p++)) <= NFS3_FHSIZE) {
memcpy(fh->data, p, fh->size); memcpy(fh->data, p, fh->size);
return p + XDR_QUADLEN(fh->size); return p + XDR_QUADLEN(fh->size);
......
...@@ -495,10 +495,8 @@ static int __init root_nfs_get_handle(void) ...@@ -495,10 +495,8 @@ static int __init root_nfs_get_handle(void)
if (status < 0) if (status < 0)
printk(KERN_ERR "Root-NFS: Server returned error %d " printk(KERN_ERR "Root-NFS: Server returned error %d "
"while mounting %s\n", status, nfs_path); "while mounting %s\n", status, nfs_path);
else { else
nfs_data.root.size = fh.size; nfs_copy_fh(nfs_data.root, fh);
memcpy(nfs_data.root.data, fh.data, fh.size);
}
return status; return status;
} }
......
...@@ -148,6 +148,12 @@ static inline int nfs_compare_fh(const struct nfs_fh *a, const struct nfs_fh *b) ...@@ -148,6 +148,12 @@ static inline int nfs_compare_fh(const struct nfs_fh *a, const struct nfs_fh *b)
return a->size != b->size || memcmp(a->data, b->data, a->size) != 0; return a->size != b->size || memcmp(a->data, b->data, a->size) != 0;
} }
static inline void nfs_copy_fh(struct nfs_fh *target, const struct nfs_fh *source)
{
target->size = source->size;
memcpy(target->data, source->data, source->size);
}
/* /*
* This is really a general kernel constant, but since nothing like * This is really a general kernel constant, but since nothing like
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment