switch rqst_exp_get_by_name()
Al Viro [Sat, 18 Apr 2009 06:42:05 +0000 (02:42 -0400)]
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

fs/nfsd/export.c
fs/nfsd/vfs.c
include/linux/nfsd/export.h

index 5149dab..84f5e5c 100644 (file)
@@ -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))
@@ -1263,8 +1260,7 @@ gss:
        /* 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))
@@ -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;
@@ -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;
index bd584bc..d84c4ea 100644 (file)
@@ -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;
 }
index bcd0201..98f6fd5 100644 (file)
@@ -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);