summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2003-05-04 16:17:54 +0000
committersos <sos@FreeBSD.org>2003-05-04 16:17:54 +0000
commite39ff773309616a7488a10c27e70a8374d902176 (patch)
tree8c355f43a726cfd9d4b679cbee628e6d1f9829e0 /sys
parentca059a5aeaae9d5813d714fca45f1aad81e33e85 (diff)
downloadFreeBSD-src-e39ff773309616a7488a10c27e70a8374d902176.zip
FreeBSD-src-e39ff773309616a7488a10c27e70a8374d902176.tar.gz
Change the way loadbalancing works on RAID1's.
Based on code partially by me and by <Tor.Egge@cvsup.no.freebsd.org>.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/ata-raid.c33
-rw-r--r--sys/dev/ata/ata-raid.h1
2 files changed, 28 insertions, 6 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index 7269939..403db88 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -764,13 +764,34 @@ arstrategy(struct bio *bp)
return;
}
if (bp->bio_cmd == BIO_READ) {
- if ((buf1->bp.bio_pblkno <
- (rdp->disks[buf1->drive].last_lba - AR_PROXIMITY) ||
- buf1->bp.bio_pblkno >
- (rdp->disks[buf1->drive].last_lba + AR_PROXIMITY) ||
- !(rdp->disks[buf1->drive].flags & AR_DF_ONLINE)) &&
- (rdp->disks[buf1->drive+rdp->width].flags & AR_DF_ONLINE))
+ /* if mirror gone or close to last access on source */
+ if (!(rdp->disks[buf1->drive+rdp->width].flags & AR_DF_ONLINE)||
+ (buf1->bp.bio_pblkno >=
+ (rdp->disks[buf1->drive].last_lba - AR_PROXIMITY) &&
+ buf1->bp.bio_pblkno <=
+ (rdp->disks[buf1->drive].last_lba + AR_PROXIMITY))) {
+ rdp->flags &= ~AR_F_TOGGLE;
+ }
+ /* if source gone or close to last access on mirror */
+ else if (!(rdp->disks[buf1->drive].flags & AR_DF_ONLINE) ||
+ (buf1->bp.bio_pblkno >=
+ (rdp->disks[buf1->drive + rdp->width].last_lba -
+ AR_PROXIMITY) &&
+ buf1->bp.bio_pblkno <=
+ (rdp->disks[buf1->drive + rdp->width].last_lba +
+ AR_PROXIMITY))) {
+ buf1->drive = buf1->drive + rdp->width;
+ rdp->flags |= AR_F_TOGGLE;
+ }
+ /* not close to any previous access, toggle */
+ else {
+ if (rdp->flags & AR_F_TOGGLE)
+ rdp->flags &= ~AR_F_TOGGLE;
+ else {
buf1->drive = buf1->drive + rdp->width;
+ rdp->flags |= AR_F_TOGGLE;
+ }
+ }
}
if (bp->bio_cmd == BIO_WRITE) {
if ((rdp->disks[buf1->drive+rdp->width].flags & AR_DF_ONLINE) ||
diff --git a/sys/dev/ata/ata-raid.h b/sys/dev/ata/ata-raid.h
index f6bab6e8..2b6ba54 100644
--- a/sys/dev/ata/ata-raid.h
+++ b/sys/dev/ata/ata-raid.h
@@ -64,6 +64,7 @@ struct ar_softc {
#define AR_F_PROMISE_RAID 0x1000
#define AR_F_HIGHPOINT_RAID 0x2000
#define AR_F_FREEBSD_RAID 0x4000
+#define AR_F_TOGGLE 0x8000
int total_disks; /* number of disks in this array */
int generation; /* generation of this array */
OpenPOWER on IntegriCloud