Module Name:    src
Committed By:   ad
Date:           Sun May 17 10:08:38 UTC 2009

Modified Files:
        src/sys/kern: sys_generic.c

Log Message:
Updates to f_flag need to be made with atomics.


To generate a diff of this commit:
cvs rdiff -u -r1.121 -r1.122 src/sys/kern/sys_generic.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/sys_generic.c
diff -u src/sys/kern/sys_generic.c:1.121 src/sys/kern/sys_generic.c:1.122
--- src/sys/kern/sys_generic.c:1.121	Sun May 17 05:54:42 2009
+++ src/sys/kern/sys_generic.c	Sun May 17 10:08:38 2009
@@ -1,7 +1,7 @@
-/*	$NetBSD: sys_generic.c,v 1.121 2009/05/17 05:54:42 yamt Exp $	*/
+/*	$NetBSD: sys_generic.c,v 1.122 2009/05/17 10:08:38 ad Exp $	*/
 
 /*-
- * Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_generic.c,v 1.121 2009/05/17 05:54:42 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_generic.c,v 1.122 2009/05/17 10:08:38 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -89,6 +89,7 @@
 #include <sys/mount.h>
 #include <sys/syscallargs.h>
 #include <sys/ktrace.h>
+#include <sys/atomic.h>
 
 #include <uvm/uvm_extern.h>
 
@@ -593,22 +594,20 @@
 	switch (com) {
 
 	case FIONBIO:
-		mutex_enter(&fp->f_lock);
+		/* XXX Code block is not atomic */
 		if (*(int *)data != 0)
-			fp->f_flag |= FNONBLOCK;
+			atomic_or_uint(&fp->f_flag, FNONBLOCK);
 		else
-			fp->f_flag &= ~FNONBLOCK;
-		mutex_exit(&fp->f_lock);
+			atomic_and_uint(&fp->f_flag, ~FNONBLOCK);
 		error = (*fp->f_ops->fo_ioctl)(fp, FIONBIO, data);
 		break;
 
 	case FIOASYNC:
-		mutex_enter(&fp->f_lock);
+		/* XXX Code block is not atomic */
 		if (*(int *)data != 0)
-			fp->f_flag |= FASYNC;
+			atomic_or_uint(&fp->f_flag, FASYNC);
 		else
-			fp->f_flag &= ~FASYNC;
-		mutex_exit(&fp->f_lock);
+			atomic_and_uint(&fp->f_flag, ~FASYNC);
 		error = (*fp->f_ops->fo_ioctl)(fp, FIOASYNC, data);
 		break;
 

Reply via email to