From 19e5b2d50eb01ed6ea59ae3ff449ea72081ffb56 Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Fri, 18 Oct 2013 09:14:19 +0000 Subject: [PATCH] Make geom_label(4) resize-aware. This fixes a situation when "gpart resize" would resize a partition, but label providers - e.g. /dev/gptid/XXX - would stay the same size. Reviewed by: mav MFC after: 1 month Sponsored by: FreeBSD Foundation --- sys/geom/geom_slice.c | 2 +- sys/geom/label/g_label.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/sys/geom/geom_slice.c b/sys/geom/geom_slice.c index 0f12a0ab642..976d84091e8 100644 --- a/sys/geom/geom_slice.c +++ b/sys/geom/geom_slice.c @@ -382,7 +382,7 @@ g_slice_config(struct g_geom *gp, u_int idx, int how, off_t offset, off_t length printf("GEOM: Reconfigure %s, start %jd length %jd end %jd\n", pp->name, (intmax_t)offset, (intmax_t)length, (intmax_t)(offset + length - 1)); - pp->mediasize = gsl->length; + g_resize_provider(pp, gsl->length); return (0); } sb = sbuf_new_auto(); diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c index 2011b770d7a..e6c87ec1fc9 100644 --- a/sys/geom/label/g_label.c +++ b/sys/geom/label/g_label.c @@ -124,6 +124,17 @@ g_label_spoiled(struct g_consumer *cp) g_slice_spoiled(cp); } +static void +g_label_resize(struct g_consumer *cp) +{ + + G_LABEL_DEBUG(1, "Label %s resized.", + LIST_FIRST(&cp->geom->provider)->name); + + g_slice_config(cp->geom, 0, G_SLICE_CONFIG_FORCE, (off_t)0, + cp->provider->mediasize, cp->provider->sectorsize, NULL); +} + static int g_label_is_name_ok(const char *label) { @@ -208,6 +219,7 @@ g_label_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, } gp->orphan = g_label_orphan; gp->spoiled = g_label_spoiled; + gp->resize = g_label_resize; g_access(cp, -1, 0, 0); g_slice_config(gp, 0, G_SLICE_CONFIG_SET, (off_t)0, mediasize, pp->sectorsize, "%s", name);