Fri Jan 2 11:03:25 2009 UTC ()
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.


(haad)
diff -r1.5 -r1.6 src/sys/dev/dm/dm.h
diff -r1.5 -r1.6 src/sys/dev/dm/dm_target.c
diff -r0 -r1.1 src/sys/dev/dm/dm_target_mirror.c
diff -r1.3 -r1.4 src/sys/dev/dm/files.dm
diff -r1.3 -r1.4 src/sys/modules/dm/Makefile
diff -r0 -r1.1 src/sys/modules/dm/dm_target_mirror/Makefile

cvs diff -r1.5 -r1.6 src/sys/dev/dm/dm.h (expand / switch to unified diff)

--- 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
282int dm_target_error_upcall(dm_table_entry_t *, struct buf *); 282int dm_target_error_upcall(dm_table_entry_t *, struct buf *);
283 283
284/* dm_target_linear.c */ 284/* dm_target_linear.c */
285int dm_target_linear_init(dm_dev_t *, void**, char *); 285int dm_target_linear_init(dm_dev_t *, void**, char *);
286char * dm_target_linear_status(void *); 286char * dm_target_linear_status(void *);
287int dm_target_linear_strategy(dm_table_entry_t *, struct buf *); 287int dm_target_linear_strategy(dm_table_entry_t *, struct buf *);
288int dm_target_linear_deps(dm_table_entry_t *, prop_array_t); 288int dm_target_linear_deps(dm_table_entry_t *, prop_array_t);
289int dm_target_linear_destroy(dm_table_entry_t *); 289int dm_target_linear_destroy(dm_table_entry_t *);
290int dm_target_linear_upcall(dm_table_entry_t *, struct buf *); 290int 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 */
293uint64_t atoi(const char *);  293uint64_t atoi(const char *);
294 294
 295/* dm_target_mirror.c */
 296int dm_target_mirror_init(dm_dev_t *, void**, char *);
 297char * dm_target_mirror_status(void *);
 298int dm_target_mirror_strategy(dm_table_entry_t *, struct buf *);
 299int dm_target_mirror_deps(dm_table_entry_t *, prop_array_t);
 300int dm_target_mirror_destroy(dm_table_entry_t *);
 301int dm_target_mirror_upcall(dm_table_entry_t *, struct buf *);
 302
295/* dm_target_stripe.c */ 303/* dm_target_stripe.c */
296int dm_target_stripe_init(dm_dev_t *, void**, char *); 304int dm_target_stripe_init(dm_dev_t *, void**, char *);
297char * dm_target_stripe_status(void *); 305char * dm_target_stripe_status(void *);
298int dm_target_stripe_strategy(dm_table_entry_t *, struct buf *); 306int dm_target_stripe_strategy(dm_table_entry_t *, struct buf *);
299int dm_target_stripe_deps(dm_table_entry_t *, prop_array_t); 307int dm_target_stripe_deps(dm_table_entry_t *, prop_array_t);
300int dm_target_stripe_destroy(dm_table_entry_t *); 308int dm_target_stripe_destroy(dm_table_entry_t *);
301int dm_target_stripe_upcall(dm_table_entry_t *, struct buf *); 309int dm_target_stripe_upcall(dm_table_entry_t *, struct buf *);
302 310
303/* dm_target_snapshot.c */ 311/* dm_target_snapshot.c */
304int dm_target_snapshot_init(dm_dev_t *, void**, char *); 312int dm_target_snapshot_init(dm_dev_t *, void**, char *);
305char * dm_target_snapshot_status(void *); 313char * dm_target_snapshot_status(void *);
306int dm_target_snapshot_strategy(dm_table_entry_t *, struct buf *); 314int dm_target_snapshot_strategy(dm_table_entry_t *, struct buf *);
307int dm_target_snapshot_deps(dm_table_entry_t *, prop_array_t); 315int dm_target_snapshot_deps(dm_table_entry_t *, prop_array_t);

cvs diff -r1.5 -r1.6 src/sys/dev/dm/dm_target.c (expand / switch to unified diff)

--- 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. */
244int 244int
245dm_target_init(void) 245dm_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}

File Added: src/sys/dev/dm/dm_target_mirror.c
/*$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;
}

cvs diff -r1.3 -r1.4 src/sys/dev/dm/files.dm (expand / switch to unified diff)

--- 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 @@
1defpseudo dm 1defpseudo dm
2file dev/dm/device-mapper.c dm 2file dev/dm/device-mapper.c dm
3file dev/dm/dm_dev.c dm 3file dev/dm/dm_dev.c dm
4file dev/dm/dm_ioctl.c dm 4file dev/dm/dm_ioctl.c dm
5file dev/dm/dm_pdev.c dm 5file dev/dm/dm_pdev.c dm
6file dev/dm/dm_table.c dm 6file dev/dm/dm_table.c dm
7file dev/dm/dm_target.c dm 7file dev/dm/dm_target.c dm
8file dev/dm/dm_target_error.c dm 8file dev/dm/dm_target_error.c dm
9file dev/dm/dm_target_linear.c dm 9file dev/dm/dm_target_linear.c dm
 10file dev/dm/dm_target_mirror.c dm
10file dev/dm/dm_target_zero.c dm 11file dev/dm/dm_target_zero.c dm
11file dev/dm/dm_target_snapshot.c dm 12file dev/dm/dm_target_snapshot.c dm
12file dev/dm/dm_target_stripe.c dm 13file dev/dm/dm_target_stripe.c dm

cvs diff -r1.3 -r1.4 src/sys/modules/dm/Makefile (expand / switch to unified diff)

--- 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
7KMOD= dm 7KMOD= dm
8SRCS= device-mapper.c dm_dev.c dm_ioctl.c dm_pdev.c dm_table.c dm_target.c \ 8SRCS= 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.
12MK_DM_TARGETS= no 12MK_DM_TARGETS= no
13 13
14.if (${MK_DM_TARGETS} != "no") 14.if (${MK_DM_TARGETS} != "no")
15SUBDIR+= dm_target_error 15SUBDIR+= dm_target_error
16SUBDIR+= dm_target_zero 16SUBDIR+= dm_target_mirror
17SUBDIR+= dm_target_snapshot 17SUBDIR+= dm_target_snapshot
 18SUBDIR+= 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>

File Added: src/sys/modules/dm/dm_target_mirror/Makefile
#$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>