]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] knfsd cleanups
authorAlexander Viro <viro@math.psu.edu>
Fri, 8 Feb 2002 07:47:45 +0000 (23:47 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 8 Feb 2002 07:47:45 +0000 (23:47 -0800)
logics in nfsd_lookup() cleaned up (see above, only more so ;-/)

fs/nfsd/vfs.c

index 14290a603a1036b6d215ac7dd30b6d05c760c5ec..1b67d4d5fa9e7734ecf4754a9f929ac212bbbe4a 100644 (file)
@@ -114,35 +114,30 @@ nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
        if (isdotent(name, len)) {
                if (len==1)
                        dentry = dget(dparent);
-               else  { /* must be ".." */
+               else if (dparent != exp->ex_dentry)
+                       dentry = dget(dparent->d_parent);
+               else  if (!EX_CROSSMNT(exp))
+                       dentry = dget(dparent); /* .. == . just like at / */
+               else {
                        /* checking mountpoint crossing is very different when stepping up */
-                       if (dparent == exp->ex_dentry) {
-                               if (!EX_CROSSMNT(exp))
-                                       dentry = dget(dparent); /* .. == . just like at / */
-                               else
-                               {
-                                       struct svc_export *exp2 = NULL;
-                                       struct dentry *dp;
-                                       struct vfsmount *mnt = mntget(exp->ex_mnt);
-                                       dentry = dget(dparent);
-                                       while(follow_up(&mnt, &dentry))
-                                               ;
-                                       dp = dget(dentry->d_parent);
-                                       dput(dentry);
-                                       dentry = dp;
-                                       for ( ; exp2 == NULL && dp->d_parent != dp;
-                                             dp=dp->d_parent)
-                                               exp2 = exp_get_by_name(exp->ex_client, mnt, dp);
-                                       if (exp2==NULL) {
-                                               dput(dentry);
-                                               dentry = dget(dparent);
-                                       } else {
-                                               exp = exp2;
-                                       }
-                                       mntput(mnt);
-                               }
-                       } else
-                               dentry = dget(dparent->d_parent);
+                       struct svc_export *exp2 = NULL;
+                       struct dentry *dp;
+                       struct vfsmount *mnt = mntget(exp->ex_mnt);
+                       dentry = dget(dparent);
+                       while(follow_up(&mnt, &dentry))
+                               ;
+                       dp = dget(dentry->d_parent);
+                       dput(dentry);
+                       dentry = dp;
+                       for ( ; !exp2 && dp->d_parent != dp; dp=dp->d_parent)
+                               exp2 = exp_get_by_name(exp->ex_client, mnt, dp);
+                       if (!exp2) {
+                               dput(dentry);
+                               dentry = dget(dparent);
+                       } else {
+                               exp = exp2;
+                       }
+                       mntput(mnt);
                }
        } else {
                fh_lock(fhp);