meta_metad.c revision 2
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 2006 Sun Microsystems, Inc. All rights reserved. 2N/A * Use is subject to license terms. 2N/A#
pragma ident "%Z%%M% %I% %E% SMI" 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 * Convert an old style mddrivename_t into a new style 2N/A * mddrivename_t. Meant to be used *ONLY* by rpc.metad 2N/A /* fields that haven't changed */ 2N/A /* geometry information */ 2N/A /* controller information */ 2N/A /* vtoc information */ 2N/A /* The new style vtoc has 17 partitions */ 2N/A /* partition information */ 2N/A * We speculate that if cname for a particular 2N/A * partition does not exist, the other fields 2N/A * don't exist either. In such a case, we don't 2N/A * need to do anything for that partition. 2N/A /* We don't care about the rest of the fields */ 2N/A * Convert a new style mddrivename_t into an old style 2N/A * mddrivename_t. Meant to be used *ONLY* by rpc.metad 2N/A /* fields that haven't changed */ 2N/A /* geometry information */ 2N/A /* controller information */ 2N/A /* vtoc information */ 2N/A /* partition information */ 2N/A * We speculate that if cname for a particular 2N/A * partition does not exist then the rest of 2N/A * the fields a partition don't exist either. 2N/A * In such a case, we don't need to do anything 2N/A * for that partition. 2N/A /* We don't care about the rest of the fields */ 2N/A * Convert an old style md_drive_desc_t into a new style 2N/A * md_drive_desc_t. Meant to be used *ONLY* by rpc.metad 2N/A * Convert an new style md_drive_desc_t into a old style 2N/A * md_drive_desc_t. Meant to be used *ONLY* by rpc.metad 2N/A * Allocate memory for v1 drive descriptor 2N/A * depending upon the number of drives in the 2N/A * v2 drive descriptor 2N/A * Allocate memory for v2 drive descriptor 2N/A * depending upon the number of drives in the 2N/A * v1 drive descriptor 2N/A * Return the device id for a given device 2N/A * Add side names for the diskset drive records 2N/A * NOTE: these go into the local set's namespace. 2N/A * If the server is local, we call the v2 procedure 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A /* set descriptor */ 2N/A "metad add drive sidenames"));
2N/A }
else {
/* version 2 */ 2N/A "metad add drive sidenames"));
2N/A * Adding drives via metaimport to disksets. Some of the drives may 2N/A * not be available so we need more information than the basic clnt_adddrvs 2N/A * If the server is local, we call the v1 procedure 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad imp add drives"));
2N/A * Add drives to disksets. 2N/A * If the server is local, we call the v2 procedure 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A }
else {
/* version 2 */ 2N/A * Add hosts to disksets. 2N/A * Check the client handle for the version and invoke 2N/A * the appropriate version of the remote procedure 2N/A * Check the client handle for the version and invoke 2N/A * the appropriate version of the remote procedure 2N/A * Create MN disksets. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A * Withdraw from MN set 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad withdraw set"));
2N/A * Delete side names for the diskset drive records 2N/A * NOTE: these are removed from the local set's namespace. 2N/A * Check the client handle for the version and invoke 2N/A * the appropriate version of the remote procedure 2N/A "metad delete drive sidenames"));
2N/A "metad delete drive sidenames"));
2N/A * delete drives from the set 2N/A * If the server is local, we call the v2 procedure 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A "metad delete drives"));
2N/A }
else {
/* version 2 */ 2N/A "metad delete drives"));
2N/A * delete host(s) from a set. 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * return remote device info 2N/A * If the server is local, we call the v2 procedure. 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of 2N/A * the remote procedure. 2N/A * Convert v2 arguments to v1 arguments 2N/A * before sending over the wire. 2N/A }
else {
/* version 2 */ 2N/A /* do something with the results */ 2N/A * return remote device info 2N/A * If the server is local, we call the v2 procedure. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A }
else {
/* version 2 */ 2N/A /* do something with the results */ 2N/A * Get the device information of a disk on a remote host. The information 2N/A * retrieved is the device's name, the associated driver and the dev_t. 2N/A * The lookup is performed by using the devid of the disk as this is 2N/A * unique to the disk. The device name on the originating node is passed 2N/A * in. If that devname is found when doing the devid to namelist translation 2N/A * then that value is used to make the device names as consistent as possible 2N/A * An attempt is made to retrieve this information by calling 2N/A * mdrpc_devinfo_by_devid_name_2_svc. Locally this call should always 2N/A * succeed. In the case where a call is made through a CLIENT handle, 2N/A * it is possible that the function hasn't been implemented on the called 2N/A * node. If this is the case fall back to mdrpc_devinfo_by_devidstr_2_svc. 2N/A * ENOTSUP Operation not supported i.e. procedure not supported on 2N/A * We are calling this locally so call the function 2N/A /* open connection */ 2N/A /* try falling back to devidstr_2_svc */ 2N/A "metad devinfo by devid"));
2N/A * return status of whether driver is used, mount 2N/A * If the server is local, we call the v2 procedure 2N/A /* open connection */ 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A /* Convert v2 args to v1 args */ 2N/A }
else {
/* version 2 */ 2N/A * dummy up a result struct, to do a deep free of the (mn)sr. 2N/A * (A deep free means that the xdr_free code will free the 2N/A * linked list of drive records for the sr and will also free 2N/A * the linked list of node records for the mnsr.) 2N/A * return the diskset record, and drive records. 2N/A * If record is a MNdiskset record, then only the first md_set_record 2N/A * bytes were copied from the daemon. 2N/A * This has to work during the boot up before the rpc.metad can 2N/A * run. Check to see if we can handle this as a strictly local 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * return the multi-node diskset record, drive records and node records. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A /* If no ep error and no version mismatch - rpc call worked ok */ 2N/A * Set master nodeid and nodename in multi-node set record. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A * Get the MH timeout values. 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A /* do something with the results */ 2N/A /* copy md_mhiargs_t */ 2N/A * get real hostname from remote host 2N/A /* do something with the results */ 2N/A * NULLPROC - just returns a response 2N/A * does host own the set? 2N/A * This has to work in the code path from libpreen which is 2N/A * running within fsck before the rpc.metad can run. Check 2N/A * to see if we should handle this as an auto-take diskset. 2N/A /* Can't call mdrpc_ownset_2_svc since not in daemon */ 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A /* do something with the results */ 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A /* do something with the results */ 2N/A * Is set number in-use? 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A /* do something with the results */ 2N/A * Set the timeout values used into the drive records. 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * update drive records 2N/A * If the server is local, we call the v2 procedure 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A "metad update drive dbinfo"));
2N/A }
else {
/* version 2 */ 2N/A "metad update drive dbinfo"));
2N/A * update dr_flags field of drive record. 2N/A * If the server is local, we call the v2 procedure 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A "metad update drive flags"));
2N/A }
else {
/* version 2 */ 2N/A "metad update drive flags"));
2N/A * update set record flags 2N/A * This replaces all of the sr_flags with the new_flags. It relies on the 2N/A * caller to "do the right thing" to preserve the existing flags that should 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * Enable bits in the set record flags field. This just turns on the specified 2N/A * bits and leaves the other bits alone. 2N/A /* Get the flags from the current set */ 2N/A /* Turn on the specified bits */ 2N/A * Disable bits in the set record flags field. This just turns off the 2N/A * specified bits and leaves the other bits alone. 2N/A /* Get the flags from the current set */ 2N/A /* Turn off the specified bits */ 2N/A * Assign the flags as the new value(s) for the MD_SR_STATE_FLAGS within the 2N/A * set record flags field. This actually can set any bits but only clears 2N/A * the bits within the MD_SR_STATE_FLAGS subfield and leaves any other 2N/A * bits turned on. It can be used to clear (state) and set bits all in one 2N/A /* Get the flags from the current set */ 2N/A /* clear the existing state flags */ 2N/A /* Or in the new value */ 2N/A /* get here, if set called before get */ 2N/A * Unlock the set after operation is complete. 2N/A * Lock set so that only operators with valid keys are allowed in the daemon. 2N/A * Add mediator hosts to disksets. 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * update nr_flags field of node records based 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad set node flags"));
2N/A * Clear set locks for all MN disksets. 2N/A * Used during reconfig cycle to recover from failed nodes. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A * Calls to suspend, resume or reinit the rpc.mdcommd daemon. 2N/A * This allows a node to remotely suspend, reinit and resume the 2N/A * rpc.mdcommd daemon on the given hostname node. Used by libmeta 2N/A * to lock out class 1 messages (metainit, etc) on all nodes when running 2N/A * metaset and metadb commands on this node. 2N/A * When suspending the commd, the suspend request will fail until all 2N/A * messages have been drained from the rpc.mdcommd. This routine will 2N/A * spin sending the suspend request until the rpc.mdcommd is drained 2N/A * or until rpc.mdcommd returns a failure other than MDMNE_SET_NOT_DRAINED. 2N/A * Also used to send the rpc.mdcommd daemon a new nodelist by draining all 2N/A * messages from the mdcommd and sending a reinit command to have mdcommd 2N/A * get the new nodelist from rpc.metad. Used when nodelist is changed 2N/A * - addition or deletion of host from diskset 2N/A * - join or withdrawal of host from diskset 2N/A * - addition of first disk to diskset (joins all nodes) 2N/A * - removal of last disk from diskset (withdraws all nodes) 2N/A * Call v2 procedure directly if rpc.metad on this node is 2N/A * sending message to itself. 2N/A * If set not yet drained, wait a second 2N/A /* Wait a second and try again */ 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad commd control"));
2N/A * If set not yet drained, 2N/A "metad commd control"));
2N/A * Is owner node stale? 2N/A * Call v2 procedure directly if rpc.metad on this node is 2N/A * sending message to itself. 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A /* do something with the results */ 2N/A * Free md_drive_desc linked list of drive descriptors that was alloc'd 2N/A * from a call to the RPC routine clnt_getdrivedesc. Drive descriptors 2N/A * are from another node. 2N/A * dummy up a result struct, to do a deep free of the dd. 2N/A * (A deep free means that the xdr_free code will free the 2N/A * linked list of drive descs.) 2N/A * Get a partially filled in drive desc from remote node. Used in MN 2N/A * disksets during the reconfig cycle to get the diskset drive 2N/A * information from another host in order to sync up all nodes. 2N/A * Used when the drive record information isn't good enough 2N/A * since the drive record doesn't give the name of 2N/A * the drive, but just a key into that other node's nodespace. 2N/A * Returned drive desc has the drive name filled in but no other strings 2N/A * in the drivename structure. 2N/A * Returns a 0 if RPC was successful, 1 otherwise. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad get drive desc set"));
2N/A /* If no ep error and no version mismatch - rpc call worked ok */ 2N/A * update dr_flags field of drive record. 2N/A * Also sync up genid of drive descriptors and make set 2N/A * record and node records match the genid. 2N/A * Returns a 0 if RPC was successful, 1 otherwise. 2N/A * If the server is local, we call the v2 procedure 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad update drive reconfig"));
2N/A * Reset mirror owner(s) if mirror owner(s) is in the list of 2N/A * node's specified in the array of nodeids. 2N/A * This is called when a node has been deleted or withdrawn 2N/A * Check the client handle for the version 2N/A * and invoke the appropriate version of the 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad reset mirror owner"));
2N/A * Call to suspend and resume I/O for given diskset(s). 2N/A * This allows a node to remotely suspend and resume I/O on 2N/A * a MN diskset. A diskset number of 0 represents all MN disksets. 2N/A * Call v2 procedure directly if rpc.metad on this node is 2N/A * sending message to itself. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad mn_susp_res_io control"));
2N/A * Resnarf the set after the set has been imported 2N/A * We should never be making this procedure call 2N/A * over the wire, it's sole purpose is to snarf 2N/A * the imported set on the localhost. 2N/A /* Check the client handle for the version */ 2N/A /* If the client is version 1, return error */ 2N/A * Call to start a resync for a given diskset. 2N/A * Used when a node has been added to a diskset. 2N/A * Should be called after rpc.mdcommd is resumed. 2N/A * Call v2 procedure directly if rpc.metad on this node is 2N/A * sending message to itself. 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad mn_mirror_resync_all"));
2N/A * Call to update the ABR state for all soft partitions. 2N/A * Used when a node has been added to a diskset. 2N/A * Should be called after rpc.mdcommd is resumed. 2N/A * No need to call function if adding local node as ABR cannot 2N/A * Check the client handle for the version 2N/A * If the client is version 1, return error 2N/A * otherwise, make the remote procedure call. 2N/A "metad mn_sp_update_abr"));