mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Fix synchronization in gmirror and graid3 which I broken. Synchronization
request can still have bio_to set to sc_provider (this is READ part of a
synchronization request) and in this case g_{mirror,raid3}_sync() wasn't
called as it should be.
MFC after: 1 week
This commit is contained in:
parent
708e9ef188
commit
8e007c52fd
2 changed files with 12 additions and 6 deletions
|
|
@ -874,7 +874,7 @@ g_mirror_done(struct bio *bp)
|
|||
struct g_mirror_softc *sc;
|
||||
|
||||
sc = bp->bio_from->geom->softc;
|
||||
bp->bio_cflags |= G_MIRROR_BIO_FLAG_REGULAR;
|
||||
bp->bio_cflags = G_MIRROR_BIO_FLAG_REGULAR;
|
||||
mtx_lock(&sc->sc_queue_mtx);
|
||||
bioq_disksort(&sc->sc_queue, bp);
|
||||
wakeup(sc);
|
||||
|
|
@ -1002,7 +1002,7 @@ g_mirror_sync_done(struct bio *bp)
|
|||
|
||||
G_MIRROR_LOGREQ(3, bp, "Synchronization request delivered.");
|
||||
sc = bp->bio_from->geom->softc;
|
||||
bp->bio_cflags |= G_MIRROR_BIO_FLAG_SYNC;
|
||||
bp->bio_cflags = G_MIRROR_BIO_FLAG_SYNC;
|
||||
mtx_lock(&sc->sc_queue_mtx);
|
||||
bioq_disksort(&sc->sc_queue, bp);
|
||||
wakeup(sc);
|
||||
|
|
@ -1813,11 +1813,14 @@ g_mirror_worker(void *arg)
|
|||
bioq_remove(&sc->sc_queue, bp);
|
||||
mtx_unlock(&sc->sc_queue_mtx);
|
||||
|
||||
if (bp->bio_to != sc->sc_provider) {
|
||||
if (bp->bio_from->geom == sc->sc_sync.ds_geom &&
|
||||
(bp->bio_cflags & G_MIRROR_BIO_FLAG_SYNC) != 0) {
|
||||
g_mirror_sync_request(bp); /* READ */
|
||||
} else if (bp->bio_to != sc->sc_provider) {
|
||||
if ((bp->bio_cflags & G_MIRROR_BIO_FLAG_REGULAR) != 0)
|
||||
g_mirror_regular_request(bp);
|
||||
else if ((bp->bio_cflags & G_MIRROR_BIO_FLAG_SYNC) != 0)
|
||||
g_mirror_sync_request(bp);
|
||||
g_mirror_sync_request(bp); /* WRITE */
|
||||
else {
|
||||
KASSERT(0,
|
||||
("Invalid request cflags=0x%hhx to=%s.",
|
||||
|
|
|
|||
|
|
@ -2061,11 +2061,14 @@ process:
|
|||
bioq_remove(&sc->sc_queue, bp);
|
||||
mtx_unlock(&sc->sc_queue_mtx);
|
||||
|
||||
if (bp->bio_to != sc->sc_provider) {
|
||||
if (bp->bio_from->geom == sc->sc_sync.ds_geom &&
|
||||
(bp->bio_cflags & G_RAID3_BIO_CFLAG_SYNC) != 0) {
|
||||
g_raid3_sync_request(bp); /* READ */
|
||||
} else if (bp->bio_to != sc->sc_provider) {
|
||||
if ((bp->bio_cflags & G_RAID3_BIO_CFLAG_REGULAR) != 0)
|
||||
g_raid3_regular_request(bp);
|
||||
else if ((bp->bio_cflags & G_RAID3_BIO_CFLAG_SYNC) != 0)
|
||||
g_raid3_sync_request(bp);
|
||||
g_raid3_sync_request(bp); /* WRITE */
|
||||
else {
|
||||
KASSERT(0,
|
||||
("Invalid request cflags=0x%hhx to=%s.",
|
||||
|
|
|
|||
Loading…
Reference in a new issue