summaryrefslogtreecommitdiffstats
path: root/sbin/geom/class
diff options
context:
space:
mode:
authoraraujo <araujo@FreeBSD.org>2017-05-17 05:21:03 +0000
committeraraujo <araujo@FreeBSD.org>2017-05-17 05:21:03 +0000
commit654221cf4ba7456c568d9e2ea7e42797a8a8ee16 (patch)
tree17054e972c5250ea8078a2fe747088ba28438cb9 /sbin/geom/class
parent53eda0a5c93b875f1ecdaa975670376deca1d71b (diff)
downloadFreeBSD-src-654221cf4ba7456c568d9e2ea7e42797a8a8ee16.zip
FreeBSD-src-654221cf4ba7456c568d9e2ea7e42797a8a8ee16.tar.gz
MFC r315112, r315196
r315112: Add the capability to refresh the gpart(8) label without need a reboot. gpart(8) has functionality to change the label of an GPT partition. This functionality works like it should, however, after a label change the /dev/gpt/ entries remain unchanged. glabel(8) status output remains unchanged. The change only takes effect after a reboot. PR: 162690 Submitted by: sub.mesa@gmail, Ben RUBSON <ben.rubson@gmail.com>, ae Reviewed by: allanjude, bapt, bcr Differential Revision: https://reviews.freebsd.org/D9935 r315196: After r315112 I broke the tests with eli, instead to pass 0, I should pass M_NOWAIT to g_media_changed() that will call g_post_event() with this flag. Reported by: lwhsu, ngie and ae
Diffstat (limited to 'sbin/geom/class')
-rw-r--r--sbin/geom/class/label/geom_label.c31
-rw-r--r--sbin/geom/class/label/glabel.87
2 files changed, 37 insertions, 1 deletions
diff --git a/sbin/geom/class/label/geom_label.c b/sbin/geom/class/label/geom_label.c
index 6c880ee..8a2f57c 100644
--- a/sbin/geom/class/label/geom_label.c
+++ b/sbin/geom/class/label/geom_label.c
@@ -53,6 +53,7 @@ static void label_main(struct gctl_req *req, unsigned flags);
static void label_clear(struct gctl_req *req);
static void label_dump(struct gctl_req *req);
static void label_label(struct gctl_req *req);
+static void label_refresh(struct gctl_req *req);
struct g_command PUBSYM(class_commands)[] = {
{ "clear", G_FLAG_VERBOSE, label_main, G_NULL_OPTS,
@@ -74,6 +75,9 @@ struct g_command PUBSYM(class_commands)[] = {
{ "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, label_main, G_NULL_OPTS,
"[-v] name dev"
},
+ { "refresh", 0, label_main, G_NULL_OPTS,
+ "dev ..."
+ },
{ "stop", G_FLAG_VERBOSE, NULL,
{
{ 'f', "force", NULL, G_TYPE_BOOL },
@@ -105,6 +109,8 @@ label_main(struct gctl_req *req, unsigned flags)
label_clear(req);
else if (strcmp(name, "dump") == 0)
label_dump(req);
+ else if (strcmp(name, "refresh") == 0)
+ label_refresh(req);
else
gctl_error(req, "Unknown command: %s.", name);
}
@@ -223,3 +229,28 @@ label_dump(struct gctl_req *req)
printf("\n");
}
}
+
+static void
+label_refresh(struct gctl_req *req)
+{
+ const char *name;
+ int i, nargs, fd;
+
+ nargs = gctl_get_int(req, "nargs");
+ if (nargs < 1) {
+ gctl_error(req, "Too few arguments.");
+ return;
+ }
+
+ for (i = 0; i < nargs; i++) {
+ name = gctl_get_ascii(req, "arg%d", i);
+ fd = g_open(name, 1);
+ if (fd == -1) {
+ printf("Can't refresh metadata from %s: %s.\n",
+ name, strerror(errno));
+ } else {
+ printf("Metadata from %s refreshed.\n", name);
+ (void)g_close(fd);
+ }
+ }
+}
diff --git a/sbin/geom/class/label/glabel.8 b/sbin/geom/class/label/glabel.8
index a2f665e..c426a06 100644
--- a/sbin/geom/class/label/glabel.8
+++ b/sbin/geom/class/label/glabel.8
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 22, 2013
+.Dd March 12, 2017
.Dt GLABEL 8
.Os
.Sh NAME
@@ -57,6 +57,9 @@
.Cm dump
.Ar dev ...
.Nm
+.Cm refresh
+.Ar dev ...
+.Nm
.Cm list
.Nm
.Cm status
@@ -186,6 +189,8 @@ Same as
Clear metadata on the given devices.
.It Cm dump
Dump metadata stored on the given devices.
+.It Cm refresh
+Refresh / rediscover metadata from the given devices.
.It Cm list
See
.Xr geom 8 .
OpenPOWER on IntegriCloud