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