]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/nfsumount.c
Don't do_nfs_umount() for NFSv4 unmounts
[nfs-utils.git] / utils / mount / nfsumount.c
index ffbda63b52e4aac8673e7a3d22d8fdab8e26aca5..8902f0088a0533abdd3a0d64a06ac938d4231d86 100644 (file)
@@ -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,7 +348,7 @@ 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);