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