Page MenuHomeFreeBSD

D19535.id54911.diff
No OneTemporary

D19535.id54911.diff

Index: sys/geom/geom_flashmap.h
===================================================================
--- sys/geom/geom_flashmap.h
+++ sys/geom/geom_flashmap.h
@@ -0,0 +1,39 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2019 Ian Lepore <ian@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD:
+ */
+
+#ifndef _GEOM_GEOM_FLASHMAP_H_
+
+#define FLASHMAP_CLASS_NAME "Flashmap"
+
+struct g_flashmap {
+ const char *labels[FLASH_SLICES_MAX_NUM];
+};
+
+#endif
+
Index: sys/geom/geom_flashmap.c
===================================================================
--- sys/geom/geom_flashmap.c
+++ sys/geom/geom_flashmap.c
@@ -39,13 +39,12 @@
#include <sys/slicer.h>
#include <geom/geom.h>
+#include <geom/geom_flashmap.h>
#include <geom/geom_slice.h>
#include <geom/geom_disk.h>
#include <dev/nand/nand_dev.h>
-#define FLASHMAP_CLASS_NAME "Flashmap"
-
struct g_flashmap_slice {
off_t sl_start;
off_t sl_end;
@@ -71,8 +70,8 @@
static int g_flashmap_load(device_t dev, struct g_provider *pp,
flash_slicer_t slicer, struct g_flashmap_head *head);
-static int g_flashmap_modify(struct g_geom *gp, const char *devname,
- int secsize, struct g_flashmap_head *slices);
+static int g_flashmap_modify(struct g_flashmap *gfp, struct g_geom *gp,
+ const char *devname, int secsize, struct g_flashmap_head *slices);
static void g_flashmap_print(struct g_flashmap_slice *slice);
MALLOC_DECLARE(M_FLASHMAP);
@@ -88,8 +87,8 @@
}
static int
-g_flashmap_modify(struct g_geom *gp, const char *devname, int secsize,
- struct g_flashmap_head *slices)
+g_flashmap_modify(struct g_flashmap *gfp, struct g_geom *gp,
+ const char *devname, int secsize, struct g_flashmap_head *slices)
{
struct g_flashmap_slice *slice;
int i, error;
@@ -114,6 +113,8 @@
i = 0;
STAILQ_FOREACH(slice, slices, sl_link) {
+ free(__DECONST(void *, gfp->labels[i]), M_FLASHMAP);
+ gfp->labels[i] = strdup(slice->sl_name, M_FLASHMAP);
error = g_slice_config(gp, i++, G_SLICE_CONFIG_SET,
slice->sl_start,
slice->sl_end - slice->sl_start + 1,
@@ -153,6 +154,7 @@
struct g_consumer *cp;
struct g_flashmap_head head;
struct g_flashmap_slice *slice, *slice_temp;
+ struct g_flashmap *gfp;
flash_slicer_t slicer;
device_t dev;
int i, size;
@@ -164,7 +166,8 @@
strcmp(pp->geom->class->name, G_DISK_CLASS_NAME) != 0)
return (NULL);
- gp = g_slice_new(mp, FLASH_SLICES_MAX_NUM, pp, &cp, NULL, 0, NULL);
+ gp = g_slice_new(mp, FLASH_SLICES_MAX_NUM, pp, &cp, (void**)&gfp,
+ sizeof(struct g_flashmap), NULL);
if (gp == NULL)
return (NULL);
@@ -186,7 +189,7 @@
if (g_flashmap_load(dev, pp, slicer, &head) == 0)
break;
- g_flashmap_modify(gp, cp->provider->name,
+ g_flashmap_modify(gfp, gp, cp->provider->name,
cp->provider->sectorsize, &head);
} while (0);
Index: sys/geom/label/g_label.h
===================================================================
--- sys/geom/label/g_label.h
+++ sys/geom/label/g_label.h
@@ -88,6 +88,7 @@
extern struct g_label_desc g_label_gpt;
extern struct g_label_desc g_label_gpt_uuid;
extern struct g_label_desc g_label_disk_ident;
+extern struct g_label_desc g_label_flashmap;
extern void g_label_rtrim(char *label, size_t size);
#endif /* _KERNEL */
Index: sys/geom/label/g_label.c
===================================================================
--- sys/geom/label/g_label.c
+++ sys/geom/label/g_label.c
@@ -95,6 +95,7 @@
&g_label_reiserfs,
&g_label_ntfs,
&g_label_disk_ident,
+ &g_label_flashmap,
#endif
NULL
};
Index: sys/geom/label/g_label_flashmap.c
===================================================================
--- sys/geom/label/g_label_flashmap.c
+++ sys/geom/label/g_label_flashmap.c
@@ -0,0 +1,77 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2019 Ian Lepore <ian@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/slicer.h>
+
+#include <geom/geom.h>
+#include <geom/geom_flashmap.h>
+#include <geom/geom_slice.h>
+#include <geom/label/g_label.h>
+
+#define G_LABEL_FLASHMAP_SLICE_DIR "flash"
+
+static void
+g_label_flashmap_taste(struct g_consumer *cp, char *label, size_t size)
+{
+ struct g_provider *pp;
+ struct g_slicer *gsp;
+ struct g_flashmap *gfp;
+
+ g_topology_assert_not();
+
+ pp = cp->provider;
+ label[0] = '\0';
+
+ /* We taste only partitions handled by flashmap */
+ if (strncmp(pp->geom->class->name, FLASHMAP_CLASS_NAME,
+ sizeof(FLASHMAP_CLASS_NAME)) != 0)
+ return;
+
+ gsp = (struct g_slicer *)pp->geom->softc;
+ gfp = (struct g_flashmap *)gsp->softc;
+
+ /* If it's handled by flashmap it should have a label, but be safe. */
+ if (gfp->labels[pp->index] == NULL)
+ return;
+
+ strlcpy(label, gfp->labels[pp->index], size);
+}
+
+struct g_label_desc g_label_flashmap = {
+ .ld_taste = g_label_flashmap_taste,
+ .ld_dir = G_LABEL_FLASHMAP_SLICE_DIR,
+ .ld_enabled = 1
+};
+
+G_LABEL_INIT(flashmap, g_label_flashmap, "Create device nodes for Flashmap labels");

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 6, 12:57 AM (1 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30926619
Default Alt Text
D19535.id54911.diff (7 KB)

Event Timeline