Add stubs for mirror target, too. This target does nothing for now, but lvm tools support mirror target and trying to create LV with mirrorred backend caused panic in dm_table_load_ioctl.diff -r1.5 -r1.6 src/sys/dev/dm/dm.h
(haad)
--- src/sys/dev/dm/dm.h 2009/01/02 00:42:31 1.5
+++ src/sys/dev/dm/dm.h 2009/01/02 11:03:24 1.6
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: dm.h,v 1.5 2009/01/02 00:42:31 haad Exp $ */ | 1 | /* $NetBSD: dm.h,v 1.6 2009/01/02 11:03:24 haad Exp $ */ | |
2 | 2 | |||
3 | /* | 3 | /* | |
4 | * Copyright (c) 2008 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2008 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Adam Hamsik. | 8 | * by Adam Hamsik. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | 13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
@@ -282,26 +282,34 @@ int dm_target_error_destroy(dm_table_ent | @@ -282,26 +282,34 @@ int dm_target_error_destroy(dm_table_ent | |||
282 | int dm_target_error_upcall(dm_table_entry_t *, struct buf *); | 282 | int dm_target_error_upcall(dm_table_entry_t *, struct buf *); | |
283 | 283 | |||
284 | /* dm_target_linear.c */ | 284 | /* dm_target_linear.c */ | |
285 | int dm_target_linear_init(dm_dev_t *, void**, char *); | 285 | int dm_target_linear_init(dm_dev_t *, void**, char *); | |
286 | char * dm_target_linear_status(void *); | 286 | char * dm_target_linear_status(void *); | |
287 | int dm_target_linear_strategy(dm_table_entry_t *, struct buf *); | 287 | int dm_target_linear_strategy(dm_table_entry_t *, struct buf *); | |
288 | int dm_target_linear_deps(dm_table_entry_t *, prop_array_t); | 288 | int dm_target_linear_deps(dm_table_entry_t *, prop_array_t); | |
289 | int dm_target_linear_destroy(dm_table_entry_t *); | 289 | int dm_target_linear_destroy(dm_table_entry_t *); | |
290 | int dm_target_linear_upcall(dm_table_entry_t *, struct buf *); | 290 | int dm_target_linear_upcall(dm_table_entry_t *, struct buf *); | |
291 | 291 | |||
292 | /* Generic function used to convert char to string */ | 292 | /* Generic function used to convert char to string */ | |
293 | uint64_t atoi(const char *); | 293 | uint64_t atoi(const char *); | |
294 | 294 | |||
295 | /* dm_target_mirror.c */ | |||
296 | int dm_target_mirror_init(dm_dev_t *, void**, char *); | |||
297 | char * dm_target_mirror_status(void *); | |||
298 | int dm_target_mirror_strategy(dm_table_entry_t *, struct buf *); | |||
299 | int dm_target_mirror_deps(dm_table_entry_t *, prop_array_t); | |||
300 | int dm_target_mirror_destroy(dm_table_entry_t *); | |||
301 | int dm_target_mirror_upcall(dm_table_entry_t *, struct buf *); | |||
302 | ||||
295 | /* dm_target_stripe.c */ | 303 | /* dm_target_stripe.c */ | |
296 | int dm_target_stripe_init(dm_dev_t *, void**, char *); | 304 | int dm_target_stripe_init(dm_dev_t *, void**, char *); | |
297 | char * dm_target_stripe_status(void *); | 305 | char * dm_target_stripe_status(void *); | |
298 | int dm_target_stripe_strategy(dm_table_entry_t *, struct buf *); | 306 | int dm_target_stripe_strategy(dm_table_entry_t *, struct buf *); | |
299 | int dm_target_stripe_deps(dm_table_entry_t *, prop_array_t); | 307 | int dm_target_stripe_deps(dm_table_entry_t *, prop_array_t); | |
300 | int dm_target_stripe_destroy(dm_table_entry_t *); | 308 | int dm_target_stripe_destroy(dm_table_entry_t *); | |
301 | int dm_target_stripe_upcall(dm_table_entry_t *, struct buf *); | 309 | int dm_target_stripe_upcall(dm_table_entry_t *, struct buf *); | |
302 | 310 | |||
303 | /* dm_target_snapshot.c */ | 311 | /* dm_target_snapshot.c */ | |
304 | int dm_target_snapshot_init(dm_dev_t *, void**, char *); | 312 | int dm_target_snapshot_init(dm_dev_t *, void**, char *); | |
305 | char * dm_target_snapshot_status(void *); | 313 | char * dm_target_snapshot_status(void *); | |
306 | int dm_target_snapshot_strategy(dm_table_entry_t *, struct buf *); | 314 | int dm_target_snapshot_strategy(dm_table_entry_t *, struct buf *); | |
307 | int dm_target_snapshot_deps(dm_table_entry_t *, prop_array_t); | 315 | int dm_target_snapshot_deps(dm_table_entry_t *, prop_array_t); |
--- src/sys/dev/dm/dm_target.c 2009/01/02 00:42:31 1.5
+++ src/sys/dev/dm/dm_target.c 2009/01/02 11:03:24 1.6
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: dm_target.c,v 1.5 2009/01/02 00:42:31 haad Exp $ */ | 1 | /* $NetBSD: dm_target.c,v 1.6 2009/01/02 11:03:24 haad Exp $ */ | |
2 | 2 | |||
3 | /* | 3 | /* | |
4 | * Copyright (c) 2008 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2008 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Adam Hamsik. | 8 | * by Adam Hamsik. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code Must retain the above copyright | 13 | * 1. Redistributions of source code Must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
@@ -234,36 +234,35 @@ dm_target_prop_list(void) | @@ -234,36 +234,35 @@ dm_target_prop_list(void) | |||
234 | prop_object_release(ver); | 234 | prop_object_release(ver); | |
235 | prop_object_release(target_dict); | 235 | prop_object_release(target_dict); | |
236 | } | 236 | } | |
237 | 237 | |||
238 | mutex_exit(&dm_target_mutex); | 238 | mutex_exit(&dm_target_mutex); | |
239 | 239 | |||
240 | return target_array; | 240 | return target_array; | |
241 | } | 241 | } | |
242 | 242 | |||
243 | /* Initialize dm_target subsystem. */ | 243 | /* Initialize dm_target subsystem. */ | |
244 | int | 244 | int | |
245 | dm_target_init(void) | 245 | dm_target_init(void) | |
246 | { | 246 | { | |
247 | dm_target_t *dmt,*dmt3,*dmt4; | 247 | dm_target_t *dmt,*dmt3; | |
248 | int r; | 248 | int r; | |
249 | 249 | |||
250 | r = 0; | 250 | r = 0; | |
251 | 251 | |||
252 | mutex_init(&dm_target_mutex, MUTEX_DEFAULT, IPL_NONE); | 252 | mutex_init(&dm_target_mutex, MUTEX_DEFAULT, IPL_NONE); | |
253 | 253 | |||
254 | dmt = dm_target_alloc("linear"); | 254 | dmt = dm_target_alloc("linear"); | |
255 | dmt3 = dm_target_alloc("striped"); | 255 | dmt3 = dm_target_alloc("striped"); | |
256 | dmt4 = dm_target_alloc("mirror"); | |||
257 | 256 | |||
258 | dmt->version[0] = 1; | 257 | dmt->version[0] = 1; | |
259 | dmt->version[1] = 0; | 258 | dmt->version[1] = 0; | |
260 | dmt->version[2] = 2; | 259 | dmt->version[2] = 2; | |
261 | strlcpy(dmt->name, "linear", DM_MAX_TYPE_NAME); | 260 | strlcpy(dmt->name, "linear", DM_MAX_TYPE_NAME); | |
262 | dmt->init = &dm_target_linear_init; | 261 | dmt->init = &dm_target_linear_init; | |
263 | dmt->status = &dm_target_linear_status; | 262 | dmt->status = &dm_target_linear_status; | |
264 | dmt->strategy = &dm_target_linear_strategy; | 263 | dmt->strategy = &dm_target_linear_strategy; | |
265 | dmt->deps = &dm_target_linear_deps; | 264 | dmt->deps = &dm_target_linear_deps; | |
266 | dmt->destroy = &dm_target_linear_destroy; | 265 | dmt->destroy = &dm_target_linear_destroy; | |
267 | dmt->upcall = &dm_target_linear_upcall; | 266 | dmt->upcall = &dm_target_linear_upcall; | |
268 | 267 | |||
269 | r = dm_target_insert(dmt); | 268 | r = dm_target_insert(dmt); | |
@@ -271,54 +270,43 @@ dm_target_init(void) | @@ -271,54 +270,43 @@ dm_target_init(void) | |||
271 | dmt3->version[0] = 1; | 270 | dmt3->version[0] = 1; | |
272 | dmt3->version[1] = 0; | 271 | dmt3->version[1] = 0; | |
273 | dmt3->version[2] = 3; | 272 | dmt3->version[2] = 3; | |
274 | strlcpy(dmt3->name, "striped", DM_MAX_TYPE_NAME); | 273 | strlcpy(dmt3->name, "striped", DM_MAX_TYPE_NAME); | |
275 | dmt3->init = &dm_target_stripe_init; | 274 | dmt3->init = &dm_target_stripe_init; | |
276 | dmt3->status = &dm_target_stripe_status; | 275 | dmt3->status = &dm_target_stripe_status; | |
277 | dmt3->strategy = &dm_target_stripe_strategy; | 276 | dmt3->strategy = &dm_target_stripe_strategy; | |
278 | dmt3->deps = &dm_target_stripe_deps; | 277 | dmt3->deps = &dm_target_stripe_deps; | |
279 | dmt3->destroy = &dm_target_stripe_destroy; | 278 | dmt3->destroy = &dm_target_stripe_destroy; | |
280 | dmt3->upcall = &dm_target_stripe_upcall; | 279 | dmt3->upcall = &dm_target_stripe_upcall; | |
281 | 280 | |||
282 | r = dm_target_insert(dmt3); | 281 | r = dm_target_insert(dmt3); | |
283 | 282 | |||
284 | dmt4->version[0] = 1; | 283 | #ifdef notyet | |
285 | dmt4->version[1] = 0; | 284 | dmt5->version[0] = 1; | |
286 | dmt4->version[2] = 3; | |||
287 | strlcpy(dmt4->name, "mirror", DM_MAX_TYPE_NAME); | |||
288 | dmt4->init = NULL; | |||
289 | dmt4->status = NULL; | |||
290 | dmt4->strategy = NULL; | |||
291 | dmt4->deps = NULL; | |||
292 | dmt4->destroy = NULL; | |||
293 | dmt4->upcall = NULL; | |||
294 | ||||
295 | r = dm_target_insert(dmt4); | |||
296 | ||||
297 | /* dmt5->version[0] = 1; | |||
298 | dmt5->version[1] = 0; | 285 | dmt5->version[1] = 0; | |
299 | dmt5->version[2] = 5; | 286 | dmt5->version[2] = 5; | |
300 | strlcpy(dmt5->name, "snapshot", DM_MAX_TYPE_NAME); | 287 | strlcpy(dmt5->name, "snapshot", DM_MAX_TYPE_NAME); | |
301 | dmt5->init = &dm_target_snapshot_init; | 288 | dmt5->init = &dm_target_snapshot_init; | |
302 | dmt5->status = &dm_target_snapshot_status; | 289 | dmt5->status = &dm_target_snapshot_status; | |
303 | dmt5->strategy = &dm_target_snapshot_strategy; | 290 | dmt5->strategy = &dm_target_snapshot_strategy; | |
304 | dmt5->deps = &dm_target_snapshot_deps; | 291 | dmt5->deps = &dm_target_snapshot_deps; | |
305 | dmt5->destroy = &dm_target_snapshot_destroy; | 292 | dmt5->destroy = &dm_target_snapshot_destroy; | |
306 | dmt5->upcall = &dm_target_snapshot_upcall; | 293 | dmt5->upcall = &dm_target_snapshot_upcall; | |
307 | 294 | |||
308 | r = dm_target_insert(dmt5); | 295 | r = dm_target_insert(dmt5); | |
309 | 296 | |||
310 | dmt6->version[0] = 1; | 297 | dmt6->version[0] = 1; | |
311 | dmt6->version[1] = 0; | 298 | dmt6->version[1] = 0; | |
312 | dmt6->version[2] = 5; | 299 | dmt6->version[2] = 5; | |
313 | strlcpy(dmt6->name, "snapshot-origin", DM_MAX_TYPE_NAME); | 300 | strlcpy(dmt6->name, "snapshot-origin", DM_MAX_TYPE_NAME); | |
314 | dmt6->init = &dm_target_snapshot_orig_init; | 301 | dmt6->init = &dm_target_snapshot_orig_init; | |
315 | dmt6->status = &dm_target_snapshot_orig_status; | 302 | dmt6->status = &dm_target_snapshot_orig_status; | |
316 | dmt6->strategy = &dm_target_snapshot_orig_strategy; | 303 | dmt6->strategy = &dm_target_snapshot_orig_strategy; | |
317 | dmt6->deps = &dm_target_snapshot_orig_deps; | 304 | dmt6->deps = &dm_target_snapshot_orig_deps; | |
318 | dmt6->destroy = &dm_target_snapshot_orig_destroy; | 305 | dmt6->destroy = &dm_target_snapshot_orig_destroy; | |
319 | dmt6->upcall = &dm_target_snapshot_orig_upcall; | 306 | dmt6->upcall = &dm_target_snapshot_orig_upcall; | |
320 | 307 | |||
321 | r = dm_target_insert(dmt6);*/ | 308 | r = dm_target_insert(dmt6); | |
309 | #endif | |||
322 | 310 | |||
323 | return r; | 311 | return r; | |
324 | } | 312 | } |
/*$NetBSD: dm_target_mirror.c,v 1.1 2009/01/02 11:03:24 haad Exp $*/
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Adam Hamsik.
*
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*
* This file implements initial version of device-mapper mirror target.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/buf.h>
#include "dm.h"
#ifdef DM_TARGET_MODULE
/*
* Every target can be compiled directly to dm driver or as a
* separate module this part of target is used for loading targets
* to dm driver.
* Target can be unloaded from kernel only if there are no users of
* it e.g. there are no devices which uses that target.
*/
#include <sys/kernel.h>
#include <sys/module.h>
MODULE(MODULE_CLASS_MISC, dm_target_mirror, NULL);
static int
dm_target_mirror_modcmd(modcmd_t cmd, void *arg)
{
dm_target_t *dmt;
int r;
dmt = NULL;
switch (cmd) {
case MODULE_CMD_INIT:
if ((r = module_hold("dm")) != 0)
return r;
if ((dmt = dm_target_lookup("mirror")) != NULL)
return EEXIST;
dmt = dm_target_alloc("mirror");
dmt->version[0] = 1;
dmt->version[1] = 0;
dmt->version[2] = 0;
strlcpy(dmt->name, "mirror", DM_MAX_TYPE_NAME);
dmt->init = &dm_target_mirror_init;
dmt->status = &dm_target_mirror_status;
dmt->strategy = &dm_target_mirror_strategy;
dmt->deps = &dm_target_mirror_deps;
dmt->destroy = &dm_target_mirror_destroy;
dmt->upcall = &dm_target_mirror_upcall;
r = dm_target_insert(dmt);
break;
case MODULE_CMD_FINI:
r = dm_target_rem("mirror");
module_rele("dm"); /* release usage counter on dm module */
break;
case MODULE_CMD_STAT:
return ENOTTY;
default:
return ENOTTY;
}
return r;
}
#endif
/* Init function called from dm_table_load_ioctl. */
int
dm_target_mirror_init(dm_dev_t *dmv, void **target_config, char *argv)
{
printf("Mirror target init function called!!\n");
*target_config = NULL;
dmv->dev_type = DM_MIRROR_DEV;
return 0;
}
/* Status routine called to get params string. */
char *
dm_target_mirror_status(void *target_config)
{
return NULL;
}
/* Strategy routine called from dm_strategy. */
int
dm_target_mirror_strategy(dm_table_entry_t *table_en, struct buf *bp)
{
printf("Mirror target read function called!!\n");
bp->b_error = EIO;
bp->b_resid = 0;
biodone(bp);
return 0;
}
/* Doesn't do anything here. */
int
dm_target_mirror_destroy(dm_table_entry_t *table_en)
{
table_en->target_config = NULL;
/* Unbusy target so we can unload it */
dm_target_unbusy(table_en->target);
return 0;
}
/* Doesn't not need to do anything here. */
int
dm_target_mirror_deps(dm_table_entry_t *table_en, prop_array_t prop_array)
{
return 0;
}
/* Unsupported for this target. */
int
dm_target_mirror_upcall(dm_table_entry_t *table_en, struct buf *bp)
{
return 0;
}
--- src/sys/dev/dm/files.dm 2009/01/02 00:42:31 1.3
+++ src/sys/dev/dm/files.dm 2009/01/02 11:03:24 1.4
@@ -1,12 +1,13 @@ | @@ -1,12 +1,13 @@ | |||
1 | defpseudo dm | 1 | defpseudo dm | |
2 | file dev/dm/device-mapper.c dm | 2 | file dev/dm/device-mapper.c dm | |
3 | file dev/dm/dm_dev.c dm | 3 | file dev/dm/dm_dev.c dm | |
4 | file dev/dm/dm_ioctl.c dm | 4 | file dev/dm/dm_ioctl.c dm | |
5 | file dev/dm/dm_pdev.c dm | 5 | file dev/dm/dm_pdev.c dm | |
6 | file dev/dm/dm_table.c dm | 6 | file dev/dm/dm_table.c dm | |
7 | file dev/dm/dm_target.c dm | 7 | file dev/dm/dm_target.c dm | |
8 | file dev/dm/dm_target_error.c dm | 8 | file dev/dm/dm_target_error.c dm | |
9 | file dev/dm/dm_target_linear.c dm | 9 | file dev/dm/dm_target_linear.c dm | |
10 | file dev/dm/dm_target_mirror.c dm | |||
10 | file dev/dm/dm_target_zero.c dm | 11 | file dev/dm/dm_target_zero.c dm | |
11 | file dev/dm/dm_target_snapshot.c dm | 12 | file dev/dm/dm_target_snapshot.c dm | |
12 | file dev/dm/dm_target_stripe.c dm | 13 | file dev/dm/dm_target_stripe.c dm |
--- src/sys/modules/dm/Makefile 2009/01/02 01:06:16 1.3
+++ src/sys/modules/dm/Makefile 2009/01/02 11:03:24 1.4
@@ -1,21 +1,22 @@ | @@ -1,21 +1,22 @@ | |||
1 | $NetBSD: Makefile,v 1.3 2009/01/02 01:06:16 haad Exp $ | 1 | $NetBSD: Makefile,v 1.4 2009/01/02 11:03:24 haad Exp $ | |
2 | 2 | |||
3 | .include "../Makefile.inc" | 3 | .include "../Makefile.inc" | |
4 | 4 | |||
5 | .PATH: ${S}/dev/dm | 5 | .PATH: ${S}/dev/dm | |
6 | 6 | |||
7 | KMOD= dm | 7 | KMOD= dm | |
8 | SRCS= device-mapper.c dm_dev.c dm_ioctl.c dm_pdev.c dm_table.c dm_target.c \ | 8 | SRCS= device-mapper.c dm_dev.c dm_ioctl.c dm_pdev.c dm_table.c dm_target.c \ | |
9 | dm_target_linear.c dm_target_stripe.c | 9 | dm_target_linear.c dm_target_stripe.c | |
10 | 10 | |||
11 | # Do not build unneeded modules now. | 11 | # Do not build unneeded modules now. | |
12 | MK_DM_TARGETS= no | 12 | MK_DM_TARGETS= no | |
13 | 13 | |||
14 | .if (${MK_DM_TARGETS} != "no") | 14 | .if (${MK_DM_TARGETS} != "no") | |
15 | SUBDIR+= dm_target_error | 15 | SUBDIR+= dm_target_error | |
16 | SUBDIR+= dm_target_zero | 16 | SUBDIR+= dm_target_mirror | |
17 | SUBDIR+= dm_target_snapshot | 17 | SUBDIR+= dm_target_snapshot | |
18 | SUBDIR+= dm_target_zero | |||
18 | .endif | 19 | .endif | |
19 | 20 | |||
20 | .include <bsd.kmodule.mk> | 21 | .include <bsd.kmodule.mk> | |
21 | .include <bsd.subdir.mk> | 22 | .include <bsd.subdir.mk> |
#$NetBSD: Makefile,v 1.1 2009/01/02 11:03:24 haad Exp $
.include "../../Makefile.inc"
S!= cd ${.CURDIR}/../../..;pwd
.PATH: ${S}/dev/dm
CFLAGS += -DDM_TARGET_MODULE
KMOD= dm_target_mirror
SRCS= dm_target_mirror.c
.include <bsd.kmodule.mk>