X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fmount%2Fnfsumount.c;h=285273b9ee56c1e3601ba482bfbc8708d3ba3f74;hb=0ff226cb9dc9382c5215368a03a5bd3a69ee287a;hp=ffbda63b52e4aac8673e7a3d22d8fdab8e26aca5;hpb=8069ce8d74948692bf20dd3d8b92a050e04784ed;p=nfs-utils.git diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index ffbda63..285273b 100644 --- a/utils/mount/nfsumount.c +++ b/utils/mount/nfsumount.c @@ -51,6 +51,30 @@ int force; int lazy; int remount; + +static int try_remount(const char *spec, const char *node) +{ + int res; + + res = mount(spec, node, NULL, + MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL); + if (res == 0) { + struct mntent remnt; + nfs_error(_("%s: %s busy - remounted read-only"), + progname, spec); + remnt.mnt_type = remnt.mnt_fsname = NULL; + remnt.mnt_dir = xstrdup(node); + remnt.mnt_opts = xstrdup("ro"); + if (!nomtab) + update_mtab(node, &remnt); + } else if (errno != EBUSY) { /* hmm ... */ + perror(_("remount")); + nfs_error(_("%s: could not remount %s read-only"), + progname, spec); + } + return res; +} + static int del_mtab(const char *spec, const char *node) { int umnt_err, res; @@ -78,25 +102,14 @@ static int del_mtab(const char *spec, const char *node) } else res = umount (node); - 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); - if (res == 0) { - struct mntent remnt; - nfs_error(_("%s: %s busy - remounted read-only"), - progname, spec); - remnt.mnt_type = remnt.mnt_fsname = NULL; - remnt.mnt_dir = xstrdup(node); - remnt.mnt_opts = xstrdup("ro"); - if (!nomtab) - update_mtab(node, &remnt); + if (res < 0) { + if (remount && errno == EBUSY && spec) { + res = try_remount(spec, node); + if (res) + goto writemtab; return 0; - } else if (errno != EBUSY) { /* hmm ... */ - perror(_("remount")); - nfs_error(_("%s: could not remount %s read-only"), - progname, spec); - } + } else + umnt_err = errno; } if (res >= 0) { @@ -129,7 +142,7 @@ static int del_mtab(const char *spec, const char *node) * We will need this information to get through the firewall again * to do the umount. */ -static int do_nfs_umount(const char *spec, char *opts) +static int do_nfs_umount23(const char *spec, char *opts) { char *hostname; char *dirname; @@ -177,7 +190,7 @@ static int do_nfs_umount(const char *spec, char *opts) } pmap->pm_prog = MOUNTPROG; - pmap->pm_vers = MOUNTVERS_NFSV3; + pmap->pm_vers = 0; /* unknown */ if (opts && (p = strstr(opts, "mountprog=")) && isdigit(*(p+10))) pmap->pm_prog = atoi(p+10); if (opts && (p = strstr(opts, "mountport=")) && isdigit(*(p+10))) @@ -186,8 +199,6 @@ static int do_nfs_umount(const char *spec, char *opts) pmap->pm_vers = nfsvers_to_mnt(2); if (opts && hasmntopt(&mnt, "v3")) pmap->pm_vers = nfsvers_to_mnt(3); - if (opts && hasmntopt(&mnt, "v4")) - pmap->pm_vers = nfsvers_to_mnt(4); if (opts && (p = strstr(opts, "vers=")) && isdigit(*(p+5))) pmap->pm_vers = nfsvers_to_mnt(atoi(p+5)); if (opts && (p = strstr(opts, "mountvers=")) && isdigit(*(p+10))) @@ -335,13 +346,12 @@ int nfsumount(int argc, char *argv[]) ret = 0; if (mc) { - if (!lazy) - ret = do_nfs_umount(mc->m.mnt_fsname, mc->m.mnt_opts); - if (!ret || force) - ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir); + if (!lazy && strcmp(mc->m.mnt_type, "nfs4") != 0) + ret = do_nfs_umount23(mc->m.mnt_fsname, mc->m.mnt_opts); + ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir) ?: ret; } else if (*spec != '/') { if (!lazy) - ret = do_nfs_umount(spec, "tcp,v3"); + ret = do_nfs_umount23(spec, "tcp,v3"); } else ret = del_mtab(NULL, spec);