diff options
author | Wei Yongjun <yjwei@nanjing-fnst.com> | 2007-03-14 16:07:09 +0800 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-03-16 12:30:27 +1100 |
commit | 6501bd27df2c723ff0e18ee58e9434287acf3539 (patch) | |
tree | 851132ce12ef7fdbf7dff5e6718528af3decd5fe | |
parent | d4848a7d7d849c0b8d96096707c4df3fc291b4e3 (diff) | |
download | nfs-utils-6501bd27df2c723ff0e18ee58e9434287acf3539.tar.gz nfs-utils-6501bd27df2c723ff0e18ee58e9434287acf3539.tar.xz nfs-utils-6501bd27df2c723ff0e18ee58e9434287acf3539.zip |
Fix nfs4 umount to not used umount procedure
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>
-rw-r--r-- | utils/mount/nfsumount.c | 40 |
1 files changed, 13 insertions, 27 deletions
diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index fa13725..1f71d5f 100644 --- a/utils/mount/nfsumount.c +++ b/utils/mount/nfsumount.c @@ -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); |