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: Jan Blunck <jblunck@suse.de> Acked-by: J. Bruce Fields <bfields@citi.umich.edu> Acked-by: Christoph 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: Erez Zadok <ezk@cs.sunysb.edu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
448678a0f3
commit
5477549161
@@ -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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
} 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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 *
|
|||||||
*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,
|
|||||||
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 @@ out_acl:
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@ out:
|
|||||||
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,
|
|||||||
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,
|
|||||||
/* 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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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
|
|||||||
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
|
|||||||
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,
|
|||||||
&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,
|
|||||||
__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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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 {
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user