Changeset View
Changeset View
Standalone View
Standalone View
sys/geom/raid3/g_raid3.c
Show First 20 Lines • Show All 1,717 Lines • ▼ Show 20 Lines | if (sync->ds_offset == sc->sc_mediasize / (sc->sc_ndisks - 1) || | ||||
return; | return; | ||||
} | } | ||||
/* Send next synchronization request. */ | /* Send next synchronization request. */ | ||||
data = bp->bio_data; | data = bp->bio_data; | ||||
g_reset_bio(bp); | g_reset_bio(bp); | ||||
bp->bio_cmd = BIO_READ; | bp->bio_cmd = BIO_READ; | ||||
bp->bio_offset = sync->ds_offset * (sc->sc_ndisks - 1); | bp->bio_offset = sync->ds_offset * (sc->sc_ndisks - 1); | ||||
bp->bio_length = MIN(MAXPHYS, sc->sc_mediasize - bp->bio_offset); | bp->bio_length = MIN(maxphys, sc->sc_mediasize - bp->bio_offset); | ||||
sync->ds_offset += bp->bio_length / (sc->sc_ndisks - 1); | sync->ds_offset += bp->bio_length / (sc->sc_ndisks - 1); | ||||
bp->bio_done = g_raid3_sync_done; | bp->bio_done = g_raid3_sync_done; | ||||
bp->bio_data = data; | bp->bio_data = data; | ||||
bp->bio_from = sync->ds_consumer; | bp->bio_from = sync->ds_consumer; | ||||
bp->bio_to = sc->sc_provider; | bp->bio_to = sc->sc_provider; | ||||
G_RAID3_LOGREQ(3, bp, "Sending synchronization request."); | G_RAID3_LOGREQ(3, bp, "Sending synchronization request."); | ||||
sync->ds_consumer->index++; | sync->ds_consumer->index++; | ||||
/* | /* | ||||
Show All 12 Lines | case BIO_WRITE: | ||||
for (i = 0; i < g_raid3_syncreqs; i++) { | for (i = 0; i < g_raid3_syncreqs; i++) { | ||||
bp = sync->ds_bios[i]; | bp = sync->ds_bios[i]; | ||||
boffset = bp->bio_offset; | boffset = bp->bio_offset; | ||||
if (bp->bio_cmd == BIO_WRITE) | if (bp->bio_cmd == BIO_WRITE) | ||||
boffset *= sc->sc_ndisks - 1; | boffset *= sc->sc_ndisks - 1; | ||||
if (boffset < moffset) | if (boffset < moffset) | ||||
moffset = boffset; | moffset = boffset; | ||||
} | } | ||||
if (sync->ds_offset_done + (MAXPHYS * 100) < moffset) { | if (sync->ds_offset_done + maxphys * 100 < moffset) { | ||||
/* Update offset_done on every 100 blocks. */ | /* Update offset_done on every 100 blocks. */ | ||||
sync->ds_offset_done = moffset; | sync->ds_offset_done = moffset; | ||||
g_raid3_update_metadata(disk); | g_raid3_update_metadata(disk); | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
default: | default: | ||||
KASSERT(1 == 0, ("Invalid command here: %u (device=%s)", | KASSERT(1 == 0, ("Invalid command here: %u (device=%s)", | ||||
▲ Show 20 Lines • Show All 472 Lines • ▼ Show 20 Lines | g_raid3_sync_start(struct g_raid3_softc *sc) | ||||
*/ | */ | ||||
disk->d_sync.ds_bios = malloc(sizeof(struct bio *) * g_raid3_syncreqs, | disk->d_sync.ds_bios = malloc(sizeof(struct bio *) * g_raid3_syncreqs, | ||||
M_RAID3, M_WAITOK); | M_RAID3, M_WAITOK); | ||||
for (n = 0; n < g_raid3_syncreqs; n++) { | for (n = 0; n < g_raid3_syncreqs; n++) { | ||||
bp = g_alloc_bio(); | bp = g_alloc_bio(); | ||||
disk->d_sync.ds_bios[n] = bp; | disk->d_sync.ds_bios[n] = bp; | ||||
bp->bio_parent = NULL; | bp->bio_parent = NULL; | ||||
bp->bio_cmd = BIO_READ; | bp->bio_cmd = BIO_READ; | ||||
bp->bio_data = malloc(MAXPHYS, M_RAID3, M_WAITOK); | bp->bio_data = malloc(maxphys, M_RAID3, M_WAITOK); | ||||
bp->bio_cflags = 0; | bp->bio_cflags = 0; | ||||
bp->bio_offset = disk->d_sync.ds_offset * (sc->sc_ndisks - 1); | bp->bio_offset = disk->d_sync.ds_offset * (sc->sc_ndisks - 1); | ||||
bp->bio_length = MIN(MAXPHYS, sc->sc_mediasize - bp->bio_offset); | bp->bio_length = MIN(maxphys, sc->sc_mediasize - bp->bio_offset); | ||||
disk->d_sync.ds_offset += bp->bio_length / (sc->sc_ndisks - 1); | disk->d_sync.ds_offset += bp->bio_length / (sc->sc_ndisks - 1); | ||||
bp->bio_done = g_raid3_sync_done; | bp->bio_done = g_raid3_sync_done; | ||||
bp->bio_from = disk->d_sync.ds_consumer; | bp->bio_from = disk->d_sync.ds_consumer; | ||||
bp->bio_to = sc->sc_provider; | bp->bio_to = sc->sc_provider; | ||||
bp->bio_caller1 = (void *)(uintptr_t)n; | bp->bio_caller1 = (void *)(uintptr_t)n; | ||||
} | } | ||||
/* Set the number of in-flight synchronization requests. */ | /* Set the number of in-flight synchronization requests. */ | ||||
▲ Show 20 Lines • Show All 648 Lines • ▼ Show 20 Lines | G_RAID3_DEBUG(0, | ||||
cp->provider->name); | cp->provider->name); | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
if (error != 0) { | if (error != 0) { | ||||
G_RAID3_DEBUG(1, "MD5 metadata hash mismatch for provider %s.", | G_RAID3_DEBUG(1, "MD5 metadata hash mismatch for provider %s.", | ||||
cp->provider->name); | cp->provider->name); | ||||
return (error); | return (error); | ||||
} | } | ||||
if (md->md_sectorsize > MAXPHYS) { | if (md->md_sectorsize > maxphys) { | ||||
G_RAID3_DEBUG(0, "The blocksize is too big."); | G_RAID3_DEBUG(0, "The blocksize is too big."); | ||||
return (EINVAL); | return (EINVAL); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 669 Lines • Show Last 20 Lines |