The branch main has been updated by mav: URL: https://cgit.FreeBSD.org/src/commit/?id=e5283a9da86a0080ab0267bcbff4febb049d323d
commit e5283a9da86a0080ab0267bcbff4febb049d323d Author: Alexander Motin <[email protected]> AuthorDate: 2026-08-29 17:59:05 +0000 Commit: Alexander Motin <[email protected]> CommitDate: 2026-08-29 18:00:02 +0000 graid3: Add rotation rate support If all member devices report the same rotation rate, pass it up. --- sys/geom/raid3/g_raid3.c | 33 +++++++++++++++++++++++++++++++++ sys/geom/raid3/g_raid3.h | 1 + 2 files changed, 34 insertions(+) diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c index 64951bd01deb..0436d9286532 100644 --- a/sys/geom/raid3/g_raid3.c +++ b/sys/geom/raid3/g_raid3.c @@ -47,6 +47,7 @@ #include <geom/geom.h> #include <geom/geom_dbg.h> +#include <geom/geom_disk.h> #include <geom/raid3/g_raid3.h> FEATURE(geom_raid3, "GEOM RAID-3 functionality"); @@ -564,6 +565,10 @@ g_raid3_init_disk(struct g_raid3_softc *sc, struct g_provider *pp, } disk->d_state = G_RAID3_DISK_STATE_NONE; disk->d_flags = md->md_dflags; + error = g_getattr("GEOM::rotation_rate", disk->d_consumer, + &disk->d_rotation_rate); + if (error != 0) + disk->d_rotation_rate = DISK_RR_UNKNOWN; if (md->md_provider[0] != '\0') disk->d_flags |= G_RAID3_DISK_FLAG_HARDCODED; disk->d_sync.ds_consumer = NULL; @@ -1451,6 +1456,29 @@ g_raid3_flush(struct g_raid3_softc *sc, struct bio *bp) } } +static void +g_raid3_rotation_rate(struct g_raid3_softc *sc, struct bio *bp) +{ + struct g_raid3_disk *disk; + bool first = true; + uint16_t rr = DISK_RR_UNKNOWN; + u_int n; + + for (n = 0; n < sc->sc_ndisks; n++) { + disk = &sc->sc_disks[n]; + if (disk->d_state == G_RAID3_DISK_STATE_NODISK) + continue; + if (first) + rr = disk->d_rotation_rate; + else if (rr != disk->d_rotation_rate) { + rr = DISK_RR_UNKNOWN; + break; + } + first = false; + } + g_handleattr(bp, "GEOM::rotation_rate", &rr, sizeof(rr)); +} + static void g_raid3_start(struct bio *bp) { @@ -1477,6 +1505,11 @@ g_raid3_start(struct bio *bp) g_raid3_flush(sc, bp); return; case BIO_GETATTR: + if (!strcmp(bp->bio_attribute, "GEOM::rotation_rate")) { + g_raid3_rotation_rate(sc, bp); + return; + } + /* FALLTHROUGH */ default: g_io_deliver(bp, EOPNOTSUPP); return; diff --git a/sys/geom/raid3/g_raid3.h b/sys/geom/raid3/g_raid3.h index 3eecc02798a9..8650de2527b1 100644 --- a/sys/geom/raid3/g_raid3.h +++ b/sys/geom/raid3/g_raid3.h @@ -124,6 +124,7 @@ struct g_raid3_disk { struct g_consumer *d_consumer; /* Consumer. */ struct g_raid3_softc *d_softc; /* Back-pointer to softc. */ int d_state; /* Disk state. */ + uint16_t d_rotation_rate;/* Disk's rotation rate. */ uint64_t d_flags; /* Additional flags. */ u_int d_genid; /* Disk's generation ID. */ struct g_raid3_disk_sync d_sync; /* Sync information. */
