From 33819040e10e0e72259f52ff472f816b4b6b8431 Mon Sep 17 00:00:00 2001 From: Marco Peereboom Date: Tue, 29 May 2007 16:31:39 +0000 Subject: Fix race in sync code. --- sys/dev/softraid.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'sys/dev/softraid.c') diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c index 8cc6439e4d5..4d209e6c2da 100644 --- a/sys/dev/softraid.c +++ b/sys/dev/softraid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: softraid.c,v 1.52 2007/05/29 08:15:32 marco Exp $ */ +/* $OpenBSD: softraid.c,v 1.53 2007/05/29 16:31:38 marco Exp $ */ /* * Copyright (c) 2007 Marco Peereboom * @@ -45,7 +45,6 @@ #include /* #define SR_FANCY_STATS */ -#define SR_FANCY_STATS #ifdef SR_DEBUG uint32_t sr_debug = 0 @@ -1456,20 +1455,24 @@ int sr_raid1_sync(struct sr_workunit *wu) { struct sr_discipline *sd = wu->swu_dis; - int rv = 0; + int s, rv = 0; DNPRINTF(SR_D_DIS, "%s: sr_raid1_sync\n", DEVNAME(sd->sd_sc)); - atomic_setbits_int(&sd->sd_sync, 1); + s = splbio(); + sd->sd_sync = 1; /* assume that there isn't any more io comming in, count sync wu */ while (sd->sd_wu_pending > 1) - if (tsleep(sd, PWAIT, "sr_sync", 60 * hz) == EWOULDBLOCK) { - rv = 0; + if (tsleep(sd, PRIBIO, "sr_sync", 60 * hz) == EWOULDBLOCK) { + DNPRINTF(SR_D_DIS, "%s: sr_raid1_sync timeout\n", + DEVNAME(sd->sd_sc)); + rv = 1; break; } - atomic_clearbits_int(&sd->sd_sync, 1); + sd->sd_sync = 0; + splx(s); return (rv); } -- cgit v1.2.3