xref: /netbsd-src/sys/dev/dm/dm_target_error.c (revision 67de4a93951d77f8c21645cee93f635e7a3ad135)
1*67de4a93Stkusumi /*        $NetBSD: dm_target_error.c,v 1.29 2020/01/21 16:27:53 tkusumi Exp $      */
2c9d0c62aShaad 
3c9d0c62aShaad /*
4c9d0c62aShaad  * Copyright (c) 2008 The NetBSD Foundation, Inc.
5c9d0c62aShaad  * All rights reserved.
6c9d0c62aShaad  *
7c9d0c62aShaad  * This code is derived from software contributed to The NetBSD Foundation
8c9d0c62aShaad  * by Adam Hamsik.
9c9d0c62aShaad  *
10c9d0c62aShaad  * Redistribution and use in source and binary forms, with or without
11c9d0c62aShaad  * modification, are permitted provided that the following conditions
12c9d0c62aShaad  * are met:
13c9d0c62aShaad  * 1. Redistributions of source code must retain the above copyright
14c9d0c62aShaad  *    notice, this list of conditions and the following disclaimer.
15c9d0c62aShaad  * 2. Redistributions in binary form must reproduce the above copyright
16c9d0c62aShaad  *    notice, this list of conditions and the following disclaimer in the
17c9d0c62aShaad  *    documentation and/or other materials provided with the distribution.
18c9d0c62aShaad  *
19c9d0c62aShaad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20c9d0c62aShaad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21c9d0c62aShaad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22c9d0c62aShaad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23c9d0c62aShaad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24c9d0c62aShaad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25c9d0c62aShaad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26c9d0c62aShaad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27c9d0c62aShaad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28c9d0c62aShaad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29c9d0c62aShaad  * POSSIBILITY OF SUCH DAMAGE.
30c9d0c62aShaad  */
31249cf593Schristos #include <sys/cdefs.h>
32*67de4a93Stkusumi __KERNEL_RCSID(0, "$NetBSD: dm_target_error.c,v 1.29 2020/01/21 16:27:53 tkusumi Exp $");
33c9d0c62aShaad 
34c9d0c62aShaad /*
35c9d0c62aShaad  * This file implements initial version of device-mapper error target.
36c9d0c62aShaad  */
37c9d0c62aShaad #include <sys/types.h>
38c9d0c62aShaad #include <sys/param.h>
39c9d0c62aShaad #include <sys/buf.h>
40c9d0c62aShaad 
41c9d0c62aShaad #include "dm.h"
42c9d0c62aShaad 
43cca8fb31Shaad #ifdef DM_TARGET_MODULE
44cca8fb31Shaad /*
45cca8fb31Shaad  * Every target can be compiled directly to dm driver or as a
46cca8fb31Shaad  * separate module this part of target is used for loading targets
47cca8fb31Shaad  * to dm driver.
48cca8fb31Shaad  * Target can be unloaded from kernel only if there are no users of
49cca8fb31Shaad  * it e.g. there are no devices which uses that target.
50cca8fb31Shaad  */
51cca8fb31Shaad #include <sys/kernel.h>
52cca8fb31Shaad #include <sys/module.h>
53cca8fb31Shaad 
542df04240Shaad MODULE(MODULE_CLASS_MISC, dm_target_error, "dm");
55cca8fb31Shaad 
56cca8fb31Shaad static int
dm_target_error_modcmd(modcmd_t cmd,void * arg)57cca8fb31Shaad dm_target_error_modcmd(modcmd_t cmd, void *arg)
58cca8fb31Shaad {
59cca8fb31Shaad 	dm_target_t *dmt;
60cca8fb31Shaad 	int r;
61cca8fb31Shaad 
62cca8fb31Shaad 	switch (cmd) {
63cca8fb31Shaad 	case MODULE_CMD_INIT:
6417599f37Shaad 		if ((dmt = dm_target_lookup("error")) != NULL) {
6517599f37Shaad 			dm_target_unbusy(dmt);
66cca8fb31Shaad 			return EEXIST;
6717599f37Shaad 		}
68cca8fb31Shaad 		dmt = dm_target_alloc("error");
69cca8fb31Shaad 
70cca8fb31Shaad 		dmt->version[0] = 1;
71cca8fb31Shaad 		dmt->version[1] = 0;
72cca8fb31Shaad 		dmt->version[2] = 0;
73cca8fb31Shaad 		dmt->init = &dm_target_error_init;
74cca8fb31Shaad 		dmt->strategy = &dm_target_error_strategy;
75cca8fb31Shaad 		dmt->destroy = &dm_target_error_destroy;
76*67de4a93Stkusumi 		//dmt->upcall = &dm_target_error_upcall;
77cca8fb31Shaad 
78cca8fb31Shaad 		r = dm_target_insert(dmt);
79cca8fb31Shaad 
80cca8fb31Shaad 		break;
81cca8fb31Shaad 
82cca8fb31Shaad 	case MODULE_CMD_FINI:
83cca8fb31Shaad 		r = dm_target_rem("error");
84cca8fb31Shaad 		break;
85cca8fb31Shaad 
86cca8fb31Shaad 	case MODULE_CMD_STAT:
87cca8fb31Shaad 		return ENOTTY;
88cca8fb31Shaad 
89cca8fb31Shaad 	default:
90cca8fb31Shaad 		return ENOTTY;
91cca8fb31Shaad 	}
92cca8fb31Shaad 
93cca8fb31Shaad 	return r;
94cca8fb31Shaad }
95cca8fb31Shaad #endif
96cca8fb31Shaad 
97c9d0c62aShaad /* Init function called from dm_table_load_ioctl. */
98c9d0c62aShaad int
dm_target_error_init(dm_table_entry_t * table_en,int argc,char ** argv)99d14bb027Stkusumi dm_target_error_init(dm_table_entry_t *table_en, int argc, char **argv)
100c9d0c62aShaad {
101c9d0c62aShaad 
102945ce57bStkusumi 	if (argc != 0) {
103945ce57bStkusumi 		printf("Error target takes 0 args, %d given\n", argc);
104945ce57bStkusumi 		return EINVAL;
105945ce57bStkusumi 	}
106945ce57bStkusumi 
107c9d0c62aShaad 	printf("Error target init function called!!\n");
108c9d0c62aShaad 
1092cb93e57Stkusumi 	table_en->target_config = NULL;
110c9d0c62aShaad 
111c9d0c62aShaad 	return 0;
112c9d0c62aShaad }
113249cf593Schristos 
114c9d0c62aShaad /* Strategy routine called from dm_strategy. */
115c9d0c62aShaad int
dm_target_error_strategy(dm_table_entry_t * table_en,struct buf * bp)116c9d0c62aShaad dm_target_error_strategy(dm_table_entry_t *table_en, struct buf *bp)
117c9d0c62aShaad {
118c9d0c62aShaad 
119c9d0c62aShaad 	bp->b_error = EIO;
120c9d0c62aShaad 	bp->b_resid = 0;
121c9d0c62aShaad 
122c9d0c62aShaad 	biodone(bp);
123c9d0c62aShaad 
124c9d0c62aShaad 	return 0;
125c9d0c62aShaad }
126249cf593Schristos 
127c9d0c62aShaad /* Doesn't do anything here. */
128c9d0c62aShaad int
dm_target_error_destroy(dm_table_entry_t * table_en)129c9d0c62aShaad dm_target_error_destroy(dm_table_entry_t *table_en)
130c9d0c62aShaad {
13146f14759Stkusumi 
13278284dcaShaad 	/* Unbusy target so we can unload it */
13378284dcaShaad 	dm_target_unbusy(table_en->target);
13478284dcaShaad 
135c9d0c62aShaad 	return 0;
136c9d0c62aShaad }
137249cf593Schristos 
138*67de4a93Stkusumi #if 0
139c9d0c62aShaad /* Unsupported for this target. */
140c9d0c62aShaad int
141c9d0c62aShaad dm_target_error_upcall(dm_table_entry_t *table_en, struct buf *bp)
142c9d0c62aShaad {
14346f14759Stkusumi 
144c9d0c62aShaad 	return 0;
145c9d0c62aShaad }
146*67de4a93Stkusumi #endif
147