Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Sep 2023 20:44:31 GMT
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 422efa7050a7 - stable/13 - Implement GEOM::rotation_rate for gmirror
Message-ID:  <202309062044.386KiVE1002362@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by asomers:

URL: https://cgit.FreeBSD.org/src/commit/?id=422efa7050a7a0a75f04aed2c857a2e2ea4f51ed

commit 422efa7050a7a0a75f04aed2c857a2e2ea4f51ed
Author:     Alan Somers <asomers@FreeBSD.org>
AuthorDate: 2023-04-07 16:07:50 +0000
Commit:     Alan Somers <asomers@FreeBSD.org>
CommitDate: 2023-09-06 20:42:59 +0000

    Implement GEOM::rotation_rate for gmirror
    
    If all of the mirror's children have the same rotation rate, report
    that.  But if they have mixed rotation rates, or if any child has an
    unknown rotation rate, report "Unknown".
    
    Sponsored by:   Axcient
    Reviewed by:    imp
    Differential Revision: https://reviews.freebsd.org/D39458
    
    (cherry picked from commit 9309a460b23a8cda8d47c5f775da7fc6472d9925)
---
 sys/geom/mirror/g_mirror.c | 29 +++++++++++++++++++++++++++++
 sys/geom/mirror/g_mirror.h |  1 +
 2 files changed, 30 insertions(+)

diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c
index 223412224cb0..14eabe242d2d 100644
--- a/sys/geom/mirror/g_mirror.c
+++ b/sys/geom/mirror/g_mirror.c
@@ -46,6 +46,7 @@
 
 #include <geom/geom.h>
 #include <geom/geom_dbg.h>
+#include <geom/geom_disk.h>
 #include <geom/mirror/g_mirror.h>
 
 FEATURE(geom_mirror, "GEOM mirroring support");
@@ -477,6 +478,10 @@ g_mirror_init_disk(struct g_mirror_softc *sc, struct g_provider *pp,
 	error = g_getattr("GEOM::candelete", disk->d_consumer, &i);
 	if (error == 0 && i != 0)
 		disk->d_flags |= G_MIRROR_DISK_FLAG_CANDELETE;
+	error = g_getattr("GEOM::rotation_rate", disk->d_consumer,
+		&disk->d_rotation_rate);
+	if (error)
+		disk->d_rotation_rate = DISK_RR_UNKNOWN;
 	if (md->md_provider[0] != '\0')
 		disk->d_flags |= G_MIRROR_DISK_FLAG_HARDCODED;
 	disk->d_sync.ds_consumer = NULL;
@@ -1145,6 +1150,27 @@ g_mirror_kernel_dump(struct bio *bp)
 	    g_mirror_get_diskname(disk));
 }
 
+static void
+g_mirror_rotation_rate(struct bio *bp)
+{
+	struct g_mirror_softc *sc;
+	struct g_mirror_disk *disk;
+	bool first = true;
+	uint16_t rr = DISK_RR_UNKNOWN;
+
+	sc = bp->bio_to->private;
+	LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+		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_mirror_start(struct bio *bp)
 {
@@ -1174,6 +1200,9 @@ g_mirror_start(struct bio *bp)
 		} else if (strcmp("GEOM::kerneldump", bp->bio_attribute) == 0) {
 			g_mirror_kernel_dump(bp);
 			return;
+		} else if (!strcmp(bp->bio_attribute, "GEOM::rotation_rate")) {
+			g_mirror_rotation_rate(bp);
+			return;
 		}
 		/* FALLTHROUGH */
 	default:
diff --git a/sys/geom/mirror/g_mirror.h b/sys/geom/mirror/g_mirror.h
index 3b6880ee004d..76e736584c4b 100644
--- a/sys/geom/mirror/g_mirror.h
+++ b/sys/geom/mirror/g_mirror.h
@@ -137,6 +137,7 @@ struct g_mirror_disk {
 	u_int		 d_init_ndisks;	/* Initial number of mirror components */
 	uint32_t	 d_init_slice;	/* Initial slice size */
 	uint8_t		 d_init_balance;/* Initial balance */
+	uint16_t	 d_rotation_rate;/* Disk's rotation rate */
 	uint64_t	 d_init_mediasize;/* Initial mediasize */
 };
 #define	d_name	d_consumer->provider->name



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202309062044.386KiVE1002362>