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;