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;