diff options
author | sos <sos@FreeBSD.org> | 2003-05-04 16:17:54 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2003-05-04 16:17:54 +0000 |
commit | e39ff773309616a7488a10c27e70a8374d902176 (patch) | |
tree | 8c355f43a726cfd9d4b679cbee628e6d1f9829e0 /sys/dev/ata/ata-raid.c | |
parent | ca059a5aeaae9d5813d714fca45f1aad81e33e85 (diff) | |
download | FreeBSD-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/dev/ata/ata-raid.c')
-rw-r--r-- | sys/dev/ata/ata-raid.c | 33 |
1 files changed, 27 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) || |