X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnfsumount.c;h=077219d6ae87e223669492c642e55bfc9d481b5e;hp=f6294d4e5c83fcd96a09c057a41d163f33e4fc06;hb=1e42be20a3283994d0ffd6c5f80c36fab5a887a8;hpb=f0e018fa18ac7726a67144c73e8ca0f33190b7dd 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);