Commit 54775491 authored by Jan Blunck's avatar Jan Blunck Committed by Linus Torvalds

Use struct path in struct svc_export

I'm embedding struct path into struct svc_export.

[akpm@linux-foundation.org: coding-style fixes]
[ezk@cs.sunysb.edu: NFSD: fix wrong mnt_writer count in rename]
Signed-off-by: default avatarJan Blunck <jblunck@suse.de>
Acked-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Acked-by: default avatarChristoph Hellwig <hch@infradead.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Neil Brown <neilb@suse.de>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: default avatarErez Zadok <ezk@cs.sunysb.edu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 448678a0
...@@ -332,10 +332,9 @@ static void nfsd4_fslocs_free(struct nfsd4_fs_locations *fsloc) ...@@ -332,10 +332,9 @@ static void nfsd4_fslocs_free(struct nfsd4_fs_locations *fsloc)
static void svc_export_put(struct kref *ref) static void svc_export_put(struct kref *ref)
{ {
struct svc_export *exp = container_of(ref, struct svc_export, h.ref); struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
dput(exp->ex_dentry); path_put(&exp->ex_path);
mntput(exp->ex_mnt);
auth_domain_put(exp->ex_client); auth_domain_put(exp->ex_client);
kfree(exp->ex_path); kfree(exp->ex_pathname);
nfsd4_fslocs_free(&exp->ex_fslocs); nfsd4_fslocs_free(&exp->ex_fslocs);
kfree(exp); kfree(exp);
} }
...@@ -349,7 +348,7 @@ static void svc_export_request(struct cache_detail *cd, ...@@ -349,7 +348,7 @@ static void svc_export_request(struct cache_detail *cd,
char *pth; char *pth;
qword_add(bpp, blen, exp->ex_client->name); qword_add(bpp, blen, exp->ex_client->name);
pth = d_path(exp->ex_dentry, exp->ex_mnt, *bpp, *blen); pth = d_path(exp->ex_path.dentry, exp->ex_path.mnt, *bpp, *blen);
if (IS_ERR(pth)) { if (IS_ERR(pth)) {
/* is this correct? */ /* is this correct? */
(*bpp)[0] = '\n'; (*bpp)[0] = '\n';
...@@ -508,7 +507,7 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) ...@@ -508,7 +507,7 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
int an_int; int an_int;
nd.path.dentry = NULL; nd.path.dentry = NULL;
exp.ex_path = NULL; exp.ex_pathname = NULL;
/* fs locations */ /* fs locations */
exp.ex_fslocs.locations = NULL; exp.ex_fslocs.locations = NULL;
...@@ -547,11 +546,11 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) ...@@ -547,11 +546,11 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
exp.h.flags = 0; exp.h.flags = 0;
exp.ex_client = dom; exp.ex_client = dom;
exp.ex_mnt = nd.path.mnt; exp.ex_path.mnt = nd.path.mnt;
exp.ex_dentry = nd.path.dentry; exp.ex_path.dentry = nd.path.dentry;
exp.ex_path = kstrdup(buf, GFP_KERNEL); exp.ex_pathname = kstrdup(buf, GFP_KERNEL);
err = -ENOMEM; err = -ENOMEM;
if (!exp.ex_path) if (!exp.ex_pathname)
goto out; goto out;
/* expiry */ /* expiry */
...@@ -628,7 +627,7 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) ...@@ -628,7 +627,7 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
out: out:
nfsd4_fslocs_free(&exp.ex_fslocs); nfsd4_fslocs_free(&exp.ex_fslocs);
kfree(exp.ex_uuid); kfree(exp.ex_uuid);
kfree(exp.ex_path); kfree(exp.ex_pathname);
if (nd.path.dentry) if (nd.path.dentry)
path_put(&nd.path); path_put(&nd.path);
out_no_path: out_no_path:
...@@ -653,7 +652,7 @@ static int svc_export_show(struct seq_file *m, ...@@ -653,7 +652,7 @@ static int svc_export_show(struct seq_file *m,
return 0; return 0;
} }
exp = container_of(h, struct svc_export, h); exp = container_of(h, struct svc_export, h);
seq_path(m, exp->ex_mnt, exp->ex_dentry, " \t\n\\"); seq_path(m, exp->ex_path.mnt, exp->ex_path.dentry, " \t\n\\");
seq_putc(m, '\t'); seq_putc(m, '\t');
seq_escape(m, exp->ex_client->name, " \t\n\\"); seq_escape(m, exp->ex_client->name, " \t\n\\");
seq_putc(m, '('); seq_putc(m, '(');
...@@ -680,8 +679,8 @@ static int svc_export_match(struct cache_head *a, struct cache_head *b) ...@@ -680,8 +679,8 @@ static int svc_export_match(struct cache_head *a, struct cache_head *b)
struct svc_export *orig = container_of(a, struct svc_export, h); struct svc_export *orig = container_of(a, struct svc_export, h);
struct svc_export *new = container_of(b, struct svc_export, h); struct svc_export *new = container_of(b, struct svc_export, h);
return orig->ex_client == new->ex_client && return orig->ex_client == new->ex_client &&
orig->ex_dentry == new->ex_dentry && orig->ex_path.dentry == new->ex_path.dentry &&
orig->ex_mnt == new->ex_mnt; orig->ex_path.mnt == new->ex_path.mnt;
} }
static void svc_export_init(struct cache_head *cnew, struct cache_head *citem) static void svc_export_init(struct cache_head *cnew, struct cache_head *citem)
...@@ -691,9 +690,9 @@ static void svc_export_init(struct cache_head *cnew, struct cache_head *citem) ...@@ -691,9 +690,9 @@ static void svc_export_init(struct cache_head *cnew, struct cache_head *citem)
kref_get(&item->ex_client->ref); kref_get(&item->ex_client->ref);
new->ex_client = item->ex_client; new->ex_client = item->ex_client;
new->ex_dentry = dget(item->ex_dentry); new->ex_path.dentry = dget(item->ex_path.dentry);
new->ex_mnt = mntget(item->ex_mnt); new->ex_path.mnt = mntget(item->ex_path.mnt);
new->ex_path = NULL; new->ex_pathname = NULL;
new->ex_fslocs.locations = NULL; new->ex_fslocs.locations = NULL;
new->ex_fslocs.locations_count = 0; new->ex_fslocs.locations_count = 0;
new->ex_fslocs.migrated = 0; new->ex_fslocs.migrated = 0;
...@@ -711,8 +710,8 @@ static void export_update(struct cache_head *cnew, struct cache_head *citem) ...@@ -711,8 +710,8 @@ static void export_update(struct cache_head *cnew, struct cache_head *citem)
new->ex_fsid = item->ex_fsid; new->ex_fsid = item->ex_fsid;
new->ex_uuid = item->ex_uuid; new->ex_uuid = item->ex_uuid;
item->ex_uuid = NULL; item->ex_uuid = NULL;
new->ex_path = item->ex_path; new->ex_pathname = item->ex_pathname;
item->ex_path = NULL; item->ex_pathname = NULL;
new->ex_fslocs.locations = item->ex_fslocs.locations; new->ex_fslocs.locations = item->ex_fslocs.locations;
item->ex_fslocs.locations = NULL; item->ex_fslocs.locations = NULL;
new->ex_fslocs.locations_count = item->ex_fslocs.locations_count; new->ex_fslocs.locations_count = item->ex_fslocs.locations_count;
...@@ -755,8 +754,8 @@ svc_export_lookup(struct svc_export *exp) ...@@ -755,8 +754,8 @@ svc_export_lookup(struct svc_export *exp)
struct cache_head *ch; struct cache_head *ch;
int hash; int hash;
hash = hash_ptr(exp->ex_client, EXPORT_HASHBITS); hash = hash_ptr(exp->ex_client, EXPORT_HASHBITS);
hash ^= hash_ptr(exp->ex_dentry, EXPORT_HASHBITS); hash ^= hash_ptr(exp->ex_path.dentry, EXPORT_HASHBITS);
hash ^= hash_ptr(exp->ex_mnt, EXPORT_HASHBITS); hash ^= hash_ptr(exp->ex_path.mnt, EXPORT_HASHBITS);
ch = sunrpc_cache_lookup(&svc_export_cache, &exp->h, ch = sunrpc_cache_lookup(&svc_export_cache, &exp->h,
hash); hash);
...@@ -772,8 +771,8 @@ svc_export_update(struct svc_export *new, struct svc_export *old) ...@@ -772,8 +771,8 @@ svc_export_update(struct svc_export *new, struct svc_export *old)
struct cache_head *ch; struct cache_head *ch;
int hash; int hash;
hash = hash_ptr(old->ex_client, EXPORT_HASHBITS); hash = hash_ptr(old->ex_client, EXPORT_HASHBITS);
hash ^= hash_ptr(old->ex_dentry, EXPORT_HASHBITS); hash ^= hash_ptr(old->ex_path.dentry, EXPORT_HASHBITS);
hash ^= hash_ptr(old->ex_mnt, EXPORT_HASHBITS); hash ^= hash_ptr(old->ex_path.mnt, EXPORT_HASHBITS);
ch = sunrpc_cache_update(&svc_export_cache, &new->h, ch = sunrpc_cache_update(&svc_export_cache, &new->h,
&old->h, &old->h,
...@@ -815,8 +814,8 @@ static int exp_set_key(svc_client *clp, int fsid_type, u32 *fsidv, ...@@ -815,8 +814,8 @@ static int exp_set_key(svc_client *clp, int fsid_type, u32 *fsidv,
key.ek_client = clp; key.ek_client = clp;
key.ek_fsidtype = fsid_type; key.ek_fsidtype = fsid_type;
memcpy(key.ek_fsid, fsidv, key_len(fsid_type)); memcpy(key.ek_fsid, fsidv, key_len(fsid_type));
key.ek_mnt = exp->ex_mnt; key.ek_mnt = exp->ex_path.mnt;
key.ek_dentry = exp->ex_dentry; key.ek_dentry = exp->ex_path.dentry;
key.h.expiry_time = NEVER; key.h.expiry_time = NEVER;
key.h.flags = 0; key.h.flags = 0;
...@@ -870,8 +869,8 @@ static svc_export *exp_get_by_name(svc_client *clp, struct vfsmount *mnt, ...@@ -870,8 +869,8 @@ static svc_export *exp_get_by_name(svc_client *clp, struct vfsmount *mnt,
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
key.ex_client = clp; key.ex_client = clp;
key.ex_mnt = mnt; key.ex_path.mnt = mnt;
key.ex_dentry = dentry; key.ex_path.dentry = dentry;
exp = svc_export_lookup(&key); exp = svc_export_lookup(&key);
if (exp == NULL) if (exp == NULL)
...@@ -968,7 +967,7 @@ static int exp_fsid_hash(svc_client *clp, struct svc_export *exp) ...@@ -968,7 +967,7 @@ static int exp_fsid_hash(svc_client *clp, struct svc_export *exp)
static int exp_hash(struct auth_domain *clp, struct svc_export *exp) static int exp_hash(struct auth_domain *clp, struct svc_export *exp)
{ {
u32 fsid[2]; u32 fsid[2];
struct inode *inode = exp->ex_dentry->d_inode; struct inode *inode = exp->ex_path.dentry->d_inode;
dev_t dev = inode->i_sb->s_dev; dev_t dev = inode->i_sb->s_dev;
if (old_valid_dev(dev)) { if (old_valid_dev(dev)) {
...@@ -982,7 +981,7 @@ static int exp_hash(struct auth_domain *clp, struct svc_export *exp) ...@@ -982,7 +981,7 @@ static int exp_hash(struct auth_domain *clp, struct svc_export *exp)
static void exp_unhash(struct svc_export *exp) static void exp_unhash(struct svc_export *exp)
{ {
struct svc_expkey *ek; struct svc_expkey *ek;
struct inode *inode = exp->ex_dentry->d_inode; struct inode *inode = exp->ex_path.dentry->d_inode;
ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino); ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino);
if (!IS_ERR(ek)) { if (!IS_ERR(ek)) {
...@@ -1064,12 +1063,11 @@ exp_export(struct nfsctl_export *nxp) ...@@ -1064,12 +1063,11 @@ exp_export(struct nfsctl_export *nxp)
new.h.expiry_time = NEVER; new.h.expiry_time = NEVER;
new.h.flags = 0; new.h.flags = 0;
new.ex_path = kstrdup(nxp->ex_path, GFP_KERNEL); new.ex_pathname = kstrdup(nxp->ex_path, GFP_KERNEL);
if (!new.ex_path) if (!new.ex_pathname)
goto finish; goto finish;
new.ex_client = clp; new.ex_client = clp;
new.ex_mnt = nd.path.mnt; new.ex_path = nd.path;
new.ex_dentry = nd.path.dentry;
new.ex_flags = nxp->ex_flags; new.ex_flags = nxp->ex_flags;
new.ex_anon_uid = nxp->ex_anon_uid; new.ex_anon_uid = nxp->ex_anon_uid;
new.ex_anon_gid = nxp->ex_anon_gid; new.ex_anon_gid = nxp->ex_anon_gid;
...@@ -1090,8 +1088,7 @@ exp_export(struct nfsctl_export *nxp) ...@@ -1090,8 +1088,7 @@ exp_export(struct nfsctl_export *nxp)
} else } else
err = 0; err = 0;
finish: finish:
if (new.ex_path) kfree(new.ex_pathname);
kfree(new.ex_path);
if (exp) if (exp)
exp_put(exp); exp_put(exp);
if (fsid_key && !IS_ERR(fsid_key)) if (fsid_key && !IS_ERR(fsid_key))
...@@ -1360,7 +1357,7 @@ exp_pseudoroot(struct svc_rqst *rqstp, struct svc_fh *fhp) ...@@ -1360,7 +1357,7 @@ exp_pseudoroot(struct svc_rqst *rqstp, struct svc_fh *fhp)
exp = rqst_exp_find(rqstp, FSID_NUM, fsidv); exp = rqst_exp_find(rqstp, FSID_NUM, fsidv);
if (IS_ERR(exp)) if (IS_ERR(exp))
return nfserrno(PTR_ERR(exp)); return nfserrno(PTR_ERR(exp));
rv = fh_compose(fhp, exp, exp->ex_dentry, NULL); rv = fh_compose(fhp, exp, exp->ex_path.dentry, NULL);
if (rv) if (rv)
goto out; goto out;
rv = check_nfsd_access(exp, rqstp); rv = check_nfsd_access(exp, rqstp);
......
...@@ -67,7 +67,7 @@ nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle *argp, ...@@ -67,7 +67,7 @@ nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle *argp,
if (nfserr) if (nfserr)
RETURN_STATUS(nfserr); RETURN_STATUS(nfserr);
err = vfs_getattr(resp->fh.fh_export->ex_mnt, err = vfs_getattr(resp->fh.fh_export->ex_path.mnt,
resp->fh.fh_dentry, &resp->stat); resp->fh.fh_dentry, &resp->stat);
nfserr = nfserrno(err); nfserr = nfserrno(err);
......
...@@ -218,7 +218,7 @@ encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp) ...@@ -218,7 +218,7 @@ encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
int err; int err;
struct kstat stat; struct kstat stat;
err = vfs_getattr(fhp->fh_export->ex_mnt, dentry, &stat); err = vfs_getattr(fhp->fh_export->ex_path.mnt, dentry, &stat);
if (!err) { if (!err) {
*p++ = xdr_one; /* attributes follow */ *p++ = xdr_one; /* attributes follow */
lease_get_mtime(dentry->d_inode, &stat.mtime); lease_get_mtime(dentry->d_inode, &stat.mtime);
...@@ -270,7 +270,7 @@ void fill_post_wcc(struct svc_fh *fhp) ...@@ -270,7 +270,7 @@ void fill_post_wcc(struct svc_fh *fhp)
if (fhp->fh_post_saved) if (fhp->fh_post_saved)
printk("nfsd: inode locked twice during operation.\n"); printk("nfsd: inode locked twice during operation.\n");
err = vfs_getattr(fhp->fh_export->ex_mnt, fhp->fh_dentry, err = vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry,
&fhp->fh_post_attr); &fhp->fh_post_attr);
if (err) if (err)
fhp->fh_post_saved = 0; fhp->fh_post_saved = 0;
......
...@@ -1330,9 +1330,9 @@ static char *nfsd4_path(struct svc_rqst *rqstp, struct svc_export *exp, __be32 * ...@@ -1330,9 +1330,9 @@ static char *nfsd4_path(struct svc_rqst *rqstp, struct svc_export *exp, __be32 *
*stat = exp_pseudoroot(rqstp, &tmp_fh); *stat = exp_pseudoroot(rqstp, &tmp_fh);
if (*stat) if (*stat)
return NULL; return NULL;
rootpath = tmp_fh.fh_export->ex_path; rootpath = tmp_fh.fh_export->ex_pathname;
path = exp->ex_path; path = exp->ex_pathname;
if (strncmp(path, rootpath, strlen(rootpath))) { if (strncmp(path, rootpath, strlen(rootpath))) {
dprintk("nfsd: fs_locations failed;" dprintk("nfsd: fs_locations failed;"
...@@ -1481,7 +1481,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, ...@@ -1481,7 +1481,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
goto out; goto out;
} }
err = vfs_getattr(exp->ex_mnt, dentry, &stat); err = vfs_getattr(exp->ex_path.mnt, dentry, &stat);
if (err) if (err)
goto out_nfserr; goto out_nfserr;
if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL | if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL |
...@@ -1838,9 +1838,9 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, ...@@ -1838,9 +1838,9 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
* and this is the root of a cross-mounted filesystem. * and this is the root of a cross-mounted filesystem.
*/ */
if (ignore_crossmnt == 0 && if (ignore_crossmnt == 0 &&
exp->ex_mnt->mnt_root->d_inode == dentry->d_inode) { exp->ex_path.mnt->mnt_root->d_inode == dentry->d_inode) {
err = vfs_getattr(exp->ex_mnt->mnt_parent, err = vfs_getattr(exp->ex_path.mnt->mnt_parent,
exp->ex_mnt->mnt_mountpoint, &stat); exp->ex_path.mnt->mnt_mountpoint, &stat);
if (err) if (err)
goto out_nfserr; goto out_nfserr;
} }
......
...@@ -47,7 +47,7 @@ static int nfsd_acceptable(void *expv, struct dentry *dentry) ...@@ -47,7 +47,7 @@ static int nfsd_acceptable(void *expv, struct dentry *dentry)
return 1; return 1;
tdentry = dget(dentry); tdentry = dget(dentry);
while (tdentry != exp->ex_dentry && ! IS_ROOT(tdentry)) { while (tdentry != exp->ex_path.dentry && !IS_ROOT(tdentry)) {
/* make sure parents give x permission to user */ /* make sure parents give x permission to user */
int err; int err;
parent = dget_parent(tdentry); parent = dget_parent(tdentry);
...@@ -59,9 +59,9 @@ static int nfsd_acceptable(void *expv, struct dentry *dentry) ...@@ -59,9 +59,9 @@ static int nfsd_acceptable(void *expv, struct dentry *dentry)
dput(tdentry); dput(tdentry);
tdentry = parent; tdentry = parent;
} }
if (tdentry != exp->ex_dentry) if (tdentry != exp->ex_path.dentry)
dprintk("nfsd_acceptable failed at %p %s\n", tdentry, tdentry->d_name.name); dprintk("nfsd_acceptable failed at %p %s\n", tdentry, tdentry->d_name.name);
rv = (tdentry == exp->ex_dentry); rv = (tdentry == exp->ex_path.dentry);
dput(tdentry); dput(tdentry);
return rv; return rv;
} }
...@@ -209,9 +209,9 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) ...@@ -209,9 +209,9 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
fileid_type = fh->fh_fileid_type; fileid_type = fh->fh_fileid_type;
if (fileid_type == FILEID_ROOT) if (fileid_type == FILEID_ROOT)
dentry = dget(exp->ex_dentry); dentry = dget(exp->ex_path.dentry);
else { else {
dentry = exportfs_decode_fh(exp->ex_mnt, fid, dentry = exportfs_decode_fh(exp->ex_path.mnt, fid,
data_left, fileid_type, data_left, fileid_type,
nfsd_acceptable, exp); nfsd_acceptable, exp);
} }
...@@ -299,7 +299,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) ...@@ -299,7 +299,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
static void _fh_update(struct svc_fh *fhp, struct svc_export *exp, static void _fh_update(struct svc_fh *fhp, struct svc_export *exp,
struct dentry *dentry) struct dentry *dentry)
{ {
if (dentry != exp->ex_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_auth + 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;
...@@ -344,12 +344,12 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, ...@@ -344,12 +344,12 @@ 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;
struct dentry *parent = dentry->d_parent; struct dentry *parent = dentry->d_parent;
__u32 *datap; __u32 *datap;
dev_t ex_dev = exp->ex_dentry->d_inode->i_sb->s_dev; dev_t ex_dev = exp->ex_path.dentry->d_inode->i_sb->s_dev;
int root_export = (exp->ex_dentry == exp->ex_dentry->d_sb->s_root); int root_export = (exp->ex_path.dentry == exp->ex_path.dentry->d_sb->s_root);
dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n",
MAJOR(ex_dev), MINOR(ex_dev), MAJOR(ex_dev), MINOR(ex_dev),
(long) exp->ex_dentry->d_inode->i_ino, (long) exp->ex_path.dentry->d_inode->i_ino,
parent->d_name.name, dentry->d_name.name, parent->d_name.name, dentry->d_name.name,
(inode ? inode->i_ino : 0)); (inode ? inode->i_ino : 0));
...@@ -391,7 +391,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, ...@@ -391,7 +391,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
/* FALL THROUGH */ /* FALL THROUGH */
case FSID_MAJOR_MINOR: case FSID_MAJOR_MINOR:
case FSID_ENCODE_DEV: case FSID_ENCODE_DEV:
if (!(exp->ex_dentry->d_inode->i_sb->s_type->fs_flags if (!(exp->ex_path.dentry->d_inode->i_sb->s_type->fs_flags
& FS_REQUIRES_DEV)) & FS_REQUIRES_DEV))
goto retry; goto retry;
break; break;
...@@ -454,7 +454,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, ...@@ -454,7 +454,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
fhp->fh_handle.ofh_dev = old_encode_dev(ex_dev); fhp->fh_handle.ofh_dev = old_encode_dev(ex_dev);
fhp->fh_handle.ofh_xdev = fhp->fh_handle.ofh_dev; fhp->fh_handle.ofh_xdev = fhp->fh_handle.ofh_dev;
fhp->fh_handle.ofh_xino = fhp->fh_handle.ofh_xino =
ino_t_to_u32(exp->ex_dentry->d_inode->i_ino); ino_t_to_u32(exp->ex_path.dentry->d_inode->i_ino);
fhp->fh_handle.ofh_dirino = ino_t_to_u32(parent_ino(dentry)); fhp->fh_handle.ofh_dirino = ino_t_to_u32(parent_ino(dentry));
if (inode) if (inode)
_fh_update_old(dentry, exp, &fhp->fh_handle); _fh_update_old(dentry, exp, &fhp->fh_handle);
...@@ -465,7 +465,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, ...@@ -465,7 +465,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
datap = fhp->fh_handle.fh_auth+0; datap = fhp->fh_handle.fh_auth+0;
fhp->fh_handle.fh_fsid_type = fsid_type; fhp->fh_handle.fh_fsid_type = fsid_type;
mk_fsid(fsid_type, datap, ex_dev, mk_fsid(fsid_type, datap, ex_dev,
exp->ex_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(fsid_type); len = key_len(fsid_type);
...@@ -571,7 +571,7 @@ enum fsid_source fsid_source(struct svc_fh *fhp) ...@@ -571,7 +571,7 @@ enum fsid_source fsid_source(struct svc_fh *fhp)
case FSID_DEV: case FSID_DEV:
case FSID_ENCODE_DEV: case FSID_ENCODE_DEV:
case FSID_MAJOR_MINOR: case FSID_MAJOR_MINOR:
if (fhp->fh_export->ex_dentry->d_inode->i_sb->s_type->fs_flags if (fhp->fh_export->ex_path.dentry->d_inode->i_sb->s_type->fs_flags
& FS_REQUIRES_DEV) & FS_REQUIRES_DEV)
return FSIDSOURCE_DEV; return FSIDSOURCE_DEV;
break; break;
......
...@@ -41,7 +41,7 @@ static __be32 ...@@ -41,7 +41,7 @@ static __be32
nfsd_return_attrs(__be32 err, struct nfsd_attrstat *resp) nfsd_return_attrs(__be32 err, struct nfsd_attrstat *resp)
{ {
if (err) return err; if (err) return err;
return nfserrno(vfs_getattr(resp->fh.fh_export->ex_mnt, return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt,
resp->fh.fh_dentry, resp->fh.fh_dentry,
&resp->stat)); &resp->stat));
} }
...@@ -49,7 +49,7 @@ static __be32 ...@@ -49,7 +49,7 @@ static __be32
nfsd_return_dirop(__be32 err, struct nfsd_diropres *resp) nfsd_return_dirop(__be32 err, struct nfsd_diropres *resp)
{ {
if (err) return err; if (err) return err;
return nfserrno(vfs_getattr(resp->fh.fh_export->ex_mnt, return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt,
resp->fh.fh_dentry, resp->fh.fh_dentry,
&resp->stat)); &resp->stat));
} }
...@@ -164,7 +164,7 @@ nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp, ...@@ -164,7 +164,7 @@ nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp,
&resp->count); &resp->count);
if (nfserr) return nfserr; if (nfserr) return nfserr;
return nfserrno(vfs_getattr(resp->fh.fh_export->ex_mnt, return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt,
resp->fh.fh_dentry, resp->fh.fh_dentry,
&resp->stat)); &resp->stat));
} }
......
...@@ -207,7 +207,7 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, ...@@ -207,7 +207,7 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp) __be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
{ {
struct kstat stat; struct kstat stat;
vfs_getattr(fhp->fh_export->ex_mnt, fhp->fh_dentry, &stat); vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, &stat);
return encode_fattr(rqstp, p, fhp, &stat); return encode_fattr(rqstp, p, fhp, &stat);
} }
......
...@@ -101,7 +101,7 @@ nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp, ...@@ -101,7 +101,7 @@ nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp,
{ {
struct svc_export *exp = *expp, *exp2 = NULL; struct svc_export *exp = *expp, *exp2 = NULL;
struct dentry *dentry = *dpp; struct dentry *dentry = *dpp;
struct vfsmount *mnt = mntget(exp->ex_mnt); struct vfsmount *mnt = mntget(exp->ex_path.mnt);
struct dentry *mounts = dget(dentry); struct dentry *mounts = dget(dentry);
int err = 0; int err = 0;
...@@ -156,15 +156,15 @@ nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp, ...@@ -156,15 +156,15 @@ nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp,
if (isdotent(name, len)) { if (isdotent(name, len)) {
if (len==1) if (len==1)
dentry = dget(dparent); dentry = dget(dparent);
else if (dparent != exp->ex_dentry) { else if (dparent != exp->ex_path.dentry)
dentry = dget_parent(dparent); dentry = dget_parent(dparent);
} else if (!EX_NOHIDE(exp)) else if (!EX_NOHIDE(exp))
dentry = dget(dparent); /* .. == . just like at / */ dentry = dget(dparent); /* .. == . just like at / */
else { else {
/* checking mountpoint crossing is very different when stepping up */ /* checking mountpoint crossing is very different when stepping up */
struct svc_export *exp2 = NULL; struct svc_export *exp2 = NULL;
struct dentry *dp; struct dentry *dp;
struct vfsmount *mnt = mntget(exp->ex_mnt); struct vfsmount *mnt = mntget(exp->ex_path.mnt);
dentry = dget(dparent); dentry = dget(dparent);
while(dentry == mnt->mnt_root && follow_up(&mnt, &dentry)) while(dentry == mnt->mnt_root && follow_up(&mnt, &dentry))
; ;
...@@ -721,7 +721,8 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, ...@@ -721,7 +721,8 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
DQUOT_INIT(inode); DQUOT_INIT(inode);
} }
*filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_mnt), flags); *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_path.mnt),
flags);
if (IS_ERR(*filp)) if (IS_ERR(*filp))
host_err = PTR_ERR(*filp); host_err = PTR_ERR(*filp);
out_nfserr: out_nfserr:
...@@ -1462,7 +1463,7 @@ nfsd_readlink(struct svc_rqst *rqstp, struct svc_fh *fhp, char *buf, int *lenp) ...@@ -1462,7 +1463,7 @@ nfsd_readlink(struct svc_rqst *rqstp, struct svc_fh *fhp, char *buf, int *lenp)
if (!inode->i_op || !inode->i_op->readlink) if (!inode->i_op || !inode->i_op->readlink)
goto out; goto out;
touch_atime(fhp->fh_export->ex_mnt, dentry); touch_atime(fhp->fh_export->ex_path.mnt, dentry);
/* N.B. Why does this call need a get_fs()?? /* N.B. Why does this call need a get_fs()??
* Remove the set_fs and watch the fireworks:-) --okir * Remove the set_fs and watch the fireworks:-) --okir
*/ */
......
...@@ -84,9 +84,8 @@ struct svc_export { ...@@ -84,9 +84,8 @@ struct svc_export {
struct cache_head h; struct cache_head h;
struct auth_domain * ex_client; struct auth_domain * ex_client;
int ex_flags; int ex_flags;
struct vfsmount * ex_mnt; struct path ex_path;
struct dentry * ex_dentry; char *ex_pathname;
char * ex_path;
uid_t ex_anon_uid; uid_t ex_anon_uid;
gid_t ex_anon_gid; gid_t ex_anon_gid;
int ex_fsid; int ex_fsid;
......
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