diff options
| author | cegger <cegger@NetBSD.org> | 2010-08-26 12:48:19 +0000 |
|---|---|---|
| committer | cegger <cegger@NetBSD.org> | 2010-08-26 12:48:19 +0000 |
| commit | 0fd1c016327f32a5987d33d4cdd8efe1d0e2fada (patch) | |
| tree | 77b438248064b0a3395c168bae67b49ba21e5d31 /sys/dev | |
| parent | 319fe84db4053f610d649b912e5009040cc7b14f (diff) | |
don't call tsleep() with any mutexes hold
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ieee1394/fwdev.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/sys/dev/ieee1394/fwdev.c b/sys/dev/ieee1394/fwdev.c index 3719bc87bf9..8d6a58be2eb 100644 --- a/sys/dev/ieee1394/fwdev.c +++ b/sys/dev/ieee1394/fwdev.c @@ -1,4 +1,4 @@ -/* $NetBSD: fwdev.c,v 1.23 2010/08/16 06:05:07 cegger Exp $ */ +/* $NetBSD: fwdev.c,v 1.24 2010/08/26 12:48:19 cegger Exp $ */ /*- * Copyright (c) 2003 Hidetoshi Shimokawa * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fwdev.c,v 1.23 2010/08/16 06:05:07 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fwdev.c,v 1.24 2010/08/26 12:48:19 cegger Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -803,12 +803,18 @@ fw_read_async(struct fw_drv1 *d, struct uio *uio, int ioflag) int err = 0; mutex_enter(&d->fc->fc_mtx); - while ((xfer = STAILQ_FIRST(&d->rq)) == NULL && err == 0) - err = tsleep(&d->rq, FWPRI, "fwra", 0); - if (err != 0) { - mutex_exit(&d->fc->fc_mtx); - return err; + for (;;) { + xfer = STAILQ_FIRST(&d->rq); + if (xfer == NULL && err == 0) { + mutex_exit(&d->fc->fc_mtx); + err = tsleep(&d->rq, FWPRI, "fwra", 0); + if (err != 0) + return err; + mutex_enter(&d->fc->fc_mtx); + continue; + } + break; } STAILQ_REMOVE_HEAD(&d->rq, link); |
