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(¶ms, " \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(¶ms, " \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(¶ms, " \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(¶ms, " \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");