Loading fs/nfsd/export.c +6 −9 Original line number Diff line number Diff line Loading @@ -1240,18 +1240,15 @@ __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp) * use exp_get_by_name() or exp_find(). */ struct svc_export * rqst_exp_get_by_name(struct svc_rqst *rqstp, struct vfsmount *mnt, struct dentry *dentry) rqst_exp_get_by_name(struct svc_rqst *rqstp, struct path *path) { struct svc_export *gssexp, *exp = ERR_PTR(-ENOENT); struct path path = {.mnt = mnt, .dentry = dentry}; if (rqstp->rq_client == NULL) goto gss; /* First try the auth_unix client: */ exp = exp_get_by_name(rqstp->rq_client, &path, &rqstp->rq_chandle); exp = exp_get_by_name(rqstp->rq_client, path, &rqstp->rq_chandle); if (PTR_ERR(exp) == -ENOENT) goto gss; if (IS_ERR(exp)) Loading @@ -1263,8 +1260,7 @@ rqst_exp_get_by_name(struct svc_rqst *rqstp, struct vfsmount *mnt, /* Otherwise, try falling back on gss client */ if (rqstp->rq_gssclient == NULL) return exp; gssexp = exp_get_by_name(rqstp->rq_gssclient, &path, &rqstp->rq_chandle); gssexp = exp_get_by_name(rqstp->rq_gssclient, path, &rqstp->rq_chandle); if (PTR_ERR(gssexp) == -ENOENT) return exp; if (!IS_ERR(exp)) Loading Loading @@ -1307,9 +1303,10 @@ rqst_exp_parent(struct svc_rqst *rqstp, struct vfsmount *mnt, struct dentry *dentry) { struct svc_export *exp; struct path path = {.mnt = mnt, .dentry = dentry}; dget(dentry); exp = rqst_exp_get_by_name(rqstp, mnt, dentry); exp = rqst_exp_get_by_name(rqstp, &path); while (PTR_ERR(exp) == -ENOENT && !IS_ROOT(dentry)) { struct dentry *parent; Loading @@ -1317,7 +1314,7 @@ rqst_exp_parent(struct svc_rqst *rqstp, struct vfsmount *mnt, parent = dget_parent(dentry); dput(dentry); dentry = parent; exp = rqst_exp_get_by_name(rqstp, mnt, dentry); exp = rqst_exp_get_by_name(rqstp, &path); } dput(dentry); return exp; Loading fs/nfsd/vfs.c +16 −16 Original line number Diff line number Diff line Loading @@ -101,36 +101,36 @@ nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp, { struct svc_export *exp = *expp, *exp2 = NULL; struct dentry *dentry = *dpp; struct vfsmount *mnt = mntget(exp->ex_path.mnt); struct dentry *mounts = dget(dentry); struct path path = {.mnt = mntget(exp->ex_path.mnt), .dentry = dget(dentry)}; int err = 0; while (follow_down(&mnt,&mounts)&&d_mountpoint(mounts)); while (follow_down(&path.mnt, &path.dentry) && d_mountpoint(path.dentry)) ; exp2 = rqst_exp_get_by_name(rqstp, mnt, mounts); exp2 = rqst_exp_get_by_name(rqstp, &path); if (IS_ERR(exp2)) { if (PTR_ERR(exp2) != -ENOENT) err = PTR_ERR(exp2); dput(mounts); mntput(mnt); path_put(&path); goto out; } if ((exp->ex_flags & NFSEXP_CROSSMOUNT) || EX_NOHIDE(exp2)) { /* successfully crossed mount point */ /* * This is subtle: dentry is *not* under mnt at this point. * The only reason we are safe is that original mnt is pinned * down by exp, so we should dput before putting exp. * This is subtle: path.dentry is *not* on path.mnt * at this point. The only reason we are safe is that * original mnt is pinned down by exp, so we should * put path *before* putting exp */ dput(dentry); *dpp = mounts; exp_put(exp); *dpp = path.dentry; path.dentry = dentry; *expp = exp2; } else { exp_put(exp2); dput(mounts); exp2 = exp; } mntput(mnt); path_put(&path); exp_put(exp2); out: return err; } Loading include/linux/nfsd/export.h +1 −2 Original line number Diff line number Diff line Loading @@ -125,8 +125,7 @@ void nfsd_export_flush(void); void exp_readlock(void); void exp_readunlock(void); struct svc_export * rqst_exp_get_by_name(struct svc_rqst *, struct vfsmount *, struct dentry *); struct path *); struct svc_export * rqst_exp_parent(struct svc_rqst *, struct vfsmount *mnt, struct dentry *dentry); Loading Loading
fs/nfsd/export.c +6 −9 Original line number Diff line number Diff line Loading @@ -1240,18 +1240,15 @@ __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp) * use exp_get_by_name() or exp_find(). */ struct svc_export * rqst_exp_get_by_name(struct svc_rqst *rqstp, struct vfsmount *mnt, struct dentry *dentry) rqst_exp_get_by_name(struct svc_rqst *rqstp, struct path *path) { struct svc_export *gssexp, *exp = ERR_PTR(-ENOENT); struct path path = {.mnt = mnt, .dentry = dentry}; if (rqstp->rq_client == NULL) goto gss; /* First try the auth_unix client: */ exp = exp_get_by_name(rqstp->rq_client, &path, &rqstp->rq_chandle); exp = exp_get_by_name(rqstp->rq_client, path, &rqstp->rq_chandle); if (PTR_ERR(exp) == -ENOENT) goto gss; if (IS_ERR(exp)) Loading @@ -1263,8 +1260,7 @@ rqst_exp_get_by_name(struct svc_rqst *rqstp, struct vfsmount *mnt, /* Otherwise, try falling back on gss client */ if (rqstp->rq_gssclient == NULL) return exp; gssexp = exp_get_by_name(rqstp->rq_gssclient, &path, &rqstp->rq_chandle); gssexp = exp_get_by_name(rqstp->rq_gssclient, path, &rqstp->rq_chandle); if (PTR_ERR(gssexp) == -ENOENT) return exp; if (!IS_ERR(exp)) Loading Loading @@ -1307,9 +1303,10 @@ rqst_exp_parent(struct svc_rqst *rqstp, struct vfsmount *mnt, struct dentry *dentry) { struct svc_export *exp; struct path path = {.mnt = mnt, .dentry = dentry}; dget(dentry); exp = rqst_exp_get_by_name(rqstp, mnt, dentry); exp = rqst_exp_get_by_name(rqstp, &path); while (PTR_ERR(exp) == -ENOENT && !IS_ROOT(dentry)) { struct dentry *parent; Loading @@ -1317,7 +1314,7 @@ rqst_exp_parent(struct svc_rqst *rqstp, struct vfsmount *mnt, parent = dget_parent(dentry); dput(dentry); dentry = parent; exp = rqst_exp_get_by_name(rqstp, mnt, dentry); exp = rqst_exp_get_by_name(rqstp, &path); } dput(dentry); return exp; Loading
fs/nfsd/vfs.c +16 −16 Original line number Diff line number Diff line Loading @@ -101,36 +101,36 @@ nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp, { struct svc_export *exp = *expp, *exp2 = NULL; struct dentry *dentry = *dpp; struct vfsmount *mnt = mntget(exp->ex_path.mnt); struct dentry *mounts = dget(dentry); struct path path = {.mnt = mntget(exp->ex_path.mnt), .dentry = dget(dentry)}; int err = 0; while (follow_down(&mnt,&mounts)&&d_mountpoint(mounts)); while (follow_down(&path.mnt, &path.dentry) && d_mountpoint(path.dentry)) ; exp2 = rqst_exp_get_by_name(rqstp, mnt, mounts); exp2 = rqst_exp_get_by_name(rqstp, &path); if (IS_ERR(exp2)) { if (PTR_ERR(exp2) != -ENOENT) err = PTR_ERR(exp2); dput(mounts); mntput(mnt); path_put(&path); goto out; } if ((exp->ex_flags & NFSEXP_CROSSMOUNT) || EX_NOHIDE(exp2)) { /* successfully crossed mount point */ /* * This is subtle: dentry is *not* under mnt at this point. * The only reason we are safe is that original mnt is pinned * down by exp, so we should dput before putting exp. * This is subtle: path.dentry is *not* on path.mnt * at this point. The only reason we are safe is that * original mnt is pinned down by exp, so we should * put path *before* putting exp */ dput(dentry); *dpp = mounts; exp_put(exp); *dpp = path.dentry; path.dentry = dentry; *expp = exp2; } else { exp_put(exp2); dput(mounts); exp2 = exp; } mntput(mnt); path_put(&path); exp_put(exp2); out: return err; } Loading
include/linux/nfsd/export.h +1 −2 Original line number Diff line number Diff line Loading @@ -125,8 +125,7 @@ void nfsd_export_flush(void); void exp_readlock(void); void exp_readunlock(void); struct svc_export * rqst_exp_get_by_name(struct svc_rqst *, struct vfsmount *, struct dentry *); struct path *); struct svc_export * rqst_exp_parent(struct svc_rqst *, struct vfsmount *mnt, struct dentry *dentry); Loading