Module Name:    src
Committed By:   tkusumi
Date:           Thu Dec 12 16:28:24 UTC 2019

Modified Files:
        src/sys/dev/dm: dm.h dm_ioctl.c dm_target_error.c dm_target_linear.c
            dm_target_mirror.c dm_target_snapshot.c dm_target_stripe.c
            dm_target_zero.c

Log Message:
dm: Make target's ->init() take parsed argc and argv

This gets rid of the same parser code in each target using strsep(3).
taken-from: DragonFlyBSD


To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/dev/dm/dm.h
cvs rdiff -u -r1.40 -r1.41 src/sys/dev/dm/dm_ioctl.c
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/dm/dm_target_error.c
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/dm/dm_target_linear.c
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/dm/dm_target_mirror.c
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/dm/dm_target_snapshot.c
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/dm/dm_target_stripe.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/dm/dm_target_zero.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/dm/dm.h
diff -u src/sys/dev/dm/dm.h:1.38 src/sys/dev/dm/dm.h:1.39
--- src/sys/dev/dm/dm.h:1.38	Sun Dec  8 14:59:42 2019
+++ src/sys/dev/dm/dm.h	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm.h,v 1.38 2019/12/08 14:59:42 tkusumi Exp $      */
+/*        $NetBSD: dm.h,v 1.39 2019/12/12 16:28:24 tkusumi Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -174,7 +174,7 @@ typedef struct target_linear_devs dm_tar
 typedef struct dm_target {
 	char name[DM_MAX_TYPE_NAME];
 	/* Initialize target_config area */
-	int (*init)(dm_table_entry_t *, char *);
+	int (*init)(dm_table_entry_t *, int, char **);
 
 	/* Destroy target_config area */
 	int (*destroy)(dm_table_entry_t *);
@@ -193,6 +193,7 @@ typedef struct dm_target {
 
 	uint32_t version[3];
 	uint32_t ref_cnt;
+	int max_argc;
 
 	TAILQ_ENTRY(dm_target) dm_target_next;
 } dm_target_t;
@@ -236,7 +237,7 @@ int dm_target_init(void);
 #define DM_MAX_PARAMS_SIZE 1024
 
 /* dm_target_linear.c */
-int dm_target_linear_init(dm_table_entry_t *, char *);
+int dm_target_linear_init(dm_table_entry_t *, int, char **);
 char *dm_target_linear_status(void *);
 int dm_target_linear_strategy(dm_table_entry_t *, struct buf *);
 int dm_target_linear_sync(dm_table_entry_t *);
@@ -249,7 +250,7 @@ int dm_target_linear_secsize(dm_table_en
 uint64_t atoi(const char *);
 
 /* dm_target_stripe.c */
-int dm_target_stripe_init(dm_table_entry_t *, char *);
+int dm_target_stripe_init(dm_table_entry_t *, int, char **);
 char *dm_target_stripe_status(void *);
 int dm_target_stripe_strategy(dm_table_entry_t *, struct buf *);
 int dm_target_stripe_sync(dm_table_entry_t *);

Index: src/sys/dev/dm/dm_ioctl.c
diff -u src/sys/dev/dm/dm_ioctl.c:1.40 src/sys/dev/dm/dm_ioctl.c:1.41
--- src/sys/dev/dm/dm_ioctl.c:1.40	Sun Dec  8 04:41:02 2019
+++ src/sys/dev/dm/dm_ioctl.c	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: dm_ioctl.c,v 1.40 2019/12/08 04:41:02 tkusumi Exp $      */
+/* $NetBSD: dm_ioctl.c,v 1.41 2019/12/12 16:28:24 tkusumi Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dm_ioctl.c,v 1.40 2019/12/08 04:41:02 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dm_ioctl.c,v 1.41 2019/12/12 16:28:24 tkusumi Exp $");
 
 /*
  * Locking is used to synchronise between ioctl calls and between dm_table's
@@ -118,6 +118,7 @@ static struct cfdata dm_cfdata = {
 } while (/*CONSTCOND*/0)
 
 static int dm_dbg_print_flags(int);
+static int dm_table_init(dm_target_t *, dm_table_entry_t *, char *);
 
 /*
  * Print flags sent to the kernel from libevmapper.
@@ -774,13 +775,7 @@ dm_table_load_ioctl(prop_dictionary_t dm
 		else
 			SLIST_INSERT_AFTER(last_table, table_en, next);
 
-		/*
-		 * Params string is different for every target,
-		 * therfore I have to pass it to target init
-		 * routine and parse parameters there.
-		 */
-
-		if ((ret = target->init(table_en, str)) != 0) {
+		if ((ret = dm_table_init(target, table_en, str)) != 0) {
 			dm_table_release(&dmv->table_head, DM_TABLE_INACTIVE);
 			dm_table_destroy(&dmv->table_head, DM_TABLE_INACTIVE);
 			free(str, M_TEMP);
@@ -802,6 +797,41 @@ dm_table_load_ioctl(prop_dictionary_t dm
 	return 0;
 }
 
+static int
+dm_table_init(dm_target_t *target, dm_table_entry_t *table_en, char *params)
+{
+	int i, n, ret, argc;
+	char **ap, **argv;
+
+	if (params == NULL)
+		return EINVAL;
+
+	n = target->max_argc;
+	if (n)
+		aprint_debug("Max argc %d for %s target\n", n, target->name);
+	else
+		n = 32; /* large enough for most targets */
+
+	argv = kmem_alloc(sizeof(*argv) * n, KM_SLEEP);
+
+	for (ap = argv;
+	     ap < &argv[n] && (*ap = strsep(&params, " \t")) != NULL;) {
+		if (**ap != '\0')
+			ap++;
+	}
+	argc = ap - argv;
+
+	for (i = 0; i < argc; i++)
+		aprint_debug("DM: argv[%d] = \"%s\"\n", i, argv[i]);
+
+	KASSERT(target->init);
+	ret = target->init(table_en, argc, argv);
+
+	kmem_free(argv, sizeof(*argv) * n);
+
+	return ret;
+}
+
 /*
  * Get description of all tables loaded to device from kernel
  * and send it to libdevmapper.

Index: src/sys/dev/dm/dm_target_error.c
diff -u src/sys/dev/dm/dm_target_error.c:1.18 src/sys/dev/dm/dm_target_error.c:1.19
--- src/sys/dev/dm/dm_target_error.c:1.18	Sun Dec  8 14:59:42 2019
+++ src/sys/dev/dm/dm_target_error.c	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_error.c,v 1.18 2019/12/08 14:59:42 tkusumi Exp $      */
+/*        $NetBSD: dm_target_error.c,v 1.19 2019/12/12 16:28:24 tkusumi Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dm_target_error.c,v 1.18 2019/12/08 14:59:42 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dm_target_error.c,v 1.19 2019/12/12 16:28:24 tkusumi Exp $");
 
 /*
  * This file implements initial version of device-mapper error target.
@@ -42,7 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: dm_target_er
 #include "dm.h"
 
 /* dm_target_error.c */
-int dm_target_error_init(dm_table_entry_t*, char *);
+int dm_target_error_init(dm_table_entry_t*, int, char **);
 char *dm_target_error_status(void *);
 int dm_target_error_strategy(dm_table_entry_t *, struct buf *);
 int dm_target_error_sync(dm_table_entry_t *);
@@ -111,7 +111,7 @@ dm_target_error_modcmd(modcmd_t cmd, voi
 
 /* Init function called from dm_table_load_ioctl. */
 int
-dm_target_error_init(dm_table_entry_t *table_en, char *params)
+dm_target_error_init(dm_table_entry_t *table_en, int argc, char **argv)
 {
 
 	printf("Error target init function called!!\n");

Index: src/sys/dev/dm/dm_target_linear.c
diff -u src/sys/dev/dm/dm_target_linear.c:1.26 src/sys/dev/dm/dm_target_linear.c:1.27
--- src/sys/dev/dm/dm_target_linear.c:1.26	Mon Dec  9 16:06:19 2019
+++ src/sys/dev/dm/dm_target_linear.c	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_linear.c,v 1.26 2019/12/09 16:06:19 tkusumi Exp $      */
+/*        $NetBSD: dm_target_linear.c,v 1.27 2019/12/12 16:28:24 tkusumi Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dm_target_linear.c,v 1.26 2019/12/09 16:06:19 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dm_target_linear.c,v 1.27 2019/12/12 16:28:24 tkusumi Exp $");
 
 /*
  * This file implements initial version of device-mapper dklinear target.
@@ -55,25 +55,17 @@ __KERNEL_RCSID(0, "$NetBSD: dm_target_li
  * @argv[1] is physical data offset.
  */
 int
-dm_target_linear_init(dm_table_entry_t *table_en, char *params)
+dm_target_linear_init(dm_table_entry_t *table_en, int argc, char **argv)
 {
 	dm_target_linear_config_t *tlc;
 	dm_pdev_t *dmp;
 
-	char **ap, *argv[3];
-
-	if (params == NULL)
-		return EINVAL;
-
 	/*
-	 * Parse a string, containing tokens delimited by white space,
-	 * into an argument vector
-	 */
-	for (ap = argv; ap < &argv[2] &&
-	    (*ap = strsep(&params, " \t")) != NULL;) {
-		if (**ap != '\0')
-			ap++;
+	if (argc != 2) {
+		printf("Linear target takes 2 args\n");
+		return EINVAL;
 	}
+	*/
 
 	aprint_debug("Linear target init function called %s--%s!!\n",
 	    argv[0], argv[1]);

Index: src/sys/dev/dm/dm_target_mirror.c
diff -u src/sys/dev/dm/dm_target_mirror.c:1.17 src/sys/dev/dm/dm_target_mirror.c:1.18
--- src/sys/dev/dm/dm_target_mirror.c:1.17	Sun Dec  8 14:59:42 2019
+++ src/sys/dev/dm/dm_target_mirror.c	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/*$NetBSD: dm_target_mirror.c,v 1.17 2019/12/08 14:59:42 tkusumi Exp $*/
+/*$NetBSD: dm_target_mirror.c,v 1.18 2019/12/12 16:28:24 tkusumi Exp $*/
 
 /*
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dm_target_mirror.c,v 1.17 2019/12/08 14:59:42 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dm_target_mirror.c,v 1.18 2019/12/12 16:28:24 tkusumi Exp $");
 
 /*
  * This file implements initial version of device-mapper mirror target.
@@ -42,7 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: dm_target_mi
 #include "dm.h"
 
 /* dm_target_mirror.c */
-int dm_target_mirror_init(dm_table_entry_t *, char *);
+int dm_target_mirror_init(dm_table_entry_t *, int, char **);
 char *dm_target_mirror_status(void *);
 int dm_target_mirror_strategy(dm_table_entry_t *, struct buf *);
 int dm_target_mirror_sync(dm_table_entry_t *);
@@ -127,7 +127,7 @@ dm_target_mirror_modcmd(modcmd_t cmd, vo
  * 0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
  */
 int
-dm_target_mirror_init(dm_table_entry_t *table_en, char *params)
+dm_target_mirror_init(dm_table_entry_t *table_en, int argc, char **argv)
 {
 
 	printf("Mirror target init function called!!\n");

Index: src/sys/dev/dm/dm_target_snapshot.c
diff -u src/sys/dev/dm/dm_target_snapshot.c:1.29 src/sys/dev/dm/dm_target_snapshot.c:1.30
--- src/sys/dev/dm/dm_target_snapshot.c:1.29	Sun Dec  8 14:59:42 2019
+++ src/sys/dev/dm/dm_target_snapshot.c	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_snapshot.c,v 1.29 2019/12/08 14:59:42 tkusumi Exp $      */
+/*        $NetBSD: dm_target_snapshot.c,v 1.30 2019/12/12 16:28:24 tkusumi Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dm_target_snapshot.c,v 1.29 2019/12/08 14:59:42 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dm_target_snapshot.c,v 1.30 2019/12/12 16:28:24 tkusumi Exp $");
 
 /*
  * 1. Suspend my_data to temporarily stop any I/O while the snapshot is being
@@ -87,7 +87,7 @@ __KERNEL_RCSID(0, "$NetBSD: dm_target_sn
 #include "dm.h"
 
 /* dm_target_snapshot.c */
-int dm_target_snapshot_init(dm_table_entry_t *, char *);
+int dm_target_snapshot_init(dm_table_entry_t *, int, char **);
 char *dm_target_snapshot_status(void *);
 int dm_target_snapshot_strategy(dm_table_entry_t *, struct buf *);
 int dm_target_snapshot_sync(dm_table_entry_t *);
@@ -96,7 +96,7 @@ int dm_target_snapshot_destroy(dm_table_
 int dm_target_snapshot_upcall(dm_table_entry_t *, struct buf *);
 
 /* dm snapshot origin driver */
-int dm_target_snapshot_orig_init(dm_table_entry_t *, char *);
+int dm_target_snapshot_orig_init(dm_table_entry_t *, int, char **);
 char *dm_target_snapshot_orig_status(void *);
 int dm_target_snapshot_orig_strategy(dm_table_entry_t *, struct buf *);
 int dm_target_snapshot_orig_sync(dm_table_entry_t *);
@@ -210,26 +210,13 @@ dm_target_snapshot_modcmd(modcmd_t cmd, 
  *        snapshot_origin device, cow device, persistent flag, chunk size
  */
 int
-dm_target_snapshot_init(dm_table_entry_t *table_en, char *params)
+dm_target_snapshot_init(dm_table_entry_t *table_en, int argc, char **argv)
 {
 	dm_target_snapshot_config_t *tsc;
 	dm_pdev_t *dmp_snap, *dmp_cow;
-	char **ap, *argv[5];
 
 	dmp_cow = NULL;
 
-	if (params == NULL)
-		return EINVAL;
-	/*
-	 * Parse a string, containing tokens delimited by white space,
-	 * into an argument vector
-	 */
-	for (ap = argv; ap < &argv[4] &&
-	    (*ap = strsep(&params, " \t")) != NULL;) {
-		if (**ap != '\0')
-			ap++;
-	}
-
 	printf("Snapshot target init function called!!\n");
 	printf("Snapshotted device: %s, cow device %s,\n\t persistent flag: %s, "
 	    "chunk size: %s\n", argv[0], argv[1], argv[2], argv[3]);
@@ -409,19 +396,16 @@ dm_target_snapshot_upcall(dm_table_entry
  * argv: /dev/mapper/my_data_real
  */
 int
-dm_target_snapshot_orig_init(dm_table_entry_t *table_en, char *params)
+dm_target_snapshot_orig_init(dm_table_entry_t *table_en, int argc, char **argv)
 {
 	dm_target_snapshot_origin_config_t *tsoc;
 	dm_pdev_t *dmp_real;
 
-	if (params == NULL)
-		return EINVAL;
-
 	printf("Snapshot origin target init function called!!\n");
-	printf("Parent device: %s\n", params);
+	printf("Parent device: %s\n", argv[0]);
 
 	/* Insert snap device to global pdev list */
-	if ((dmp_real = dm_pdev_insert(params)) == NULL)
+	if ((dmp_real = dm_pdev_insert(argv[0])) == NULL)
 		return ENOENT;
 
 	tsoc = kmem_alloc(sizeof(dm_target_snapshot_origin_config_t), KM_SLEEP);

Index: src/sys/dev/dm/dm_target_stripe.c
diff -u src/sys/dev/dm/dm_target_stripe.c:1.33 src/sys/dev/dm/dm_target_stripe.c:1.34
--- src/sys/dev/dm/dm_target_stripe.c:1.33	Mon Dec  9 15:30:42 2019
+++ src/sys/dev/dm/dm_target_stripe.c	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/*$NetBSD: dm_target_stripe.c,v 1.33 2019/12/09 15:30:42 tkusumi Exp $*/
+/*$NetBSD: dm_target_stripe.c,v 1.34 2019/12/12 16:28:24 tkusumi Exp $*/
 
 /*
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dm_target_stripe.c,v 1.33 2019/12/09 15:30:42 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dm_target_stripe.c,v 1.34 2019/12/12 16:28:24 tkusumi Exp $");
 
 /*
  * This file implements initial version of device-mapper stripe target.
@@ -48,7 +48,6 @@ typedef struct target_stripe_config {
 	struct target_linear_devs stripe_devs;
 	uint8_t stripe_num;
 	uint64_t stripe_chunksize;
-	size_t params_len;
 } dm_target_stripe_config_t;
 
 #ifdef DM_TARGET_MODULE
@@ -136,31 +135,20 @@ dm_target_stripe_fini(dm_target_stripe_c
  * 0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0
  */
 int
-dm_target_stripe_init(dm_table_entry_t *table_en, char *params)
+dm_target_stripe_init(dm_table_entry_t *table_en, int argc, char **argv)
 {
 	dm_target_linear_config_t *tlc;
 	dm_target_stripe_config_t *tsc;
-	size_t len;
-	char **ap, *argv[10];
 	int strpc, strpi;
 
-	if (params == NULL)
-		return EINVAL;
-
-	len = strlen(params) + 1;
-
 	/*
-	 * Parse a string, containing tokens delimited by white space,
-	 * into an argument vector
-	 */
-	for (ap = argv; ap <= &argv[9] &&
-	    (*ap = strsep(&params, " \t")) != NULL;) {
-		if (**ap != '\0')
-			ap++;
+	if (argc < 4) {
+		printf("Stripe target takes 4 or more args\n");
+		return EINVAL;
 	}
+	*/
 
 	printf("Stripe target init function called!!\n");
-
 	printf("Stripe target chunk size %s number of stripes %s\n",
 	    argv[1], argv[0]);
 
@@ -170,7 +158,6 @@ dm_target_stripe_init(dm_table_entry_t *
 	TAILQ_INIT(&tsc->stripe_devs);
 
 	/* Save length of param string */
-	tsc->params_len = len;
 	tsc->stripe_chunksize = atoi(argv[1]);
 	tsc->stripe_num = (uint8_t) atoi(argv[0]);
 

Index: src/sys/dev/dm/dm_target_zero.c
diff -u src/sys/dev/dm/dm_target_zero.c:1.20 src/sys/dev/dm/dm_target_zero.c:1.21
--- src/sys/dev/dm/dm_target_zero.c:1.20	Sun Dec  8 14:59:42 2019
+++ src/sys/dev/dm/dm_target_zero.c	Thu Dec 12 16:28:24 2019
@@ -1,4 +1,4 @@
-/*        $NetBSD: dm_target_zero.c,v 1.20 2019/12/08 14:59:42 tkusumi Exp $      */
+/*        $NetBSD: dm_target_zero.c,v 1.21 2019/12/12 16:28:24 tkusumi Exp $      */
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dm_target_zero.c,v 1.20 2019/12/08 14:59:42 tkusumi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dm_target_zero.c,v 1.21 2019/12/12 16:28:24 tkusumi Exp $");
 
 /*
  * This file implements initial version of device-mapper zero target.
@@ -42,7 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: dm_target_ze
 #include "dm.h"
 
 /* dm_target_zero.c */
-int dm_target_zero_init(dm_table_entry_t *, char *);
+int dm_target_zero_init(dm_table_entry_t *, int, char **);
 char *dm_target_zero_status(void *);
 int dm_target_zero_strategy(dm_table_entry_t *, struct buf *);
 int dm_target_zero_sync(dm_table_entry_t *);
@@ -114,7 +114,7 @@ dm_target_zero_modcmd(modcmd_t cmd, void
  * target specific config area.
  */
 int
-dm_target_zero_init(dm_table_entry_t *table_en, char *params)
+dm_target_zero_init(dm_table_entry_t *table_en, int argc, char **argv)
 {
 
 	printf("Zero target init function called!!\n");

Reply via email to