From: Neil Brown Date: Fri, 16 Mar 2007 02:56:25 +0000 (+1100) Subject: Further tidyup of nfs_umount. X-Git-Tag: nfs-utils-1-1-0-rc1~71 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=commitdiff_plain;h=1e42be20a3283994d0ffd6c5f80c36fab5a887a8;hp=f0e018fa18ac7726a67144c73e8ca0f33190b7dd 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. --- 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);