]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
Fix nfs4 umount to not used umount procedure
authorWei Yongjun <yjwei@nanjing-fnst.com>
Wed, 14 Mar 2007 08:07:09 +0000 (16:07 +0800)
committerNeil Brown <neilb@suse.de>
Fri, 16 Mar 2007 01:30:27 +0000 (12:30 +1100)
This fix umount.nfs4's BUG, patch cleanup some useless code.

1. Combine nfs3_umount() and nfs2_umount() to nfs_umount()
2. If it is a nfs4 remote file system or unkown mount version, do not
   probe remote mount port and not send UMNT request wich is not necessary

Signed-off-by: Wei Yongjun <yjwei@nanjing-fnst.com>
Signed-off-by: Neil Brown <neilb@suse.de>
utils/mount/nfsumount.c

index fa13725b636b23efe495cd66a73414f996688b0b..1f71d5fbeb9ff8d806624ccc37afd635287ad06a 100644 (file)
@@ -55,24 +55,11 @@ extern int probe_mntport(clnt_addr_t *);
 extern int nfs_gethostbyname(const char *, struct sockaddr_in *);
 
 static inline enum clnt_stat
-nfs3_umount(dirpath *argp, CLIENT *clnt)
+nfs_umount(dirpath *argp, CLIENT *clnt)
 {
-       static char clnt_res;
-       memset (&clnt_res, 0, sizeof(clnt_res));
        return clnt_call(clnt, MOUNTPROC_UMNT,
                         (xdrproc_t) xdr_dirpath, (caddr_t)argp,
-                        (xdrproc_t) xdr_void, (caddr_t) &clnt_res,
-                        TIMEOUT);
-}
-
-static inline enum clnt_stat
-nfs2_umount(dirpath *argp, CLIENT *clnt)
-{
-       static char clnt_res;
-       memset (&clnt_res, 0, sizeof(clnt_res));
-       return clnt_call(clnt, MOUNTPROC_UMNT,
-                        (xdrproc_t) xdr_dirpath, (caddr_t)argp,
-                        (xdrproc_t) xdr_void, (caddr_t) &clnt_res,
+                        (xdrproc_t) xdr_void, NULL,
                         TIMEOUT);
 }
 
@@ -82,25 +69,26 @@ int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp)
        enum clnt_stat res = 0;
        int msock;
 
-       clnt = mnt_openclnt(mnt_server, &msock);
-       if (!clnt)
-               goto out_bad;
        switch (mnt_server->pmap.pm_vers) {
        case 3:
-               res = nfs3_umount(argp, clnt);
-               break;
        case 2:
        case 1:
-               res = nfs2_umount(argp, clnt);
+               if (!probe_mntport(mnt_server))
+                       goto out_bad;
+               clnt = mnt_openclnt(mnt_server, &msock);
+               if (!clnt)
+                       goto out_bad;
+               res = nfs_umount(argp, clnt);
+               mnt_closeclnt(clnt, msock);
+               if (res == RPC_SUCCESS)
+                       return 1;
                break;
        default:
+               res = 1;
                break;
        }
-       mnt_closeclnt(clnt, msock);
-       if (res == RPC_SUCCESS)
-               return 1;
  out_bad:
-       return 0;
+       return res;
 }
 
 u_int get_mntproto(const char *);
@@ -310,8 +298,6 @@ int _nfsumount(const char *spec, const char *opts)
 
        if (!nfs_gethostbyname(hostname, &mnt_server.saddr))
                goto out_bad;
-       if (!probe_mntport(&mnt_server))
-               goto out_bad;
        return nfs_call_umount(&mnt_server, &dirname);
  out_bad:
        printf("%s: %s: not found or not mounted\n", progname, spec);