xref: /titanic_41/usr/src/lib/lvm/libmeta/common/meta_replace.c (revision 264a6e7478846334593be7663fb6b1a8f37784a0)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 /*
29  * replace components in metadevices
30  */
31 
32 #include <meta.h>
33 #include <sys/lvm/md_stripe.h>
34 
35 /*
36  * replace named device
37  */
38 int
39 meta_replace_byname(
40 	mdsetname_t	*sp,
41 	mdname_t	*np,
42 	mdname_t	*oldnp,
43 	mdname_t	*newnp,
44 	mdcmdopts_t	options,
45 	md_error_t	*ep
46 )
47 {
48 	char		*miscname;
49 
50 	/* should have a set */
51 	assert(sp != NULL);
52 	assert(sp->setno == MD_MIN2SET(meta_getminor(np->dev)));
53 
54 	/* get type */
55 	if (metachkmeta(np, ep) != 0)
56 		return (-1);
57 	if ((miscname = metagetmiscname(np, ep)) == NULL)
58 		return (-1);
59 
60 	/* dispatch */
61 	if (strcmp(miscname, MD_RAID) == 0) {
62 		return (meta_raid_replace(sp, np, oldnp, newnp, options, ep));
63 	} else if (strcmp(miscname, MD_MIRROR) == 0) {
64 		return (meta_mirror_replace(sp, np, oldnp, newnp, options, ep));
65 	} else {
66 		return (mdmderror(ep, MDE_UNKNOWN_TYPE, meta_getminor(np->dev),
67 		    np->cname));
68 	}
69 }
70 
71 /*
72  * enable named device
73  */
74 int
75 meta_enable_byname(
76 	mdsetname_t	*sp,
77 	mdname_t	*np,
78 	mdname_t	*compnp,
79 	mdcmdopts_t	options,
80 	md_error_t	*ep
81 )
82 {
83 	char		*miscname;
84 
85 	/* should have a set */
86 	assert(sp != NULL);
87 	assert(sp->setno == MD_MIN2SET(meta_getminor(np->dev)));
88 
89 	/* get type */
90 	if (metachkmeta(np, ep) != 0)
91 		return (-1);
92 	if ((miscname = metagetmiscname(np, ep)) == NULL)
93 		return (-1);
94 
95 	/* dispatch */
96 	if (strcmp(miscname, MD_RAID) == 0) {
97 		return (meta_raid_enable(sp, np, compnp, options, ep));
98 	} else if (strcmp(miscname, MD_MIRROR) == 0) {
99 		return (meta_mirror_enable(sp, np, compnp, options, ep));
100 	} else {
101 		return (mdmderror(ep, MDE_UNKNOWN_TYPE, meta_getminor(np->dev),
102 		    np->cname));
103 	}
104 }
105