Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (46 commits) [PATCH] fs: add a sanity check in d_free [PATCH] i_version: remount support [patch] vfs: make security_inode_setattr() calling consistent [patch 1/3] FS_MBCACHE: don't needlessly make it built-in [PATCH] move executable checking into ->permission() [PATCH] fs/dcache.c: update comment of d_validate() [RFC PATCH] touch_mnt_namespace when the mount flags change [PATCH] reiserfs: add missing llseek method [PATCH] fix ->llseek for more directories [PATCH vfs-2.6 6/6] vfs: add LOOKUP_RENAME_TARGET intent [PATCH vfs-2.6 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup [PATCH vfs-2.6 4/6] vfs: remove unnecessary fsnotify_d_instantiate() [PATCH vfs-2.6 3/6] vfs: add __d_instantiate() helper [PATCH vfs-2.6 2/6] vfs: add d_ancestor() [PATCH vfs-2.6 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() [PATCH] get rid of on-stack dentry in udf [PATCH 2/2] anondev: switch to IDA [PATCH 1/2] anondev: init IDR statically [JFFS2] Use d_splice_alias() not d_add() in jffs2_lookup() [PATCH] Optimise NFS readdir hack slightly. ...
This commit is contained in:
125
fs/nfsd/export.c
125
fs/nfsd/export.c
@@ -163,18 +163,16 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||
if (!ek)
|
||||
err = -ENOMEM;
|
||||
} else {
|
||||
struct nameidata nd;
|
||||
err = path_lookup(buf, 0, &nd);
|
||||
err = kern_path(buf, 0, &key.ek_path);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
dprintk("Found the path %s\n", buf);
|
||||
key.ek_path = nd.path;
|
||||
|
||||
ek = svc_expkey_update(&key, ek);
|
||||
if (!ek)
|
||||
err = -ENOMEM;
|
||||
path_put(&nd.path);
|
||||
path_put(&key.ek_path);
|
||||
}
|
||||
cache_flush();
|
||||
out:
|
||||
@@ -501,35 +499,22 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||
int len;
|
||||
int err;
|
||||
struct auth_domain *dom = NULL;
|
||||
struct nameidata nd;
|
||||
struct svc_export exp, *expp;
|
||||
struct svc_export exp = {}, *expp;
|
||||
int an_int;
|
||||
|
||||
nd.path.dentry = NULL;
|
||||
exp.ex_pathname = NULL;
|
||||
|
||||
/* fs locations */
|
||||
exp.ex_fslocs.locations = NULL;
|
||||
exp.ex_fslocs.locations_count = 0;
|
||||
exp.ex_fslocs.migrated = 0;
|
||||
|
||||
exp.ex_uuid = NULL;
|
||||
|
||||
/* secinfo */
|
||||
exp.ex_nflavors = 0;
|
||||
|
||||
if (mesg[mlen-1] != '\n')
|
||||
return -EINVAL;
|
||||
mesg[mlen-1] = 0;
|
||||
|
||||
buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
err = -ENOMEM;
|
||||
if (!buf) goto out;
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
/* client */
|
||||
len = qword_get(&mesg, buf, PAGE_SIZE);
|
||||
err = -EINVAL;
|
||||
if (len <= 0) goto out;
|
||||
len = qword_get(&mesg, buf, PAGE_SIZE);
|
||||
if (len <= 0)
|
||||
goto out;
|
||||
|
||||
err = -ENOENT;
|
||||
dom = auth_domain_find(buf);
|
||||
@@ -538,25 +523,25 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||
|
||||
/* path */
|
||||
err = -EINVAL;
|
||||
if ((len=qword_get(&mesg, buf, PAGE_SIZE)) <= 0)
|
||||
goto out;
|
||||
err = path_lookup(buf, 0, &nd);
|
||||
if (err) goto out_no_path;
|
||||
if ((len = qword_get(&mesg, buf, PAGE_SIZE)) <= 0)
|
||||
goto out1;
|
||||
|
||||
err = kern_path(buf, 0, &exp.ex_path);
|
||||
if (err)
|
||||
goto out1;
|
||||
|
||||
exp.h.flags = 0;
|
||||
exp.ex_client = dom;
|
||||
exp.ex_path.mnt = nd.path.mnt;
|
||||
exp.ex_path.dentry = nd.path.dentry;
|
||||
exp.ex_pathname = kstrdup(buf, GFP_KERNEL);
|
||||
|
||||
err = -ENOMEM;
|
||||
exp.ex_pathname = kstrdup(buf, GFP_KERNEL);
|
||||
if (!exp.ex_pathname)
|
||||
goto out;
|
||||
goto out2;
|
||||
|
||||
/* expiry */
|
||||
err = -EINVAL;
|
||||
exp.h.expiry_time = get_expiry(&mesg);
|
||||
if (exp.h.expiry_time == 0)
|
||||
goto out;
|
||||
goto out3;
|
||||
|
||||
/* flags */
|
||||
err = get_int(&mesg, &an_int);
|
||||
@@ -564,22 +549,26 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||
err = 0;
|
||||
set_bit(CACHE_NEGATIVE, &exp.h.flags);
|
||||
} else {
|
||||
if (err || an_int < 0) goto out;
|
||||
if (err || an_int < 0)
|
||||
goto out3;
|
||||
exp.ex_flags= an_int;
|
||||
|
||||
/* anon uid */
|
||||
err = get_int(&mesg, &an_int);
|
||||
if (err) goto out;
|
||||
if (err)
|
||||
goto out3;
|
||||
exp.ex_anon_uid= an_int;
|
||||
|
||||
/* anon gid */
|
||||
err = get_int(&mesg, &an_int);
|
||||
if (err) goto out;
|
||||
if (err)
|
||||
goto out3;
|
||||
exp.ex_anon_gid= an_int;
|
||||
|
||||
/* fsid */
|
||||
err = get_int(&mesg, &an_int);
|
||||
if (err) goto out;
|
||||
if (err)
|
||||
goto out3;
|
||||
exp.ex_fsid = an_int;
|
||||
|
||||
while ((len = qword_get(&mesg, buf, PAGE_SIZE)) > 0) {
|
||||
@@ -605,12 +594,13 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||
*/
|
||||
break;
|
||||
if (err)
|
||||
goto out;
|
||||
goto out4;
|
||||
}
|
||||
|
||||
err = check_export(nd.path.dentry->d_inode, exp.ex_flags,
|
||||
err = check_export(exp.ex_path.dentry->d_inode, exp.ex_flags,
|
||||
exp.ex_uuid);
|
||||
if (err) goto out;
|
||||
if (err)
|
||||
goto out4;
|
||||
}
|
||||
|
||||
expp = svc_export_lookup(&exp);
|
||||
@@ -623,15 +613,16 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||
err = -ENOMEM;
|
||||
else
|
||||
exp_put(expp);
|
||||
out:
|
||||
out4:
|
||||
nfsd4_fslocs_free(&exp.ex_fslocs);
|
||||
kfree(exp.ex_uuid);
|
||||
out3:
|
||||
kfree(exp.ex_pathname);
|
||||
if (nd.path.dentry)
|
||||
path_put(&nd.path);
|
||||
out_no_path:
|
||||
if (dom)
|
||||
auth_domain_put(dom);
|
||||
out2:
|
||||
path_put(&exp.ex_path);
|
||||
out1:
|
||||
auth_domain_put(dom);
|
||||
out:
|
||||
kfree(buf);
|
||||
return err;
|
||||
}
|
||||
@@ -999,7 +990,7 @@ exp_export(struct nfsctl_export *nxp)
|
||||
struct svc_export *exp = NULL;
|
||||
struct svc_export new;
|
||||
struct svc_expkey *fsid_key = NULL;
|
||||
struct nameidata nd;
|
||||
struct path path;
|
||||
int err;
|
||||
|
||||
/* Consistency check */
|
||||
@@ -1022,12 +1013,12 @@ exp_export(struct nfsctl_export *nxp)
|
||||
|
||||
|
||||
/* Look up the dentry */
|
||||
err = path_lookup(nxp->ex_path, 0, &nd);
|
||||
err = kern_path(nxp->ex_path, 0, &path);
|
||||
if (err)
|
||||
goto out_put_clp;
|
||||
err = -EINVAL;
|
||||
|
||||
exp = exp_get_by_name(clp, nd.path.mnt, nd.path.dentry, NULL);
|
||||
exp = exp_get_by_name(clp, path.mnt, path.dentry, NULL);
|
||||
|
||||
memset(&new, 0, sizeof(new));
|
||||
|
||||
@@ -1035,8 +1026,8 @@ exp_export(struct nfsctl_export *nxp)
|
||||
if ((nxp->ex_flags & NFSEXP_FSID) &&
|
||||
(!IS_ERR(fsid_key = exp_get_fsid_key(clp, nxp->ex_dev))) &&
|
||||
fsid_key->ek_path.mnt &&
|
||||
(fsid_key->ek_path.mnt != nd.path.mnt ||
|
||||
fsid_key->ek_path.dentry != nd.path.dentry))
|
||||
(fsid_key->ek_path.mnt != path.mnt ||
|
||||
fsid_key->ek_path.dentry != path.dentry))
|
||||
goto finish;
|
||||
|
||||
if (!IS_ERR(exp)) {
|
||||
@@ -1052,7 +1043,7 @@ exp_export(struct nfsctl_export *nxp)
|
||||
goto finish;
|
||||
}
|
||||
|
||||
err = check_export(nd.path.dentry->d_inode, nxp->ex_flags, NULL);
|
||||
err = check_export(path.dentry->d_inode, nxp->ex_flags, NULL);
|
||||
if (err) goto finish;
|
||||
|
||||
err = -ENOMEM;
|
||||
@@ -1065,7 +1056,7 @@ exp_export(struct nfsctl_export *nxp)
|
||||
if (!new.ex_pathname)
|
||||
goto finish;
|
||||
new.ex_client = clp;
|
||||
new.ex_path = nd.path;
|
||||
new.ex_path = path;
|
||||
new.ex_flags = nxp->ex_flags;
|
||||
new.ex_anon_uid = nxp->ex_anon_uid;
|
||||
new.ex_anon_gid = nxp->ex_anon_gid;
|
||||
@@ -1091,7 +1082,7 @@ finish:
|
||||
exp_put(exp);
|
||||
if (fsid_key && !IS_ERR(fsid_key))
|
||||
cache_put(&fsid_key->h, &svc_expkey_cache);
|
||||
path_put(&nd.path);
|
||||
path_put(&path);
|
||||
out_put_clp:
|
||||
auth_domain_put(clp);
|
||||
out_unlock:
|
||||
@@ -1122,7 +1113,7 @@ exp_unexport(struct nfsctl_export *nxp)
|
||||
{
|
||||
struct auth_domain *dom;
|
||||
svc_export *exp;
|
||||
struct nameidata nd;
|
||||
struct path path;
|
||||
int err;
|
||||
|
||||
/* Consistency check */
|
||||
@@ -1139,13 +1130,13 @@ exp_unexport(struct nfsctl_export *nxp)
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
err = path_lookup(nxp->ex_path, 0, &nd);
|
||||
err = kern_path(nxp->ex_path, 0, &path);
|
||||
if (err)
|
||||
goto out_domain;
|
||||
|
||||
err = -EINVAL;
|
||||
exp = exp_get_by_name(dom, nd.path.mnt, nd.path.dentry, NULL);
|
||||
path_put(&nd.path);
|
||||
exp = exp_get_by_name(dom, path.mnt, path.dentry, NULL);
|
||||
path_put(&path);
|
||||
if (IS_ERR(exp))
|
||||
goto out_domain;
|
||||
|
||||
@@ -1167,26 +1158,26 @@ out_unlock:
|
||||
* since its harder to fool a kernel module than a user space program.
|
||||
*/
|
||||
int
|
||||
exp_rootfh(svc_client *clp, char *path, struct knfsd_fh *f, int maxsize)
|
||||
exp_rootfh(svc_client *clp, char *name, struct knfsd_fh *f, int maxsize)
|
||||
{
|
||||
struct svc_export *exp;
|
||||
struct nameidata nd;
|
||||
struct path path;
|
||||
struct inode *inode;
|
||||
struct svc_fh fh;
|
||||
int err;
|
||||
|
||||
err = -EPERM;
|
||||
/* NB: we probably ought to check that it's NUL-terminated */
|
||||
if (path_lookup(path, 0, &nd)) {
|
||||
printk("nfsd: exp_rootfh path not found %s", path);
|
||||
if (kern_path(name, 0, &path)) {
|
||||
printk("nfsd: exp_rootfh path not found %s", name);
|
||||
return err;
|
||||
}
|
||||
inode = nd.path.dentry->d_inode;
|
||||
inode = path.dentry->d_inode;
|
||||
|
||||
dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n",
|
||||
path, nd.path.dentry, clp->name,
|
||||
name, path.dentry, clp->name,
|
||||
inode->i_sb->s_id, inode->i_ino);
|
||||
exp = exp_parent(clp, nd.path.mnt, nd.path.dentry, NULL);
|
||||
exp = exp_parent(clp, path.mnt, path.dentry, NULL);
|
||||
if (IS_ERR(exp)) {
|
||||
err = PTR_ERR(exp);
|
||||
goto out;
|
||||
@@ -1196,7 +1187,7 @@ exp_rootfh(svc_client *clp, char *path, struct knfsd_fh *f, int maxsize)
|
||||
* fh must be initialized before calling fh_compose
|
||||
*/
|
||||
fh_init(&fh, maxsize);
|
||||
if (fh_compose(&fh, exp, nd.path.dentry, NULL))
|
||||
if (fh_compose(&fh, exp, path.dentry, NULL))
|
||||
err = -EINVAL;
|
||||
else
|
||||
err = 0;
|
||||
@@ -1204,7 +1195,7 @@ exp_rootfh(svc_client *clp, char *path, struct knfsd_fh *f, int maxsize)
|
||||
fh_put(&fh);
|
||||
exp_put(exp);
|
||||
out:
|
||||
path_put(&nd.path);
|
||||
path_put(&path);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user