From 9702452a12b1afb5f6f702ca027add90bdbf6bb9 Mon Sep 17 00:00:00 2001 From: Greg Lehey Date: Thu, 4 May 2000 07:37:11 +0000 Subject: [PATCH] lockrange: Avoid a race condition which was causing random corruption, panics and hangs in RAID-5 plexes, particularly with ata drives. Original-code-by: Bernd Walter Eagerly-awaited-by: sos --- sys/dev/vinum/vinumlock.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/sys/dev/vinum/vinumlock.c b/sys/dev/vinum/vinumlock.c index 78c4ce8a7f2a..1834b84d2e2e 100644 --- a/sys/dev/vinum/vinumlock.c +++ b/sys/dev/vinum/vinumlock.c @@ -37,7 +37,7 @@ * otherwise) arising in any way out of the use of this software, even if * advised of the possibility of such damage. * - * $Id: vinumlock.c,v 1.11 1999/10/12 04:35:37 grog Exp grog $ + * $Id: vinumlock.c,v 1.12 2000/01/05 22:17:25 grog Exp grog $ * $FreeBSD$ */ @@ -248,14 +248,13 @@ lockrange(daddr_t stripe, struct buf *bp, struct plex *plex) } #endif plex->lockwaits++; /* waited one more time */ - while (lock->stripe) /* wait for it to become free */ tsleep((void *) lock->stripe, PRIBIO, "vrlock", 2 * hz); - break; /* out of the inner level loop */ + lock = plex->lock; /* start again */ + foundlocks = 0; + pos = NULL; } - } else { - if (pos == NULL) /* still looking for somewhere? */ + } else if (pos == NULL) /* still looking for somewhere? */ pos = lock; /* a place to put this one */ - } } /*