summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sbin/geom/class/label/geom_label.c31
-rw-r--r--sbin/geom/class/label/glabel.87
-rw-r--r--sys/geom/part/g_part.c4
3 files changed, 41 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 .
diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c
index a751398..b6f49ce 100644
--- a/sys/geom/part/g_part.c
+++ b/sys/geom/part/g_part.c
@@ -884,6 +884,10 @@ g_part_ctl_commit(struct gctl_req *req, struct g_part_parms *gpp)
LIST_FOREACH_SAFE(entry, &table->gpt_entry, gpe_entry, tmp) {
if (!entry->gpe_deleted) {
+ /* Notify consumers that provider might be changed. */
+ if (entry->gpe_modified && (
+ entry->gpe_pp->acw + entry->gpe_pp->ace) == 0)
+ g_media_changed(entry->gpe_pp, M_NOWAIT);
entry->gpe_created = 0;
entry->gpe_modified = 0;
continue;
OpenPOWER on IntegriCloud