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;
} 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) {
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);