diff options
author | sos <sos@FreeBSD.org> | 2002-03-11 21:04:32 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2002-03-11 21:04:32 +0000 |
commit | 2bbd43c8f1465da1596d644343204c5855f5af99 (patch) | |
tree | b285f3cbc9ac091eb6723d13404e5674e00ccd41 /sys/dev/ata/ata-raid.c | |
parent | fb6b9eab60b6bbddfa7ced0500e84f057fb0e8ec (diff) | |
download | FreeBSD-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.c | 14 |
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; } |