summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei Yongjun <yjwei@nanjing-fnst.com>2007-03-14 16:07:09 +0800
committerNeil Brown <neilb@suse.de>2007-03-16 12:30:27 +1100
commit6501bd27df2c723ff0e18ee58e9434287acf3539 (patch)
tree851132ce12ef7fdbf7dff5e6718528af3decd5fe
parentd4848a7d7d849c0b8d96096707c4df3fc291b4e3 (diff)
downloadnfs-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.c40
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);