diff options
| author | Søren Schmidt <sos@FreeBSD.org> | 2003-11-24 14:22:30 +0000 |
|---|---|---|
| committer | Søren Schmidt <sos@FreeBSD.org> | 2003-11-24 14:22:30 +0000 |
| commit | 61058204d5794b4cb614b97f90e15575dca34254 (patch) | |
| tree | e0f492e7cdb42e15a74895f1d86cebb4b05ae9ce /sys/dev | |
| parent | 62104e9446341fa8b8b4742655c9df4fde6bdfa2 (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ata/ata-raid.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c index c424c7f9f123..d541f0e5b6b2 100644 --- a/sys/dev/ata/ata-raid.c +++ b/sys/dev/ata/ata-raid.c @@ -774,17 +774,24 @@ arstrategy(struct bio *bp) return; } if (bp->bio_cmd == BIO_READ) { + int src_online = + (rdp->disks[buf1->drive].flags & AR_DF_ONLINE); + int mir_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 >= + if (!(mir_online) || + ((src_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 >= + else if (!src_online) || + ((mir_online) && + buf1->bp.bio_pblkno >= (rdp->disks[buf1->drive + rdp->width].last_lba - AR_PROXIMITY) && buf1->bp.bio_pblkno <= |
