summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-raid.c
diff options
context:
space:
mode:
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