Module Name:    src
Committed By:   hannken
Date:           Sun May  7 08:25:54 UTC 2017

Modified Files:
        src/sys/kern: vfs_syscalls.c
        src/sys/miscfs/genfs: genfs_vfsops.c

Log Message:
Return ENOENT if trying to suspend an unmounted file system.


To generate a diff of this commit:
cvs rdiff -u -r1.513 -r1.514 src/sys/kern/vfs_syscalls.c
cvs rdiff -u -r1.5 -r1.6 src/sys/miscfs/genfs/genfs_vfsops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/vfs_syscalls.c
diff -u src/sys/kern/vfs_syscalls.c:1.513 src/sys/kern/vfs_syscalls.c:1.514
--- src/sys/kern/vfs_syscalls.c:1.513	Wed Apr 26 03:02:49 2017
+++ src/sys/kern/vfs_syscalls.c	Sun May  7 08:25:54 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls.c,v 1.513 2017/04/26 03:02:49 riastradh Exp $	*/
+/*	$NetBSD: vfs_syscalls.c,v 1.514 2017/05/07 08:25:54 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.513 2017/04/26 03:02:49 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.514 2017/05/07 08:25:54 hannken Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_fileassoc.h"
@@ -282,11 +282,6 @@ mount_update(struct lwp *l, struct vnode
 	if (error)
 		goto out;
 
-	if (vfs_busy(mp)) {
-		error = EPERM;
-		goto out;
-	}
-
 	error = vfs_suspend(mp, 0);
 	if (error)
 		goto out;
@@ -345,7 +340,6 @@ mount_update(struct lwp *l, struct vnode
 	}
 	mutex_exit(&mp->mnt_updating);
 	vfs_resume(mp);
-	vfs_unbusy(mp);
 
 	if ((error == 0) && !(saved_flags & MNT_EXTATTR) && 
 	    (flags & MNT_EXTATTR)) {

Index: src/sys/miscfs/genfs/genfs_vfsops.c
diff -u src/sys/miscfs/genfs/genfs_vfsops.c:1.5 src/sys/miscfs/genfs/genfs_vfsops.c:1.6
--- src/sys/miscfs/genfs/genfs_vfsops.c:1.5	Thu Mar 30 09:12:21 2017
+++ src/sys/miscfs/genfs/genfs_vfsops.c	Sun May  7 08:25:54 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_vfsops.c,v 1.5 2017/03/30 09:12:21 hannken Exp $	*/
+/*	$NetBSD: genfs_vfsops.c,v 1.6 2017/05/07 08:25:54 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_vfsops.c,v 1.5 2017/03/30 09:12:21 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_vfsops.c,v 1.6 2017/05/07 08:25:54 hannken Exp $");
 
 #include <sys/types.h>
 #include <sys/mount.h>
@@ -75,18 +75,30 @@ genfs_renamelock_exit(struct mount *mp)
 int
 genfs_suspendctl(struct mount *mp, int cmd)
 {
-	int error __diagused;
+	int error;
+	int error2 __diagused;
 
 	if ((mp->mnt_iflag & IMNT_HAS_TRANS) == 0)
 		return EOPNOTSUPP;
 
 	switch (cmd) {
 	case SUSPEND_SUSPEND:
-		return fstrans_setstate(mp, FSTRANS_SUSPENDED);
+		error = fstrans_setstate(mp, FSTRANS_SUSPENDED);
+		if (error == 0) {
+			mutex_enter(&mp->mnt_unmounting);
+			if ((mp->mnt_iflag & IMNT_GONE) != 0)
+				error = ENOENT;
+			mutex_exit(&mp->mnt_unmounting);
+			if (error) {
+				error2 = fstrans_setstate(mp, FSTRANS_NORMAL);
+				KASSERT(error2 == 0);
+			}
+		}
+		return error;
 
 	case SUSPEND_RESUME:
-		error = fstrans_setstate(mp, FSTRANS_NORMAL);
-		KASSERT(error == 0);
+		error2 = fstrans_setstate(mp, FSTRANS_NORMAL);
+		KASSERT(error2 == 0);
 		return 0;
 
 	default:

Reply via email to