X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnfsumount.c;h=9e9cd16a66e8c5d959e07dc8a129716d97adbe9a;hp=ffbda63b52e4aac8673e7a3d22d8fdab8e26aca5;hb=df0a06a985a15f088d0a7fb39c61a98e6aac9830;hpb=8069ce8d74948692bf20dd3d8b92a050e04784ed diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index ffbda63..9e9cd16 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) { @@ -335,10 +348,9 @@ int nfsumount(int argc, char *argv[]) ret = 0; if (mc) { - if (!lazy) + if (!lazy && strcmp(mc->m.mnt_type, "nfs4") != 0) 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); + ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir) ?: ret; } else if (*spec != '/') { if (!lazy) ret = do_nfs_umount(spec, "tcp,v3");