nfsd: clean up fh_auth usage

Use fh_fsid when reffering to the fsid part of the filehandle.  The
variable length auth field envisioned in nfsfh wasn't ever implemented.
Also clean up some lose ends around this and document the file handle
format better.

Btw, why do we even export nfsfh.h to userspace?  The file handle very
much is kernel private, and nothing in nfs-utils include the header
either.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
Christoph Hellwig 2014-05-07 13:49:44 +02:00 committed by J. Bruce Fields
parent ecc7455d8e
commit 5409e46f1b
2 changed files with 16 additions and 36 deletions

View File

@ -169,8 +169,8 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
data_left -= len; data_left -= len;
if (data_left < 0) if (data_left < 0)
return error; return error;
exp = rqst_exp_find(rqstp, fh->fh_fsid_type, fh->fh_auth); exp = rqst_exp_find(rqstp, fh->fh_fsid_type, fh->fh_fsid);
fid = (struct fid *)(fh->fh_auth + len); fid = (struct fid *)(fh->fh_fsid + len);
} else { } else {
__u32 tfh[2]; __u32 tfh[2];
dev_t xdev; dev_t xdev;
@ -385,7 +385,7 @@ static void _fh_update(struct svc_fh *fhp, struct svc_export *exp,
{ {
if (dentry != exp->ex_path.dentry) { if (dentry != exp->ex_path.dentry) {
struct fid *fid = (struct fid *) struct fid *fid = (struct fid *)
(fhp->fh_handle.fh_auth + fhp->fh_handle.fh_size/4 - 1); (fhp->fh_handle.fh_fsid + fhp->fh_handle.fh_size/4 - 1);
int maxsize = (fhp->fh_maxsize - fhp->fh_handle.fh_size)/4; int maxsize = (fhp->fh_maxsize - fhp->fh_handle.fh_size)/4;
int subtreecheck = !(exp->ex_flags & NFSEXP_NOSUBTREECHECK); int subtreecheck = !(exp->ex_flags & NFSEXP_NOSUBTREECHECK);
@ -513,7 +513,6 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
*/ */
struct inode * inode = dentry->d_inode; struct inode * inode = dentry->d_inode;
__u32 *datap;
dev_t ex_dev = exp_sb(exp)->s_dev; dev_t ex_dev = exp_sb(exp)->s_dev;
dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %pd2, ino=%ld)\n", dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %pd2, ino=%ld)\n",
@ -557,17 +556,16 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
if (inode) if (inode)
_fh_update_old(dentry, exp, &fhp->fh_handle); _fh_update_old(dentry, exp, &fhp->fh_handle);
} else { } else {
int len; fhp->fh_handle.fh_size =
key_len(fhp->fh_handle.fh_fsid_type) + 4;
fhp->fh_handle.fh_auth_type = 0; fhp->fh_handle.fh_auth_type = 0;
datap = fhp->fh_handle.fh_auth+0;
mk_fsid(fhp->fh_handle.fh_fsid_type, datap, ex_dev, mk_fsid(fhp->fh_handle.fh_fsid_type,
fhp->fh_handle.fh_fsid,
ex_dev,
exp->ex_path.dentry->d_inode->i_ino, exp->ex_path.dentry->d_inode->i_ino,
exp->ex_fsid, exp->ex_uuid); exp->ex_fsid, exp->ex_uuid);
len = key_len(fhp->fh_handle.fh_fsid_type);
datap += len/4;
fhp->fh_handle.fh_size = 4 + len;
if (inode) if (inode)
_fh_update(fhp, exp, dentry); _fh_update(fhp, exp, dentry);
if (fhp->fh_handle.fh_fileid_type == FILEID_INVALID) { if (fhp->fh_handle.fh_fileid_type == FILEID_INVALID) {

View File

@ -1,13 +1,7 @@
/* /*
* include/linux/nfsd/nfsfh.h
*
* This file describes the layout of the file handles as passed * This file describes the layout of the file handles as passed
* over the wire. * over the wire.
* *
* Earlier versions of knfsd used to sign file handles using keyed MD5
* or SHA. I've removed this code, because it doesn't give you more
* security than blocking external access to port 2049 on your firewall.
*
* Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de> * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
*/ */
@ -37,7 +31,7 @@ struct nfs_fhbase_old {
}; };
/* /*
* This is the new flexible, extensible style NFSv2/v3 file handle. * This is the new flexible, extensible style NFSv2/v3/v4 file handle.
* by Neil Brown <neilb@cse.unsw.edu.au> - March 2000 * by Neil Brown <neilb@cse.unsw.edu.au> - March 2000
* *
* The file handle starts with a sequence of four-byte words. * The file handle starts with a sequence of four-byte words.
@ -47,14 +41,7 @@ struct nfs_fhbase_old {
* *
* All four-byte values are in host-byte-order. * All four-byte values are in host-byte-order.
* *
* The auth_type field specifies how the filehandle can be authenticated * The auth_type field is deprecated and must be set to 0.
* This might allow a file to be confirmed to be in a writable part of a
* filetree without checking the path from it up to the root.
* Current values:
* 0 - No authentication. fb_auth is 0 bytes long
* Possible future values:
* 1 - 4 bytes taken from MD5 hash of the remainer of the file handle
* prefixed by a secret and with the important export flags.
* *
* The fsid_type identifies how the filesystem (or export point) is * The fsid_type identifies how the filesystem (or export point) is
* encoded. * encoded.
@ -71,14 +58,9 @@ struct nfs_fhbase_old {
* 7 - 8 byte inode number and 16 byte uuid * 7 - 8 byte inode number and 16 byte uuid
* *
* The fileid_type identified how the file within the filesystem is encoded. * The fileid_type identified how the file within the filesystem is encoded.
* This is (will be) passed to, and set by, the underlying filesystem if it supports * The values for this field are filesystem specific, exccept that
* filehandle operations. The filesystem must not use the value '0' or '0xff' and may * filesystems must not use the values '0' or '0xff'. 'See enum fid_type'
* only use the values 1 and 2 as defined below: * in include/linux/exportfs.h for currently registered values.
* Current values:
* 0 - The root, or export point, of the filesystem. fb_fileid is 0 bytes.
* 1 - 32bit inode number, 32 bit generation number.
* 2 - 32bit inode number, 32 bit generation number, 32 bit parent directory inode number.
*
*/ */
struct nfs_fhbase_new { struct nfs_fhbase_new {
__u8 fb_version; /* == 1, even => nfs_fhbase_old */ __u8 fb_version; /* == 1, even => nfs_fhbase_old */
@ -114,9 +96,9 @@ struct knfsd_fh {
#define fh_fsid_type fh_base.fh_new.fb_fsid_type #define fh_fsid_type fh_base.fh_new.fb_fsid_type
#define fh_auth_type fh_base.fh_new.fb_auth_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_fileid_type fh_base.fh_new.fb_fileid_type
#define fh_auth fh_base.fh_new.fb_auth
#define fh_fsid fh_base.fh_new.fb_auth #define fh_fsid fh_base.fh_new.fb_auth
/* Do not use, provided for userspace compatiblity. */
#define fh_auth fh_base.fh_new.fb_auth
#endif /* _UAPI_LINUX_NFSD_FH_H */ #endif /* _UAPI_LINUX_NFSD_FH_H */