summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-raid.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2002-03-11 21:04:32 +0000
committersos <sos@FreeBSD.org>2002-03-11 21:04:32 +0000
commit2bbd43c8f1465da1596d644343204c5855f5af99 (patch)
treeb285f3cbc9ac091eb6723d13404e5674e00ccd41 /sys/dev/ata/ata-raid.c
parentfb6b9eab60b6bbddfa7ced0500e84f057fb0e8ec (diff)
downloadFreeBSD-src-2bbd43c8f1465da1596d644343204c5855f5af99.zip
FreeBSD-src-2bbd43c8f1465da1596d644343204c5855f5af99.tar.gz
Add new support for locking an ATA channel and use that throughout
the ATA/ATAPI driver. This solves the concurrency problem with the new GEOM code, and also cuts a good deal of the patch size in the upcoming MFC.
Diffstat (limited to 'sys/dev/ata/ata-raid.c')
-rw-r--r--sys/dev/ata/ata-raid.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index a850c08..7ea0e26 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -179,7 +179,7 @@ ata_raid_attach()
continue;
ar_config_changed(rdp, 0);
- dev = disk_create(rdp->lun, &rdp->disk, 0, &ar_cdevsw,&ardisk_cdevsw);
+ dev = disk_create(rdp->lun, &rdp->disk, 0, &ar_cdevsw, &ardisk_cdevsw);
dev->si_drv1 = rdp;
dev->si_iosize_max = 256 * DEV_BSIZE;
rdp->dev = dev;
@@ -553,9 +553,8 @@ ar_config_changed(struct ar_softc *rdp, int writeback)
static int
ar_rebuild(struct ar_softc *rdp)
{
+ int disk, s, count = 0, error = 0;
caddr_t buffer;
- int count = 0, error = 0;
- int disk;
if ((rdp->flags & (AR_F_READY|AR_F_DEGRADED)) != (AR_F_READY|AR_F_DEGRADED))
return EEXIST;
@@ -578,9 +577,11 @@ ar_rebuild(struct ar_softc *rdp)
return ENODEV;
/* setup start conditions */
+ s = splbio();
rdp->lock_start = 0;
rdp->lock_end = rdp->lock_start + 256;
rdp->flags |= AR_F_REBUILDING;
+ splx(s);
buffer = malloc(256 * DEV_BSIZE, M_AR, M_NOWAIT | M_ZERO);
/* now go copy entire disk(s) */
@@ -619,11 +620,12 @@ ar_rebuild(struct ar_softc *rdp)
free(buffer, M_AR);
return error;
}
+ s = splbio();
rdp->lock_start = rdp->lock_end;
rdp->lock_end = rdp->lock_start + size;
+ splx(s);
wakeup(rdp);
}
- rdp->lock_start = 0xffffffff;
free(buffer, M_AR);
for (disk = 0; disk < rdp->total_disks; disk++) {
if ((rdp->disks[disk].flags&(AR_DF_PRESENT|AR_DF_ONLINE|AR_DF_SPARE))==
@@ -632,7 +634,11 @@ ar_rebuild(struct ar_softc *rdp)
rdp->disks[disk].flags |= (AR_DF_ASSIGNED | AR_DF_ONLINE);
}
}
+ s = splbio();
+ rdp->lock_start = 0xffffffff;
+ rdp->lock_end = 0xffffffff;
rdp->flags &= ~AR_F_REBUILDING;
+ splx(s);
ar_config_changed(rdp, 1);
return 0;
}
OpenPOWER on IntegriCloud