From b4e97860a3474764daa3f436549fce625eaae357 Mon Sep 17 00:00:00 2001 From: Tomohiro Kusumi Date: Mon, 9 Nov 2015 19:54:55 +0900 Subject: [PATCH] sys/dev/disk/dm: Check if target has registered handlers Define which handlers are mandatory or optional. init(), destroy(), strategy() are (or should be) mandatory. Others aren't needed by all targets hence should be optional. Add sanity checks in dm_target_insert() to make sure targets have implemented and registered mandatory handlers. Cleanup struct dm_target by removing obvious comments and adding comments on mandatory/optional handlers. --- sys/dev/disk/dm/dm.h | 21 ++++++++----------- sys/dev/disk/dm/dm_target.c | 13 ++++++++++++ sys/dev/disk/dm/dm_target_error.c | 2 +- sys/dev/disk/dm/dm_target_zero.c | 2 +- .../disk/dm/targets/crypt/dm_target_crypt.c | 4 ++-- .../disk/dm/targets/delay/dm_target_delay.c | 6 +++--- .../disk/dm/targets/linear/dm_target_linear.c | 4 ++-- .../dm/targets/striped/dm_target_striped.c | 6 +++--- 8 files changed, 34 insertions(+), 24 deletions(-) diff --git a/sys/dev/disk/dm/dm.h b/sys/dev/disk/dm/dm.h index d4e355c1d2..8e0e64f724 100644 --- a/sys/dev/disk/dm/dm.h +++ b/sys/dev/disk/dm/dm.h @@ -174,24 +174,21 @@ typedef struct dm_dev { /* constant dm_target structures for error, zero, linear, stripes etc. */ typedef struct dm_target { char name[DM_MAX_TYPE_NAME]; - /* Initialize target_config area */ - int (*init)(dm_table_entry_t *, int, char **); - - /* Message interface */ - int (*message)(dm_table_entry_t *, char *); - /* Destroy target_config area */ + /* + * Mandatory handlers + */ + int (*init)(dm_table_entry_t *, int, char **); int (*destroy)(dm_table_entry_t *); + int (*strategy)(dm_table_entry_t *, struct buf *); /* - * Info and table are called to get params string, which is target - * specific. When dm_table_status_ioctl is called with flag - * DM_STATUS_TABLE_FLAG I have to sent params string back. + * Optional handlers */ - char *(*info)(void *); - char *(*table)(void *); - int (*strategy)(dm_table_entry_t *, struct buf *); + char *(*table)(void *); /* DM_STATUS_TABLE_FLAG */ + char *(*info)(void *); /* !DM_STATUS_TABLE_FLAG */ int (*dump)(dm_table_entry_t *, void *data, size_t length, off_t offset); + int (*message)(dm_table_entry_t *, char *); uint32_t version[3]; int ref_cnt; diff --git a/sys/dev/disk/dm/dm_target.c b/sys/dev/disk/dm/dm_target.c index d2f07a264e..c3f0faf16f 100644 --- a/sys/dev/disk/dm/dm_target.c +++ b/sys/dev/disk/dm/dm_target.c @@ -142,6 +142,19 @@ dm_target_insert(dm_target_t *dm_target) { dm_target_t *dmt; + if (dm_target->init == NULL) { + kprintf("dm: %s missing init\n", dm_target->name); + return EINVAL; + } + if (dm_target->destroy == NULL) { + kprintf("dm: %s missing destroy\n", dm_target->name); + return EINVAL; + } + if (dm_target->strategy == NULL) { + kprintf("dm: %s missing strategy\n", dm_target->name); + return EINVAL; + } + lockmgr(&dm_target_mutex, LK_EXCLUSIVE); dmt = dm_target_lookup_name(dm_target->name); diff --git a/sys/dev/disk/dm/dm_target_error.c b/sys/dev/disk/dm/dm_target_error.c index af8e0cd46f..1482a6de25 100644 --- a/sys/dev/disk/dm/dm_target_error.c +++ b/sys/dev/disk/dm/dm_target_error.c @@ -92,8 +92,8 @@ dmte_mod_handler(module_t mod, int type, void *unused) dmt->version[2] = 0; strlcpy(dmt->name, "error", DM_MAX_TYPE_NAME); dmt->init = &dm_target_error_init; - dmt->strategy = &dm_target_error_strategy; dmt->destroy = &dm_target_error_destroy; + dmt->strategy = &dm_target_error_strategy; err = dm_target_insert(dmt); if (err == 0) diff --git a/sys/dev/disk/dm/dm_target_zero.c b/sys/dev/disk/dm/dm_target_zero.c index f5eeaf3a4d..e5b4e56cff 100644 --- a/sys/dev/disk/dm/dm_target_zero.c +++ b/sys/dev/disk/dm/dm_target_zero.c @@ -97,8 +97,8 @@ dmtz_mod_handler(module_t mod, int type, void *unused) dmt->version[2] = 0; strlcpy(dmt->name, "zero", DM_MAX_TYPE_NAME); dmt->init = &dm_target_zero_init; - dmt->strategy = &dm_target_zero_strategy; dmt->destroy = &dm_target_zero_destroy; + dmt->strategy = &dm_target_zero_strategy; err = dm_target_insert(dmt); if (err == 0) diff --git a/sys/dev/disk/dm/targets/crypt/dm_target_crypt.c b/sys/dev/disk/dm/targets/crypt/dm_target_crypt.c index dee17c6d9d..a402a70e70 100644 --- a/sys/dev/disk/dm/targets/crypt/dm_target_crypt.c +++ b/sys/dev/disk/dm/targets/crypt/dm_target_crypt.c @@ -1430,9 +1430,9 @@ dmtc_mod_handler(module_t mod, int type, void *unused) dmt->version[2] = 0; strlcpy(dmt->name, "crypt", DM_MAX_TYPE_NAME); dmt->init = &dm_target_crypt_init; - dmt->table = &dm_target_crypt_table; - dmt->strategy = &dm_target_crypt_strategy; dmt->destroy = &dm_target_crypt_destroy; + dmt->strategy = &dm_target_crypt_strategy; + dmt->table = &dm_target_crypt_table; dmt->dump = &dm_target_crypt_dump; err = dm_target_insert(dmt); diff --git a/sys/dev/disk/dm/targets/delay/dm_target_delay.c b/sys/dev/disk/dm/targets/delay/dm_target_delay.c index a54ff57d0e..35ffc903cd 100644 --- a/sys/dev/disk/dm/targets/delay/dm_target_delay.c +++ b/sys/dev/disk/dm/targets/delay/dm_target_delay.c @@ -426,10 +426,10 @@ dmtd_mod_handler(module_t mod, int type, void *unused) dmt->version[2] = 0; strlcpy(dmt->name, "delay", DM_MAX_TYPE_NAME); dmt->init = &dm_target_delay_init; - dmt->info = &dm_target_delay_info; - dmt->table = &dm_target_delay_table; - dmt->strategy = &dm_target_delay_strategy; dmt->destroy = &dm_target_delay_destroy; + dmt->strategy = &dm_target_delay_strategy; + dmt->table = &dm_target_delay_table; + dmt->info = &dm_target_delay_info; _objcache_create(); err = dm_target_insert(dmt); diff --git a/sys/dev/disk/dm/targets/linear/dm_target_linear.c b/sys/dev/disk/dm/targets/linear/dm_target_linear.c index fae7e015e2..f0d72e1560 100644 --- a/sys/dev/disk/dm/targets/linear/dm_target_linear.c +++ b/sys/dev/disk/dm/targets/linear/dm_target_linear.c @@ -191,9 +191,9 @@ dmtl_mod_handler(module_t mod, int type, void *unused) dmt->version[2] = 2; strlcpy(dmt->name, "linear", DM_MAX_TYPE_NAME); dmt->init = &dm_target_linear_init; - dmt->table = &dm_target_linear_table; - dmt->strategy = &dm_target_linear_strategy; dmt->destroy = &dm_target_linear_destroy; + dmt->strategy = &dm_target_linear_strategy; + dmt->table = &dm_target_linear_table; dmt->dump = &dm_target_linear_dump; err = dm_target_insert(dmt); diff --git a/sys/dev/disk/dm/targets/striped/dm_target_striped.c b/sys/dev/disk/dm/targets/striped/dm_target_striped.c index 047bfa7ba7..e9d9990181 100644 --- a/sys/dev/disk/dm/targets/striped/dm_target_striped.c +++ b/sys/dev/disk/dm/targets/striped/dm_target_striped.c @@ -497,10 +497,10 @@ dmts_mod_handler(module_t mod, int type, void *unused) dmt->version[2] = 3; strlcpy(dmt->name, "striped", DM_MAX_TYPE_NAME); dmt->init = &dm_target_stripe_init; - dmt->info = &dm_target_stripe_info; - dmt->table = &dm_target_stripe_table; - dmt->strategy = &dm_target_stripe_strategy; dmt->destroy = &dm_target_stripe_destroy; + dmt->strategy = &dm_target_stripe_strategy; + dmt->table = &dm_target_stripe_table; + dmt->info = &dm_target_stripe_info; dmt->dump = &dm_target_stripe_dump; dmt->max_argc = 2 + (MAX_STRIPES * 2); -- 2.41.0