Module Name: src Committed By: bouyer Date: Wed Jun 17 20:49:00 UTC 2009
Modified Files: src/sys/kern [netbsd-5]: sys_generic.c Log Message: Pull up following revision(s) (requested by rmind in ticket #811): sys/kern/sys_generic.c: revision 1.122 via patch Updates to f_flag need to be made with atomics. To generate a diff of this commit: cvs rdiff -u -r1.120 -r1.120.6.1 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.120 src/sys/kern/sys_generic.c:1.120.6.1 --- src/sys/kern/sys_generic.c:1.120 Wed Jul 2 16:45:20 2008 +++ src/sys/kern/sys_generic.c Wed Jun 17 20:49:00 2009 @@ -1,7 +1,7 @@ -/* $NetBSD: sys_generic.c,v 1.120 2008/07/02 16:45:20 matt Exp $ */ +/* $NetBSD: sys_generic.c,v 1.120.6.1 2009/06/17 20:49:00 bouyer 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.120 2008/07/02 16:45:20 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_generic.c,v 1.120.6.1 2009/06/17 20:49:00 bouyer 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: - FILE_LOCK(fp); + /* 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; - FILE_UNLOCK(fp); + atomic_and_uint(&fp->f_flag, ~FNONBLOCK); error = (*fp->f_ops->fo_ioctl)(fp, FIONBIO, data); break; case FIOASYNC: - FILE_LOCK(fp); + /* 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; - FILE_UNLOCK(fp); + atomic_and_uint(&fp->f_flag, ~FASYNC); error = (*fp->f_ops->fo_ioctl)(fp, FIOASYNC, data); break;