summaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-03-16 13:56:25 +1100
committerNeil Brown <neilb@suse.de>2007-03-16 13:56:25 +1100
commit1e42be20a3283994d0ffd6c5f80c36fab5a887a8 (patch)
tree442e5a76eaf9e53b3f31594d43d60747d8138edc /utils
parentf0e018fa18ac7726a67144c73e8ca0f33190b7dd (diff)
downloadnfs-utils-1e42be20a3283994d0ffd6c5f80c36fab5a887a8.tar.gz
nfs-utils-1e42be20a3283994d0ffd6c5f80c36fab5a887a8.tar.xz
nfs-utils-1e42be20a3283994d0ffd6c5f80c36fab5a887a8.zip
Further tidyup of nfs_umount.
- remove non-used arguments from del_mtab. - Don't try to pass a "host:/path" string to umount. It used to be possible to umount("/dev/whatever"). It has never been possible to umount("host:/path"). - Don't try to read /proc/mounts first. Some mount options (mount_vers) are only stored in /etc/mtab, not in /proc/mounts. So we have to prefer /etc/mtab as getmntXbackwards do. - Only every call one of getmnt{dir,dev}backwards, depending on whether 'spec' looks like a path name or a host:/path. - Don't call _nfsumount unless we have a host:/path, or del_mtab unless we have a path name.
Diffstat (limited to 'utils')
-rw-r--r--utils/mount/nfsumount.c81
1 files changed, 16 insertions, 65 deletions
diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c
index f6294d4..077219d 100644
--- a/utils/mount/nfsumount.c
+++ b/utils/mount/nfsumount.c
@@ -91,30 +91,6 @@ int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp)
return res;
}
-struct mntentchn *
-getmntentchn(const char *dir)
-{
- mntFILE *mfp;
- nfs_mntent_t *mnt;
- struct mntentchn *mc = NULL;
-
- mfp = nfs_setmntent ("/proc/mounts", "r");
- if (mfp == NULL || mfp->mntent_fp == NULL)
- return NULL;
-
- while ((mnt = nfs_getmntent(mfp)) != NULL) {
- if(strcmp(mnt->mnt_fsname, dir) && strcmp(mnt->mnt_dir, dir))
- continue;
-
- if (!mc)
- mc = (struct mntentchn *)xmalloc(sizeof(*mc));
- mc->m = *mnt;
- }
-
- nfs_endmntent(mfp);
- return mc;
-}
-
/* complain about a failed umount */
static void complain(int err, const char *dev) {
switch (err) {
@@ -139,12 +115,11 @@ static void complain(int err, const char *dev) {
}
}
-int del_mtab(const char *spec, const char *node, const char *type,
- const char *opts, struct mntentchn *mc)
+int del_mtab(const char *spec, const char *node)
{
- int umnt_err, umnt_err2, res;
+ int umnt_err, res;
- umnt_err = umnt_err2 = 0;
+ umnt_err = 0;
if (lazy) {
res = umount2 (node, MNT_DETACH);
if (res < 0)
@@ -167,27 +142,7 @@ int del_mtab(const char *spec, const char *node, const char *type,
} else
res = umount (node);
- if (res < 0) {
- umnt_err = errno;
- /* A device might have been mounted on a node that has since
- been deleted or renamed, so if node fails, also try spec. */
- /* Note that this is incorrect in case spec was mounted
- several times. */
- /* if (umnt_err == ENOENT || umnt_err == EINVAL) */
- if (umnt_err != EBUSY && strcmp(node, spec)) {
- if (verbose)
- printf (_("could not umount %s - trying %s instead\n"),
- node, spec);
- res = umount (spec);
- if (res < 0)
- umnt_err2 = errno;
- /* Do not complain about remote NFS mount points */
- if (errno == ENOENT && index(spec, ':'))
- umnt_err2 = 0;
- }
- }
-
- if (res < 0 && remount && (umnt_err == EBUSY || umnt_err2 == EBUSY)) {
+ if (res < 0 && remount && errno == EBUSY && spec) {
/* Umount failed - let us try a remount */
res = mount(spec, node, NULL,
MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL);
@@ -213,21 +168,19 @@ int del_mtab(const char *spec, const char *node, const char *type,
if (res >= 0) {
/* Umount succeeded */
if (verbose)
- printf (_("%s umounted\n"), spec);
+ printf (_("%s umounted\n"), spec ? spec : node);
}
writemtab:
if (!nomtab &&
(umnt_err == 0 || umnt_err == EINVAL || umnt_err == ENOENT)) {
- update_mtab (node, NULL);
+ update_mtab(node, NULL);
}
if (res >= 0)
return 0;
- if (umnt_err2)
- complain(umnt_err2, spec);
- if (umnt_err && umnt_err != umnt_err2)
+ if (umnt_err)
complain(umnt_err, node);
return 1;
}
@@ -364,24 +317,22 @@ int nfsumount(int argc, char *argv[])
return 0;
}
- mc = getmntentchn(spec);
- if (!mc)
+ if (*spec == '/')
mc = getmntdirbackward(spec, NULL);
- if (!mc)
+ else
mc = getmntdevbackward(spec, NULL);
if (!mc && verbose)
printf(_("Could not find %s in mtab\n"), spec);
- if(mc) {
+ if (mc) {
ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts);
if(ret)
- ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir,
- mc->m.mnt_type, mc->m.mnt_opts, mc);
- }
- else {
- ret = _nfsumount(spec, NULL);
- if(ret)
- ret = del_mtab(spec, spec, spec, spec, NULL);
+ ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir);
+ } else {
+ if (*spec != '/')
+ ret = _nfsumount(spec, "tcp,v3");
+ else
+ ret = del_mtab(NULL, spec);
}
return(ret);