2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 2N/A * Use is subject to license terms. 2N/A * Just in case we're not in a build environment, make sure that 2N/A * TEXT_DOMAIN gets set to something. 2N/A * Mediator functions 2N/A * There are too many external factors that affect the timing of the 2N/A * operations, so we set the timeout to a very large value, in this 2N/A * case 1 day, which should handle HW timeouts, large configurations, 2N/A * and other potential delays. 2N/A * Data to be sent from med_clnt_create_timed to med_create_helper via 2N/A * meta_client_create_retry. 2N/A * Perform the work of actually doing the clnt_create for 2N/A * meta_client_create_retry. 2N/A * Set the timeout value for this client handle. 2N/A * close RPC connection 2N/A * open RPC connection to rpc.medd 2N/A /* default to local host */ 2N/A /* open RPC connection */ 2N/A "medd med_clnt_create_timed");
2N/A /* return connection */ 2N/A * steal and convert med_err_t 2N/A /* assert(medep->name == NULL); */ 2N/A /* cleanup, return success */ 2N/A /* Loop through the hosts listed */ 2N/A for (; i >= 0; i--) {
2N/A * NULLPROC - just returns a response 2N/A * Update the mediator information on the mediator. 2N/A * This function does the same functionality as 2N/A * clnt_med_upd_data() except that it takes different 2N/A * argument so that host which is just a mediator, can 2N/A * still update its mediator record. 2N/A * Get the mediator information from the client. 2N/A * The code does same functinality as clnt_med_get_data() 2N/A * except that it takes different arguments so that 2N/A * host which doesn't have set information, can still 2N/A * get access to mediator information 2N/A /* copy the mediator data in meddp */ 2N/A * Update the mediator information on the mediator. 2N/A * *** This is not normally called from user code, the kernel does this! *** 2N/A * In the MN diskset, use a generic nodename, multiowner, as 2N/A * the node initiating the RPC request. This allows 2N/A * any node to access mediator information. 2N/A * MN diskset reconfig cycle forces consistent 2N/A * in the MN diskset. This allows the relaxation of 2N/A * node name checking in rpc.metamedd for MN disksets. 2N/A * In the traditional diskset, only a calling node that is 2N/A * in the mediator record's diskset nodelist can access 2N/A * Get the mediator data for this client from the mediator 2N/A * In the MN diskset, use a generic nodename, multiowner, as 2N/A * the node initiating the RPC request. This allows 2N/A * any node to access mediator information. 2N/A * MN diskset reconfig cycle forces consistent 2N/A * in the MN diskset. This allows the relaxation of 2N/A * node name checking in rpc.metamedd for MN disksets. 2N/A * In the traditional diskset, only a calling node that is 2N/A * in the mediator record's diskset nodelist can access 2N/A /* do something with the results */ 2N/A * Update the mediator record on the mediator. 2N/A * In the MN diskset, use a generic nodename, multiowner, as 2N/A * the node initiating the RPC request. This allows 2N/A * any node to access mediator information. 2N/A * MN diskset reconfig cycle forces consistent 2N/A * in the MN diskset. This allows the relaxation of 2N/A * node name checking in rpc.metamedd for MN disksets. 2N/A * In the traditional diskset, only a calling node that is 2N/A * in the mediator record's diskset nodelist can access 2N/A * Get the mediator record for this client from the mediator 2N/A * In the MN diskset, use a generic nodename, multiowner, as 2N/A * the node initiating the RPC request. This allows 2N/A * any node to access mediator information. 2N/A * MN diskset reconfig cycle forces consistent 2N/A * in the MN diskset. This allows the relaxation of 2N/A * node name checking in rpc.metamedd for MN disksets. 2N/A * In the traditional diskset, only a calling node that is 2N/A * in the mediator record's diskset nodelist can access 2N/A /* do something with the results */ 2N/A * Get the name of the host from the mediator daemon. 2N/A /* do something with the results */ 2N/A /* See if this is the local host */ 2N/A * Cluster nodename support 2N/A * See if the clustering code can give us an IP addr 2N/A * for the stored name. If not, find it the old way 2N/A * which will use the public interface. 2N/A /* We only do INET addresses */ 2N/A /* We take the first address only */ 2N/A /* Make sure the ip addresses are current */ 2N/A /* Make sure metamedd still running on host - only chk nodename */ 2N/A * This is a general routine to get mediator information from 2N/A * routine to get mediator information from all mediator hosts or update 2N/A * its mediator record respectively. 2N/A /* Open the meddb file */ 2N/A * During the start up of the SVM services, this function 2N/A * will be called with an empty sname. In that case it is 2N/A * entirely possible for the MED_DB_FILE not to exist. 2N/A * If so, then no need to report an error. 2N/A "Error in opening meddb file"));
2N/A /* Initialize rec_size */ 2N/A /* Allocate a record buffer */ 2N/A "Error in allocating memory"));
2N/A /* read the file header */ 2N/A "Error in reading mediator record"));
2N/A /* Number of records in the mediator file */ 2N/A for (i = 0; i < c; i++) {
2N/A "Error in reading mediator record"));
2N/A * For oban diskset first entry in the rec_nodes field is 2N/A * "multiowner" and all other entries are empty. 2N/A * Check if this is really multiowner diskset. 2N/A * Continue if the set name is not in our interest. 2N/A * This is required when this routine is called 2N/A * It is possible for the n_lst[j] slot to be empty 2N/A * if the mediator node has already been removed so 2N/A * go to the next slot. 2N/A * Make sure this node has the correct value 2N/A * for the mediator record. If not we want the 2N/A * highest value from the other nodes. Save it 2N/A * for updating once the loop through all the 2N/A * mediator nodes has completed. 2N/A * Mediators only become active when there are 2N/A * replica updates to the sets and this can only 2N/A * occur when there is a disk in the set. 2N/A * If there are no disks found then the save_medd 2N/A * structure will be empty. If save_medd is empty, 2N/A * do not update the set. 2N/A * Update the latest mediator information 2N/A * We had some errors while updaing the 2N/A * record. This means this metaset is 2N/A * not updated with latest mediator 2N/A "Error in closing meddb file"));