1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate /* 23*0Sstevel@tonic-gate * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 24*0Sstevel@tonic-gate * Use is subject to license terms. 25*0Sstevel@tonic-gate */ 26*0Sstevel@tonic-gate 27*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*0Sstevel@tonic-gate 29*0Sstevel@tonic-gate /* 30*0Sstevel@tonic-gate * replace components in metadevices 31*0Sstevel@tonic-gate */ 32*0Sstevel@tonic-gate 33*0Sstevel@tonic-gate #include <meta.h> 34*0Sstevel@tonic-gate #include <sys/lvm/md_stripe.h> 35*0Sstevel@tonic-gate 36*0Sstevel@tonic-gate int 37*0Sstevel@tonic-gate meta_replace(mdsetname_t *sp, mdname_t *metanp, mdname_t *oldnp, 38*0Sstevel@tonic-gate mdname_t *newnp, char *uname, mdcmdopts_t options, md_error_t *ep) 39*0Sstevel@tonic-gate { 40*0Sstevel@tonic-gate char *miscname; 41*0Sstevel@tonic-gate 42*0Sstevel@tonic-gate assert(sp != NULL); 43*0Sstevel@tonic-gate 44*0Sstevel@tonic-gate if (is_hspname(uname)) { 45*0Sstevel@tonic-gate mdhspname_t *hspnp; 46*0Sstevel@tonic-gate 47*0Sstevel@tonic-gate if ((hspnp = metahspname(&sp, uname, ep)) == NULL) 48*0Sstevel@tonic-gate return (-1); 49*0Sstevel@tonic-gate assert(sp != NULL); 50*0Sstevel@tonic-gate (void) meta_hs_replace(sp, hspnp, oldnp, newnp, options, ep); 51*0Sstevel@tonic-gate return (0); 52*0Sstevel@tonic-gate } 53*0Sstevel@tonic-gate assert(sp->setno == MD_MIN2SET(meta_getminor(metanp->dev))); 54*0Sstevel@tonic-gate if (metachkmeta(metanp, ep) != 0) 55*0Sstevel@tonic-gate return (-1); 56*0Sstevel@tonic-gate 57*0Sstevel@tonic-gate 58*0Sstevel@tonic-gate if ((miscname = metagetmiscname(metanp, ep)) == NULL) 59*0Sstevel@tonic-gate return (-1); 60*0Sstevel@tonic-gate 61*0Sstevel@tonic-gate if (strcmp(miscname, MD_RAID) == 0) { 62*0Sstevel@tonic-gate return (meta_raid_replace(sp, metanp, oldnp, newnp, 63*0Sstevel@tonic-gate options, ep)); 64*0Sstevel@tonic-gate } else if (strcmp(miscname, MD_TRANS) == 0) { 65*0Sstevel@tonic-gate return (meta_trans_replace(sp, metanp, oldnp, newnp, 66*0Sstevel@tonic-gate options, ep)); 67*0Sstevel@tonic-gate } else if (strcmp(miscname, MD_STRIPE) == 0) { 68*0Sstevel@tonic-gate return (meta_stripe_replace(sp, metanp, oldnp, newnp, 69*0Sstevel@tonic-gate options, ep)); 70*0Sstevel@tonic-gate } 71*0Sstevel@tonic-gate 72*0Sstevel@tonic-gate return (mdmderror(ep, MDE_UNKNOWN_TYPE, meta_getminor(metanp->dev), 73*0Sstevel@tonic-gate metanp->cname)); 74*0Sstevel@tonic-gate } 75*0Sstevel@tonic-gate /* 76*0Sstevel@tonic-gate * replace named device 77*0Sstevel@tonic-gate */ 78*0Sstevel@tonic-gate int 79*0Sstevel@tonic-gate meta_replace_byname( 80*0Sstevel@tonic-gate mdsetname_t *sp, 81*0Sstevel@tonic-gate mdname_t *np, 82*0Sstevel@tonic-gate mdname_t *oldnp, 83*0Sstevel@tonic-gate mdname_t *newnp, 84*0Sstevel@tonic-gate mdcmdopts_t options, 85*0Sstevel@tonic-gate md_error_t *ep 86*0Sstevel@tonic-gate ) 87*0Sstevel@tonic-gate { 88*0Sstevel@tonic-gate char *miscname; 89*0Sstevel@tonic-gate 90*0Sstevel@tonic-gate /* should have a set */ 91*0Sstevel@tonic-gate assert(sp != NULL); 92*0Sstevel@tonic-gate assert(sp->setno == MD_MIN2SET(meta_getminor(np->dev))); 93*0Sstevel@tonic-gate 94*0Sstevel@tonic-gate /* get type */ 95*0Sstevel@tonic-gate if (metachkmeta(np, ep) != 0) 96*0Sstevel@tonic-gate return (-1); 97*0Sstevel@tonic-gate if ((miscname = metagetmiscname(np, ep)) == NULL) 98*0Sstevel@tonic-gate return (-1); 99*0Sstevel@tonic-gate 100*0Sstevel@tonic-gate /* dispatch */ 101*0Sstevel@tonic-gate if (strcmp(miscname, MD_RAID) == 0) { 102*0Sstevel@tonic-gate return (meta_raid_replace(sp, np, oldnp, newnp, options, ep)); 103*0Sstevel@tonic-gate } else if (strcmp(miscname, MD_MIRROR) == 0) { 104*0Sstevel@tonic-gate return (meta_mirror_replace(sp, np, oldnp, newnp, options, ep)); 105*0Sstevel@tonic-gate } else { 106*0Sstevel@tonic-gate return (mdmderror(ep, MDE_UNKNOWN_TYPE, meta_getminor(np->dev), 107*0Sstevel@tonic-gate np->cname)); 108*0Sstevel@tonic-gate } 109*0Sstevel@tonic-gate } 110*0Sstevel@tonic-gate 111*0Sstevel@tonic-gate /* 112*0Sstevel@tonic-gate * enable named device 113*0Sstevel@tonic-gate */ 114*0Sstevel@tonic-gate int 115*0Sstevel@tonic-gate meta_enable_byname( 116*0Sstevel@tonic-gate mdsetname_t *sp, 117*0Sstevel@tonic-gate mdname_t *np, 118*0Sstevel@tonic-gate mdname_t *compnp, 119*0Sstevel@tonic-gate mdcmdopts_t options, 120*0Sstevel@tonic-gate md_error_t *ep 121*0Sstevel@tonic-gate ) 122*0Sstevel@tonic-gate { 123*0Sstevel@tonic-gate char *miscname; 124*0Sstevel@tonic-gate 125*0Sstevel@tonic-gate /* should have a set */ 126*0Sstevel@tonic-gate assert(sp != NULL); 127*0Sstevel@tonic-gate assert(sp->setno == MD_MIN2SET(meta_getminor(np->dev))); 128*0Sstevel@tonic-gate 129*0Sstevel@tonic-gate /* get type */ 130*0Sstevel@tonic-gate if (metachkmeta(np, ep) != 0) 131*0Sstevel@tonic-gate return (-1); 132*0Sstevel@tonic-gate if ((miscname = metagetmiscname(np, ep)) == NULL) 133*0Sstevel@tonic-gate return (-1); 134*0Sstevel@tonic-gate 135*0Sstevel@tonic-gate /* dispatch */ 136*0Sstevel@tonic-gate if (strcmp(miscname, MD_RAID) == 0) { 137*0Sstevel@tonic-gate return (meta_raid_enable(sp, np, compnp, options, ep)); 138*0Sstevel@tonic-gate } else if (strcmp(miscname, MD_MIRROR) == 0) { 139*0Sstevel@tonic-gate return (meta_mirror_enable(sp, np, compnp, options, ep)); 140*0Sstevel@tonic-gate } else { 141*0Sstevel@tonic-gate return (mdmderror(ep, MDE_UNKNOWN_TYPE, meta_getminor(np->dev), 142*0Sstevel@tonic-gate np->cname)); 143*0Sstevel@tonic-gate } 144*0Sstevel@tonic-gate } 145