1N/A * The contents of this file are subject to the terms of the 1N/A * Common Development and Distribution License (the "License"). 1N/A * You may not use this file except in compliance with the License. 1N/A * See the License for the specific language governing permissions 1N/A * and limitations under the License. 1N/A * When distributing Covered Code, include this CDDL HEADER in each 1N/A * If applicable, add the following below this CDDL HEADER, with the 1N/A * fields enclosed by brackets "[]" replaced with your own identifying 1N/A * information: Portions Copyright [yyyy] [name of copyright owner] 1N/A * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 1N/A * Use is subject to license terms. 1N/A * Copyright (c) 2011 Bayard G. Bell. All rights reserved. 1N/A /* Scan the hot spare pool list */ 1N/A /* create a hot spare pool record */ 1N/A /* get the record addr */ 1N/A /* Not much to do here in case of a dryrun */ 1N/A /* create an empty hot spare pool */ 1N/A /* Scan the hot spare list */ 1N/A * Did not find match for device using devnum so use 1N/A * key associated with shs_component_old just 1N/A * in case there is a match but the match's dev is NODEV. 1N/A * If unable to find a unique key for shs_component_old 1N/A * then fail since namespace has multiple entries 1N/A * for this old component and we shouldn't allow 1N/A * an addition of a hotspare in this case. 1N/A * If more than one key matches given old_dev - fail command 1N/A * since shouldn't add new hotspare if namespace has 1N/A * If there is no key for this entry then fail since 1N/A * a key for this entry should exist. 1N/A /* Scan the hot spare list again */ 1N/A * Only need to compare keys when hs_devnum is NODEV. 1N/A /* create a hot spare record */ 1N/A /* Scan the hot spare pool list */ 1N/A /* create a hot spare pool record */ 1N/A /* get the record addr */ 1N/A /* force prev_hsp to NULL, this will cause hsp to be linked */ 1N/A * Make sure the hot spare is not already in the pool. 1N/A * Create a new hot spare pool record 1N/A * This gives us the one extra hs slot, 1N/A * because there is one slot in the 1N/A * hot_spare_pool struct 1N/A * The Friendly Name status of the new HSP should duplicate 1N/A * the status of the existing one. 1N/A /* get the record addr */ 1N/A /* copy the old record into the new one */ 1N/A /* mark the old hsp to be deleted */ 1N/A /* lock the db records */ 1N/A /* increment the reference count */ 1N/A /* add the hs at the end of the hot spare pool */ 1N/A * NOTE: We do not commit the previous hot spare pool record. 1N/A * There is no need, the link gets rebuilt at boot time. 1N/A /* commit the db records */ 1N/A /* delete the old hot spare pool record */ 1N/A /* Scan the hot spare pool list */ 1N/A /* In case of a dryrun, we're done here */ 1N/A * NOTE: We do not commit the previous hot spare pool record. 1N/A * There is no need, the link gets rebuilt at boot time. 1N/A /* delete the hot spare pool */ 1N/A /* Scan the hot spare list */ 1N/A * Unable to find device using devnum so use 1N/A * key associated with shs_component_old instead. 1N/A * If unable to find a unique key for shs_component_old 1N/A * then fail since namespace has multiple entries 1N/A * for this old component and we're unable to determine 1N/A * which key is the valid match for shs_component_old. 1N/A * Only need to compare keys when hs_devnum is NODEV. 1N/A * If more than one key matches given old_dev - fail command 1N/A * since shouldn't add new hotspare if namespace has 1N/A * If there is no key for this entry then fail since 1N/A * a key for this entry should exist. 1N/A /* Scan the hot spare list again */ 1N/A * Only need to compare keys when hs_devnum is NODEV. 1N/A /* Scan the hot spare pool list */ 1N/A /* check for force flag and state of hot spare */ 1N/A * Make sure the device is in the pool. 1N/A /* In case of a dryrun, we're done here */ 1N/A /* lock the db records */ 1N/A * NOTE: We do not commit the previous hot spare record. 1N/A * There is no need, the link we get rebuilt at boot time. 1N/A /* mark the hot spare to be deleted */ 1N/A /* find the location of the hs in the hsp */ 1N/A /* remove the hs from the hsp */ 1N/A /* commit the db records */ 1N/A /* Scan the hot spare list */ 1N/A * Unable to find device using devnum so use 1N/A * key associated with shs_component_old instead. 1N/A * If unable to find a unique key for shs_component_old 1N/A * then fail since namespace has multiple entries 1N/A * for this old component and we're unable to determine 1N/A * which key is the valid match for shs_component_old. 1N/A * Only need to compare keys when hs_devnum is NODEV. 1N/A * If more than one key matches given old_dev - fail command 1N/A * since unable to determine which key is correct. 1N/A * If there is no key for this entry then fail since 1N/A * a key for this entry should exist. 1N/A /* Scan the hot spare list again */ 1N/A * Only need to compare keys when hs_devnum is NODEV. 1N/A /* check the force flag and the state of the hot spare */ 1N/A /* Scan the hot spare pool list */ 1N/A * Make sure the old device is in the pool. 1N/A /* Scan the hot spare list for the new hs */ 1N/A * Make sure the new device is not already in the pool. 1N/A * We don't have to search the hs in this hsp, if the 1N/A * new hs was just created. Only if the hot spare was found. 1N/A /* In case of a dryrun, we're done here */ 1N/A * Create the new hotspare 1N/A /* create a hot spare record */ 1N/A /* lock the db records */ 1N/A * NOTE: We do not commit the previous hot spare record. 1N/A * There is no need, the link we get rebuilt at boot time. 1N/A /* mark hs to be deleted in the correct order */ 1N/A /* link into the hs list */ 1N/A /* do this AFTER the old dev is possibly removed */ 1N/A /* find the location of the old hs in the hsp */ 1N/A /* commit the db records */ 1N/A * Find device by using key associated with shs_component_old. 1N/A * If unable to find a unique key for shs_component_old 1N/A * then fail since namespace has multiple entries 1N/A * for this old component and we're unable to determine 1N/A * which key is the valid match for shs_component_old. 1N/A * This failure keeps a hotspare from being enabled on a slice 1N/A * that may already be in use by another metadevice. 1N/A * If more than one key matches given old_dev - fail command 1N/A * since unable to determine which key is correct. 1N/A * If there is no key for this entry then fail since 1N/A * a key for this entry should exist. 1N/A /* Scan the hot spare list for the hs */ 1N/A * Since component may or may not be currently in the system, 1N/A * use the keys to find a match (not the devt). 1N/A /* make sure it's broken */ 1N/A /* In case of a dryrun, we're done here */ 1N/A /* commit the db records */ 1N/A /* Scan the hot spare list for the hs */ 1N/A /* Scan the hot spare pool list */ 1N/A /* We can only handle 32-bit clients for internal commands */ 1N/A /* dispatch ioctl */ 1N/A * copyout and free any args 1N/A /* un single thread */ 1N/A /* return success */ 1N/A * Needs to convert to internal 64 bit 1N/A "are not accessible on a 32 bit kernel\n",
devname);
1N/A * Find all the hotspares for set "setno" 1N/A * and remove them from the hot_spare_list. 1N/A * Find all the hotspare pools for set "setno" 1N/A * and remove them from the hot_spare_pools list. 1N/A * Also remove from the get_next list. 1N/A /* NOTE: Mirror code commits the hs record */ 1N/A * That is because we always allocate the whole hs. 1N/A * Later if we choose to allocate only what is needed 1N/A * which part is being unreseved. 1N/A /* NOTE: Stripe code commits the hsp record */ 1N/A /* If md_halt has been run do not continue */ 1N/A * Fixup the pool and hotspares 1N/A /* prevent access to services that may have been imported */ 1N/A/* define the module linkage */