4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * CDDL HEADER START
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * The contents of this file are subject to the terms of the
d7cd82522afdd890a66c7600b499590ad44e84bdtw * Common Development and Distribution License (the "License").
d7cd82522afdd890a66c7600b499590ad44e84bdtw * You may not use this file except in compliance with the License.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * or http://www.opensolaris.org/os/licensing.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * See the License for the specific language governing permissions
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * and limitations under the License.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * When distributing Covered Code, include this CDDL HEADER in each
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If applicable, add the following below this CDDL HEADER, with the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * fields enclosed by brackets "[]" replaced with your own identifying
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * information: Portions Copyright [yyyy] [name of copyright owner]
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * CDDL HEADER END
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
d7cd82522afdd890a66c7600b499590ad44e84bdtw * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Use is subject to license terms.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <meta.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <assert.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <ctype.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <mdiox.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <meta.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <stdio.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <stdlib.h>
5c5f137104b2d56181283389fa902220f2023809Richard Lowe#include <stddef.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <strings.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <sys/lvm/md_mddb.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <sys/lvm/md_names.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <sys/lvm/md_crc.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#include <sys/lvm/md_convert.h>
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Design Notes:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * All of the code in this file supports the addition of metastat -c output
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * for the verbose option of metaimport. Some of this code is also used by
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the command metastat for concise output(cmd/lvm/util/metastat.c).
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * The code is designed to produce the same output as metastat -c does for a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * given diskset--with a couple exceptions.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * The primary differences between the output for the metastat -c command and
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * metastat output for metaimport -v are:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - the set name is not printed next to each metadevice
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - top-level state information is not printed for some metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - the percent that a disk has completed resyncing is not listed
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * in metaimport -v.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * The general layout of this file is as follows:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - report_metastat_info()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This is the primary entry point for the functions in this file, with
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the exception of several functions that are also called from
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * cmd/io/lvm/util/metastat.c
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * report_metastat_info() calls functions to read in all the the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Directory blocks and Record blocks and then process the information
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * needed to print out the metadevice records in the same format as
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * metastat -c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - read_all_mdrecords()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Reads in all the Directory blocks in the diskset and verifies their
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * validity. For each Directly block, it loops through all Directory
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Entries and for each one that contains a metadevice record calls
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * read_md_record(). Because the output is designed to imitate the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * output of metastat -c, we ignore metadevice records for
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * optimized resync, changelog, and translog.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - read_md_record()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Reads in a Directory Entry and its associated Record block. The
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * revision information for the Record block is checked and it is
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * determined whether or not it is a 64bit Record block or a 32bit record
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * block. For each valid Record block, it allocates an md_im_rec_t
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * structure and calls extract_mduser_data().
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - extract_mduser_data()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Populates the md_im_rec_t data structure with information about the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * record's associated metadevice. Also, the name of the metadevice is
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * either copied from the NM namespace(if it exists there) or is generated
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * from the record's un_self_id.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - process_toplevel_devices()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * For a given metadevice type, searchs through the md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * list of all metadevices in the set, to find all records of the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * specified type that do not have a parent and puts them on a temp list.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * The temp list is then iterated through and the associated processing
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * function is called.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - process_(trans, hotspare, hotspare_pool, soft_part, mirror, stripe, raid)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * These functions are called by using the dfunc field in the mdimpp list.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Each process function only understands its own type of metadevice. Once
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * it processes the metadevice it was called for, it then loops through
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * all of the underlying metadevices. After printing the name of the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * underlying metadevice, it puts in on a list to be processed. If the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * underlying device is a physical device, then print_physical_device is
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * called.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Once all information about the original metadevice is processed, it
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * loops through the list of underlying metadevices and calls the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * appropriate function to process them.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - process_toplevel_softparts()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * To match the output for metastat -c, all top-level softpartions
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * are printed out in groups based on their underlying metadevice--so that
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the underlying metadevice only needs to be processed once.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * - meta_get_(sm_state, raid_col_state, stripe_state, hs_state)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * These functions are used to retrieve the metadevice state information.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * They are also used by the metastat concise routines in
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * cmd/lvm/util/metastat.c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * md_im_rec is a doubly linked list used to store the rb_data for each
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * directory entry that corresponds to a metadevice.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * n_key: is set, if there is an associated entry in the NM namespace.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * dfunc: is set to point to the function that processes the particular
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * metadevice associated with the record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * hs_record_id: is only set, if the metadevice is a hotspare.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * un_self_id: is set for all other records. This is also used to generate
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the name of the metadevice if there is no entry for the metadevice in
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the NM namespace--n_key is not set.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwtypedef struct md_im_rec {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdkey_t n_key; /* NM namespace key */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct md_im_rec *next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct md_im_rec *prev;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t md_type;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t has_parent; /* either 0(no parent) or 1 */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw minor_t un_self_id;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_recid_t hs_record_id; /* hotspare recid */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *n_name; /* name of metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw void (*dfunc) ();
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ushort_t record_len;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* pointer to the unit structure for the metadevice, e.g. rb_data[0] */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw void *record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw} md_im_rec_t;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * md_im_list is used to group toplevel metadevices by type and to group
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the underlying devices for a particular metadevice.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwtypedef struct md_im_list {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct md_im_list *next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct md_im_rec *mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw} md_im_list_t;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * MAXSIZEMDRECNAME is the value that has historically been used to allocate
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * space for the metadevice name
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#define MAXSIZEMDRECNAME 20
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#define NAMEWIDTH 16
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#define NOT_PHYSICAL_DEV 0
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw#define PHYSICAL_DEV 1
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * strip_blacks()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Strip blanks from string. Used for size field in concise output.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic char *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstrip_blanks(char *s)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *p;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (p = s; *p; ) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (*p == ' ') {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *t;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (t = p; *t; t++) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *t = *(t + 1);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw p++;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (s);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * print_concise_entry()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Print properly indented metadevice name, type and size for concise output.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This function is also called from: cmd/lvm/util/metastat.c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwvoid
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprint_concise_entry(int indent, char *name, diskaddr_t size, char mtype)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int i;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int width = NAMEWIDTH; /* minumum field width for name */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char in[MAXPATHLEN];
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *sz;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw in[0] = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (i = 0; i < indent; i++)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) strlcat(in, " ", sizeof (in));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* set up minimum field width. negative for left justified */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw width -= indent;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (width < 0)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw width = 0; /* overflowed; no minimum field needed */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw else
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw width = 0 - width; /* negative for left justification */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (size == 0) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sz = "-";
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sz = strip_blanks(meta_number_to_string(size, DEV_BSIZE));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("%s%*s %c %6s", in, width, name, mtype, sz);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * free_mdrec_list_entry()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing entry from the list of metadevices in the diskset(mdimpp).
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This function will not remove the dummy entry at the head of the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * list, so we don't have to set mdrec equal to NULL.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwfree_mdrec_list_entry(md_im_rec_t **mdrec)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (*mdrec)->prev->next = (*mdrec)->next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((*mdrec)->next != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (*mdrec)->next->prev = (*mdrec)->prev;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free((*mdrec)->record);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free((*mdrec)->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free(*mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * ucomponent_append()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Appending entry to the underlying component list. The list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * is used to group all of the underlying devices before
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * processing them.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwucomponent_append(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t **ucomp_head,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t **ucomp_tail,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->next = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (*ucomp_head == NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *ucomp_head = ucomp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *ucomp_tail = ucomp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (*ucomp_tail)->next = ucomp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *ucomp_tail = (*ucomp_tail)->next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * free_md_im_list_entries()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Freeing entries on an md_im_list_t. This list is used to group
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * underlying components for processing and to group top-level metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * by type.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwfree_md_im_list_entries(md_im_list_t **list_head)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *tmp_list_entry = *list_head;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *rm_list_entry;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw while (tmp_list_entry != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rm_list_entry = tmp_list_entry;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_list_entry = tmp_list_entry->next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free(rm_list_entry);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * print_physical_device()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If a metadevice has an underlying component that is a physical
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * device, then this searches the pnm_rec_t list to match an entry's
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * n_key to the key for the underlying component. The ctd name of the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * physical device is printed on the same line as the metadevice.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprint_physical_device(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdkey_t key
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *tmpphys_nm;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpphys_nm = phys_nm; tmpphys_nm != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpphys_nm = tmpphys_nm->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpphys_nm->n_key == key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s", tmpphys_nm->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * get_stripe_req_size()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Given a 64bit stripe unit, compute the size of the stripe unit.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This function is a derivation of:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * common/lvm/md_convert.c:get_big_stripe_req_size()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * and any changes made to either this function or get_big_stripe_req_size()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * should be reviewed to make sure the functionality in both places is correct.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * total size of the 64bit stripe
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwsize_t
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwget_stripe_req_size(ms_unit_t *un)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct ms_row *mdr;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t row;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t ncomps = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw size_t mdsize = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw size_t first_comp = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Compute the offset of the first component */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw first_comp = sizeof (ms_unit_t) +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sizeof (struct ms_row) * (un->un_nrows - 1);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw first_comp = roundup(first_comp, sizeof (long long));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Requestor wants to have the total size, add the sizes of
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * all components
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdr = &un->un_row[0];
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (row = 0; (row < un->un_nrows); row++)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ncomps += mdr[row].un_ncomp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdsize = first_comp + sizeof (ms_comp_t) * ncomps;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (mdsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * meta_get_sm_state()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Gets the state for the underlying components(submirrors) of a mirror.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This function is also called from: cmd/lvm/util/metastat.c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * string for state of the sub-mirror
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic char *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwmeta_get_sm_state(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sm_state_t state
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* all is well */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (state & SMS_RUNNING) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* resyncing, needs repair */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((state & (SMS_COMP_RESYNC | SMS_ATTACHED_RESYNC |
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw SMS_OFFLINE_RESYNC))) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("resyncing"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* needs repair */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (state & (SMS_COMP_ERRED | SMS_ATTACHED | SMS_OFFLINE))
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("maint"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* unknown */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("unknown"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * meta_get_raid_col_state()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Gets the state for the underlying components(columns) of a raid.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This function is also called from: cmd/lvm/util/metastat.c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * string for state of the raid column
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwchar *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwmeta_get_raid_col_state(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rcs_state_t state
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw switch (state) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case RCS_INIT:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("initializing"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case RCS_OKAY:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case RCS_INIT_ERRED:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*FALLTHROUGH*/
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case RCS_ERRED:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("maint"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case RCS_LAST_ERRED:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("last-erred"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case RCS_RESYNC:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("resyncing"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw default:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("unknown"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * meta_get_stripe_state()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Gets the state for the underlying components of a stripe.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This function is also called from: cmd/lvm/util/metastat.c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * string for state of the stripe
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwchar *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwmeta_get_stripe_state(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw comp_state_t state
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw switch (state) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case CS_OKAY:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case CS_ERRED:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("maint"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case CS_LAST_ERRED:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("last-erred"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case CS_RESYNC:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("resyncing"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw default:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("invalid"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * meta_get_hs_state()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Gets the state for the underlying components(hotspares) of a hotspare pool.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * This function is also called from: cmd/lvm/util/metastat.c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * string for state of the hotspare
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwchar *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwmeta_get_hs_state(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hotspare_states_t state
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw switch (state) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case HSS_AVAILABLE:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case HSS_RESERVED:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("in-use"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case HSS_BROKEN:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("broken"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case HSS_UNUSED:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* FALLTHROUGH */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw default:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (gettext("invalid"));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_trans()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Prints unit information for a trans metadevice and calls the respective
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * functions to process the underlying metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_trans(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mt_unit_t *mt;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdc_unit_t uc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int underlying_device = PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mt = (mt_unit_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = mt->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name, size, and type of metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent, mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_total_blocks, 't');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Loops through md_im_rec_t **mdimpp list of all metadevices to find
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * record that matches the underlying device.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Trans devices can only have one underlying device, so once a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * match is found, we are done.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpmdrec = *mdimpp; tmpmdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec = tmpmdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpmdrec->n_key == mt->un_m_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name of the underlying metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s", tmpmdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = NOT_PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If a metadevice was not found, then the underlying device must be a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * physical device. Otherwise, call the functions to process the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * underlying devices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (underlying_device == PHYSICAL_DEV) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_physical_device(phys_nm, mt->un_m_key);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* process underlying component */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw indent += META_INDENT;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec->dfunc(mdimpp, indent, phys_nm, tmpmdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing the md_entry from the list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * of all metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_mdrec_list_entry(&mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_hotspare()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Searches though list of physical devices to match hotspare record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Prints physical device name and state of a hotspare unit.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*ARGSUSED*/
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_hotspare(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hot_spare_t *hs;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *tmpphys_nm;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *state = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hs = (hot_spare_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Loops through physical namespace to find the device that matches
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the hotspare entry.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpphys_nm = phys_nm; tmpphys_nm != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpphys_nm = tmpphys_nm->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpphys_nm->n_key ==
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ((hot_spare_t *)hs)->hs_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name of hotspare device */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s", tmpphys_nm->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw state = meta_get_hs_state(hs->hs_state);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (state != NULL)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" (%s)", state);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Not removing entry, because it can be processed more than once. */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_hotspare_pool()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Prints concise unit information for a hotspare pool metadevice and calls a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * function to process each attached hotspare device.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_hotspare_pool(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hot_spare_pool_ond_t *hsp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int i;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hsp = (hot_spare_pool_ond_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Printing name, size, and type of metadevice. Setting size field to
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * 0, so that output is the as metastat -c.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent, mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw 0, 'h');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Looping through list of attached hotspare devices. */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (i = 0; i < hsp->hsp_nhotspares; i++) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Looking for the matching record for the hotspare device. */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpmdrec = *mdimpp; tmpmdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec = tmpmdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpmdrec->hs_record_id == hsp->hsp_hotspares[i]) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Calling function to print name of hotspare */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec->dfunc(mdimpp, indent, phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing the md_entry from the list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * of all metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_mdrec_list_entry(&mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_raid()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Prints concise unit information for a raid metadevice and calls the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * respective functions to process the underlying metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_raid(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mr_unit_t *mr;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mr_column_t *mc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdc_unit_t uc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int i;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *hstmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp_head = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp_tail = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *tmpphys_nm;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int underlying_device;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mr = (mr_unit_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = mr->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name, size, and type of metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent, mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_total_blocks, 'r');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Loops through raid columns to find underlying metadevices */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (i = 0, mc = &mr->un_column[0]; i < mr->un_totalcolumncnt;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw i++, mc++) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *state = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *hsname = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Need to assume that underlying device is a physical device,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * unless we find a matching metadevice record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Loops through list of metadevices to find record that matches
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the underlying device.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpmdrec = *mdimpp; tmpmdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec = tmpmdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpmdrec->n_key == mc->un_orig_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* check if hotspare device enabled */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (mc->un_hs_id != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Find matching metadevice record
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * for the hotspare device.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (hstmpmdrec = *mdimpp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hstmpmdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hstmpmdrec = hstmpmdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (hstmpmdrec->hs_record_id ==
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mc->un_hs_id) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* print name of hs */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hstmpmdrec->dfunc(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdimpp, indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hstmpmdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* print name of underlying metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s", tmpmdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = NOT_PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp = Zalloc(sizeof (md_im_list_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec = tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomponent_append(&ucomp_head, &ucomp_tail,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (underlying_device == PHYSICAL_DEV) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_physical_device(phys_nm, mc->un_orig_key);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw state = meta_get_raid_col_state(mc->un_devstate);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * An underlying hotspare must be a physical device.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If support is ever added for soft-partitions under
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * hotspare pools, then this code should be updated to
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * include a search for underlying metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (mc->un_hs_id != 0) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpphys_nm = phys_nm; tmpphys_nm != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpphys_nm = tmpphys_nm->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpphys_nm->n_key == mc->un_hs_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hsname = tmpphys_nm->n_name;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (state != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (hsname != NULL)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" (%s-%s)", state,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hsname);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw else
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" (%s)", state);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else if (hsname != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(gettext(" (spared-%s)"), hsname);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* process underlying components */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw indent += META_INDENT;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (ucomp = ucomp_head; ucomp != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp = ucomp->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec->dfunc(mdimpp, indent, phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_md_im_list_entries(&ucomp_head);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing the md_entry from the list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * of all metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_mdrec_list_entry(&mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_mirror()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Prints concise unit information for a mirror metadevice and calls the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * respective functions to process the underlying metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_mirror(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mm_unit_t *mm;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mm_submirror_t *sm;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdc_unit_t uc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int i;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp_head = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp_tail = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mm = (mm_unit_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = mm->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name, size, and type of metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent, mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_total_blocks, 'm');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Looping through sub-mirrors to find underlying devices */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (i = 0, sm = &mm->un_sm[0]; i < mm->un_nsm; i++, sm++) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *state = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpmdrec = *mdimpp; tmpmdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec = tmpmdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpmdrec->n_key == sm->sm_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s", tmpmdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp = Zalloc(sizeof (md_im_list_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec = tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomponent_append(&ucomp_head, &ucomp_tail,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * It is not possible to have an underlying physical device
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * for a submirror, so there is no need to search the phys_nm
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * list.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing the state for the submirror */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw state = meta_get_sm_state(sm->sm_state);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (state != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" (%s)", state);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* process underlying components */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw indent += META_INDENT;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (ucomp = ucomp_head; ucomp != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp = ucomp->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec->dfunc(mdimpp, indent, phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_md_im_list_entries(&ucomp_head);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing the md_entry from the list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * of all metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_mdrec_list_entry(&mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_stripe()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Prints concise unit information for a stripe metadevice and calls the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * respective functions to process the underlying metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_stripe(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ms_unit_t *ms;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdc_unit_t uc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp_head = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp_tail = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *ucomp = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *tmpphys_nm;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int underlying_device;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t row;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ms = (ms_unit_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = ms->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name, size, and type of metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent, mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_total_blocks, 's');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Looping through stripe rows */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (row = 0; (row < ms->un_nrows); ++row) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct ms_row *mdr = &ms->un_row[row];
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ms_comp_t *mdcomp = (void *)&((char *)ms)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw [ms->un_ocomp];
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t comp, c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Looping through the components in each row to find the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * underlying devices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (comp = 0, c = mdr->un_icomp; (comp < mdr->un_ncomp);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ++comp, ++c) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *state = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *hsname = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ms_comp_t *mdc = &mdcomp[c];
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_m_shared_t *mdm = &mdc->un_mirror;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Need to assume that underlying device is a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * physical device, unless we find a matching
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * metadevice record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpmdrec = *mdimpp; tmpmdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec = tmpmdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpmdrec->n_key == mdc->un_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s", tmpmdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = NOT_PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp = Zalloc(sizeof (md_im_list_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec = tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomponent_append(&ucomp_head,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw &ucomp_tail, ucomp);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* if an underlying metadevice was not found */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (underlying_device == PHYSICAL_DEV) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_physical_device(phys_nm, mdc->un_key);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw state = meta_get_stripe_state(mdm->ms_state);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * An underlying hotspare must be a physical device.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If support is ever added for soft-partitions under
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * hotspare pools, then this code should be updated to
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * include a search for underlying metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (mdm->ms_hs_key != 0) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpphys_nm = phys_nm; tmpphys_nm != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpphys_nm = tmpphys_nm->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpphys_nm->n_key ==
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdm->ms_hs_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hsname = tmpphys_nm->n_name;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (state != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (hsname != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" (%s-%s)", state,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hsname);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" (%s)", state);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else if (hsname != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(gettext(" (spared-%s)"), hsname);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Process underlying metadevices */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw indent += META_INDENT;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (ucomp = ucomp_head; ucomp != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp = ucomp->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec->dfunc(mdimpp, indent, phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ucomp->mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_md_im_list_entries(&ucomp_head);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing the md_entry from the list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * of all metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_mdrec_list_entry(&mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_softpart()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Prints concise unit information for a softpart metadevice and calls the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * respective functions to process the underlying metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_softpart(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp_unit_t *mp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdc_unit_t uc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmpmdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int underlying_device = PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp = (mp_unit_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = mp->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name, size, and type of metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent, mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_total_blocks, 'p');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Loops through md_im_rec_t **mdimpp list of all metadevices to find
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * record that matches the underlying device.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Softpartitions can only have one underlying device, so once a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * match is found, we are done.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmpmdrec = *mdimpp; tmpmdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec = tmpmdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (tmpmdrec->n_key == mp->un_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name of the underlying metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s", tmpmdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = NOT_PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* This is only executed if an underlying metadevice was not found */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (underlying_device == PHYSICAL_DEV) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_physical_device(phys_nm, mp->un_key);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Process underlying metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw indent += META_INDENT;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec->dfunc(mdimpp, indent, phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmpmdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing the md_entry from the list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * of all metadevices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_mdrec_list_entry(&mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_toplevel_softparts()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Toplevel softpartions need to be grouped so that their underlying devices
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * can be printed just once.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_toplevel_softparts(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *phys_nm
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp_unit_t *mp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdc_unit_t uc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *comp_mdrec; /* pntr to underlying component's record */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmp_mdrec, *rm_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp_unit_t *tmp_mp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int underlying_device;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Loops through md_im_rec_t **mdimpp list of all metadevices to find
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * all softpartions that are toplevel softpartitions(softparts w/out
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * a parent). Groups output for these entries so that the function to
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process the underlying metadevice is only called once.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (mdrec = *mdimpp; mdrec != NULL; mdrec = mdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((mdrec->md_type == MDDB_F_SOFTPART) &&
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (mdrec->has_parent == 0)) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp = (mp_unit_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = mp->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Printing name, size, and type of metadevice */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent, mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_total_blocks, 'p');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Looking for record that matches underlying
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * component.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (comp_mdrec = *mdimpp; comp_mdrec != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw comp_mdrec = comp_mdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (comp_mdrec->n_key == mp->un_key) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Print name of underlying device */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s",
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw comp_mdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw underlying_device = NOT_PHYSICAL_DEV;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (underlying_device == PHYSICAL_DEV) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_physical_device(phys_nm, mp->un_key);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Looking for any other toplevel softpartitions with
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * same underlying device. We know that all other
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * matching metadevices, that share the same underlying
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * metadevice, are also soft-partitions.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmp_mdrec = mdrec->next; tmp_mdrec != NULL; ) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mp = (mp_unit_t *)tmp_mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((tmp_mdrec->has_parent == 0) &&
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (tmp_mp->un_key == mp->un_key)) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = tmp_mp->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_concise_entry(indent,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec->n_name,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_total_blocks, 'p');
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (underlying_device ==
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw NOT_PHYSICAL_DEV) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf(" %s",
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw comp_mdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw print_physical_device(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw phys_nm, tmp_mp->un_key);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Need to advance so that will not lose
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * position after removing processed
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rm_mdrec = tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec = tmp_mdrec->next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Removing the md_entry from the list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * of all metadevices.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_mdrec_list_entry(&rm_mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec = tmp_mdrec->next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Process the underlying device */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (underlying_device == NOT_PHYSICAL_DEV) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw indent += META_INDENT;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw comp_mdrec->dfunc(mdimpp, indent, phys_nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw comp_mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * process_toplevel_devices()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Search through list of metadevices for metadevices of md_type that do not
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * have a parent.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic void
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwprocess_toplevel_devices(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t *pnm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t md_type
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *mdrec_tl_tail = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *mdrec_tl_head = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_list_t *tmp_tl_list = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int indent = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw indent += META_INDENT;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Need to group soft partitions so that common underlying device
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * are only processed once.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (md_type == MDDB_F_SOFTPART) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw process_toplevel_softparts(mdimpp, indent, pnm);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Search the list of metadevices to find all metadevices that match
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the type and don't have a parent. Put them on a separate list
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * that will be processed.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (mdrec = *mdimpp; mdrec != NULL; mdrec = mdrec->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((mdrec->md_type == md_type)&&(mdrec->has_parent == 0)) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_tl_list = Zalloc(sizeof (md_im_list_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_tl_list->mdrec = mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_tl_list->next = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (mdrec_tl_tail == NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec_tl_tail = tmp_tl_list;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec_tl_head = mdrec_tl_tail;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec_tl_tail->next = tmp_tl_list;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec_tl_tail = mdrec_tl_tail->next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Loop through list and process all top-level metadevices of a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * given type.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (tmp_tl_list = mdrec_tl_head; tmp_tl_list != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_tl_list = tmp_tl_list->next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_tl_list->mdrec->dfunc(mdimpp, indent, pnm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_tl_list->mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_md_im_list_entries(&mdrec_tl_head);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * extract_mduser_data()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Converts or copies the (mddb_rb_t->rb_data) metadevice record to a 64bit
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Sets the dfunc field to point to the appropriate function to process the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * metadevice.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Sets the parent field for the metadevice.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Extracts the name from the NM namespace if it is available, otherwise
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * generates it from the metadevice's minor number.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * < 0 for failure
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * 0 for success
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic int
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwextract_mduser_data(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_rb_t *nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdrec,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw void *rbp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int is_32bit_record,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_error_t *ep
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdc_unit_t uc;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hot_spare_t *hs;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hot_spare_pool_ond_t *hsp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw size_t newreqsize;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_rb_t *rbp_nm = nm;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct nm_rec *nm_record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw struct nm_name *nmname;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *uname = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*LINTED*/
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw nm_record = (struct nm_rec *)((caddr_t)(&rbp_nm->rb_data));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Setting the un_self_id or the hs_self_id, in the case of hotspare
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * records, for each metadevice entry. Also setting has_parent and
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * setting dfunc so that it points to the correct function to process
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the record type.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If the record was stored ondisk in 32bit format, then it is
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * converted to the 64bits equivalent 64bit format and the memory
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * for the 32bit pointer is freed.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw switch (mdrec->md_type) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case MDDB_F_SOFTPART:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (is_32bit_record) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp_unit32_od_t *small_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw small_un = (mp_unit32_od_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mp_unit_t) +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ((small_un->un_numexts - 1) *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sizeof (struct mp_ext));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw softpart_convert((caddr_t)small_un,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (caddr_t)big_un, SMALL_2_BIG);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mp_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (mp_unit_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mp_unit_t) +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ((big_un->un_numexts - 1) *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sizeof (struct mp_ext));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw bcopy(big_un, mdrec->record, newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = ((mp_unit_t *)mdrec->record)->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->dfunc = &process_softpart;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->un_self_id = uc.un_self_id;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->has_parent = MD_HAS_PARENT(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_parent);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case MDDB_F_STRIPE:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (is_32bit_record) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ms_unit32_od_t *small_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ms_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw small_un = (ms_unit32_od_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = get_big_stripe_req_size(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw small_un, COMPLETE_STRUCTURE);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw stripe_convert((caddr_t)small_un,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (caddr_t)big_un, SMALL_2_BIG);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ms_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (ms_unit_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = get_stripe_req_size(big_un);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw bcopy(big_un, mdrec->record, newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = ((ms_unit_t *)mdrec->record)->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->dfunc = &process_stripe;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->un_self_id = uc.un_self_id;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->has_parent = MD_HAS_PARENT(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_parent);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case MDDB_F_MIRROR:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (is_32bit_record) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mm_unit32_od_t *small_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mm_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw small_un = (mm_unit32_od_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mm_unit_t);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mirror_convert((caddr_t)small_un,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (caddr_t)big_un, SMALL_2_BIG);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mm_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (mm_unit_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mm_unit_t);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw bcopy(big_un, mdrec->record, newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = ((mm_unit_t *)mdrec->record)->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->dfunc = &process_mirror;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->un_self_id = uc.un_self_id;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->has_parent = MD_HAS_PARENT(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_parent);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case MDDB_F_RAID:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (is_32bit_record) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mr_unit32_od_t *small_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mr_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t ncol;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw small_un = (mr_unit32_od_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ncol = small_un->un_totalcolumncnt;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mr_unit_t) +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ((ncol - 1) * sizeof (mr_column_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw raid_convert((caddr_t)small_un,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (caddr_t)big_un, SMALL_2_BIG);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mr_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uint_t ncol;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (mr_unit_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ncol = big_un->un_totalcolumncnt;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mr_unit_t) +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ((ncol - 1) * sizeof (mr_column_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw bcopy(big_un, mdrec->record, newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = ((mr_unit_t *)mdrec->record)->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->dfunc = &process_raid;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->un_self_id = uc.un_self_id;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->has_parent = MD_HAS_PARENT(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_parent);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case MDDB_F_TRANS_MASTER:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (is_32bit_record) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mt_unit32_od_t *small_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mt_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw small_un = (mt_unit32_od_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mt_unit_t);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw trans_master_convert((caddr_t)small_un,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (caddr_t)big_un, SMALL_2_BIG);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mt_unit_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (mt_unit_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (mt_unit_t);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw bcopy(big_un, mdrec->record, newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc = ((mt_unit_t *)mdrec->record)->c;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->dfunc = &process_trans;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->un_self_id = uc.un_self_id;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->has_parent = MD_HAS_PARENT(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uc.un_parent);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case MDDB_F_HOTSPARE:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (is_32bit_record) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hot_spare32_od_t *small_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hot_spare_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw small_un = (hot_spare32_od_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (hot_spare_t);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hs_convert((caddr_t)small_un,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (caddr_t)big_un, SMALL_2_BIG);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hot_spare_t *big_un;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw big_un = (hot_spare_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (hot_spare_t);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw bcopy(big_un, mdrec->record, newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hs = (hot_spare_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->dfunc = &process_hotspare;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->un_self_id = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->hs_record_id = hs->hs_record_id;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->has_parent = 1;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw case MDDB_F_HOTSPARE_POOL:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Ondisk and incore records are always same size.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hsp = (hot_spare_pool_ond_t *)((uintptr_t)rbp +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_rb_t) - sizeof (int)));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw newreqsize = sizeof (hot_spare_pool_ond_t) +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (sizeof (mddb_recid_t) * hsp->hsp_nhotspares);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->record = (void *)Zalloc(newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw bcopy(hsp, mdrec->record, newreqsize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw hsp = (hot_spare_pool_ond_t *)mdrec->record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->dfunc = &process_hotspare_pool;
d7cd82522afdd890a66c7600b499590ad44e84bdtw /*
d7cd82522afdd890a66c7600b499590ad44e84bdtw * If the hsp has descriptive name we'll get
d7cd82522afdd890a66c7600b499590ad44e84bdtw * the un_self_id
d7cd82522afdd890a66c7600b499590ad44e84bdtw */
d7cd82522afdd890a66c7600b499590ad44e84bdtw if (HSP_ID_IS_FN(hsp->hsp_self_id))
d7cd82522afdd890a66c7600b499590ad44e84bdtw mdrec->un_self_id = hsp->hsp_self_id;
d7cd82522afdd890a66c7600b499590ad44e84bdtw else
d7cd82522afdd890a66c7600b499590ad44e84bdtw mdrec->un_self_id = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->has_parent = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw break;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* All valid cases have been dealt with */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw default:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) mdmddberror(ep, MDE_DB_NODB, 0, 0, 0, NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (-1);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If metadevice record has an entry in the NM namespace
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * then it is copied into the mdrec->n_name field.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (mdrec->un_self_id != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (nmname = &nm_record->r_name[0]; nmname->n_key != 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*LINTED*/
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw nmname = (struct nm_name *)((char *)nmname +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw NAMSIZ(nmname))) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
d7cd82522afdd890a66c7600b499590ad44e84bdtw * Extract the metadevice/hsp name if it is
d7cd82522afdd890a66c7600b499590ad44e84bdtw * in the namespace.
d7cd82522afdd890a66c7600b499590ad44e84bdtw *
d7cd82522afdd890a66c7600b499590ad44e84bdtw * If it is a hot spare pool we will find our
d7cd82522afdd890a66c7600b499590ad44e84bdtw * match by comparing the NM record's n_key
d7cd82522afdd890a66c7600b499590ad44e84bdtw * with the extracted key from the hsp_self_id
d7cd82522afdd890a66c7600b499590ad44e84bdtw * Else, match the un_self_id for the record
d7cd82522afdd890a66c7600b499590ad44e84bdtw * to the n_minor name in the NM record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
d7cd82522afdd890a66c7600b499590ad44e84bdtw if (mdrec->md_type == MDDB_F_HOTSPARE_POOL) {
d7cd82522afdd890a66c7600b499590ad44e84bdtw if (nmname->n_key ==
d7cd82522afdd890a66c7600b499590ad44e84bdtw HSP_ID_TO_KEY(hsp->hsp_self_id)) {
d7cd82522afdd890a66c7600b499590ad44e84bdtw mdrec->n_key = nmname->n_key;
d7cd82522afdd890a66c7600b499590ad44e84bdtw uname = Strdup(nmname->n_name);
d7cd82522afdd890a66c7600b499590ad44e84bdtw mdrec->n_name = uname;
d7cd82522afdd890a66c7600b499590ad44e84bdtw break;
d7cd82522afdd890a66c7600b499590ad44e84bdtw }
d7cd82522afdd890a66c7600b499590ad44e84bdtw } else {
d7cd82522afdd890a66c7600b499590ad44e84bdtw if ((nmname->n_minor) == (uc.un_self_id)) {
d7cd82522afdd890a66c7600b499590ad44e84bdtw (*mdrec).n_key = nmname->n_key;
d7cd82522afdd890a66c7600b499590ad44e84bdtw uname = Strdup(nmname->n_name);
d7cd82522afdd890a66c7600b499590ad44e84bdtw mdrec->n_name = uname;
d7cd82522afdd890a66c7600b499590ad44e84bdtw break;
d7cd82522afdd890a66c7600b499590ad44e84bdtw }
d7cd82522afdd890a66c7600b499590ad44e84bdtw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If the metadevice name is not in the namespace, then
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * then we will generate the name from the minor number
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * for the metadevice. In the case of records for a hotspare
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * pool we use hsp_self_id, otherwise we use un_self_id.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (uname == NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (mdrec->md_type == MDDB_F_HOTSPARE_POOL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uname = Malloc(MAXSIZEMDRECNAME);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) sprintf(uname, "hsp%03u",
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw HSP_ID(hsp->hsp_self_id));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->n_name = uname;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else if (mdrec->md_type != MDDB_F_HOTSPARE) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Generate the metadevice name for all other records
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * (except for hotspares, because hotspares can only
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * be physical devices.)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw uname = Malloc(MAXSIZEMDRECNAME);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) sprintf(uname, "d%lu",
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw MD_MIN2UNIT(mdrec->un_self_id));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdrec->n_name = uname;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (0);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * read_mdrecord()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Reads the mddb_rb32_od_t or mddb_rb_t and the associated metadevice record
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * from the disk. Runs magic, checksum, and revision checks on the record
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * block.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * < 0 for failure
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * 0 for success
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic int
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwread_mdrecord(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_mb_t *mbp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_rb_t *nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_de_t *dep,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *diskname,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int fd,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_timeval32_t *lastaccess,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_error_t *ep
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int cnt, rval = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw daddr_t pblk;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw void *rbp = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char *rbp_tmp = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_rb32_t *rbp_32;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_rb_t *rbp_64;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw crc_skip_t *skip = NULL;
d7cd82522afdd890a66c7600b499590ad44e84bdtw int is_32bit_record;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec = Zalloc(sizeof (md_im_rec_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp = (void *)Zalloc(dbtob(dep->de_blkcount));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_tmp = (char *)rbp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Read in the appropriate record and return configurations */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (cnt = 0; cnt < dep->de_blkcount; cnt++) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((pblk = getphysblk(dep->de_blks[cnt], mbp)) < 0) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = mdmddberror(ep, MDE_DB_BLKRANGE,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw NODEV32, MD_LOCAL_SET,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dep->de_blks[cnt], diskname);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (rval);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (lseek(fd, (off_t)dbtob(pblk), SEEK_SET) < 0) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = mdsyserror(ep, errno, diskname);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (rval);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (read(fd, rbp_tmp, DEV_BSIZE) != DEV_BSIZE) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = mdsyserror(ep, errno, diskname);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (rval);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_tmp += DEV_BSIZE;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec->md_type = dep->de_flags;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * The only place to discover whether or not the record is a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * 32bit or 64bit record is from the record's rb_revision field.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * The mddb_rb_t and mddb_rb32_t structures are identical for the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * following fields:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * rb_magic, rb_revision, rb_checksum, and rb_checksum_fiddle.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * So we can assume that the record is a 32bit structure when we
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * check the record's magic number and revision and when we calculate
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * the records checksum.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_32 = (mddb_rb32_t *)rbp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Checking the magic number for the record block.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (rbp_32->rb_magic != MDDB_MAGIC_RB) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = -1;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) mdmddberror(ep, MDE_DB_NODB, 0, 0, 0, NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Checking the revision for the record block. Must match either
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * revision for the current 64bit or 32bit record block. Also,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * setting the flag for whether or not it is a 32bit record.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
d7cd82522afdd890a66c7600b499590ad44e84bdtw is_32bit_record = 0;
d7cd82522afdd890a66c7600b499590ad44e84bdtw switch (rbp_32->rb_revision) {
d7cd82522afdd890a66c7600b499590ad44e84bdtw case MDDB_REV_RB:
d7cd82522afdd890a66c7600b499590ad44e84bdtw case MDDB_REV_RBFN:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw is_32bit_record = 1;
d7cd82522afdd890a66c7600b499590ad44e84bdtw break;
d7cd82522afdd890a66c7600b499590ad44e84bdtw case MDDB_REV_RB64:
d7cd82522afdd890a66c7600b499590ad44e84bdtw case MDDB_REV_RB64FN:
d7cd82522afdd890a66c7600b499590ad44e84bdtw break;
d7cd82522afdd890a66c7600b499590ad44e84bdtw default:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = -1;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) mdmddberror(ep, MDE_DB_NODB, 0, 0, 0, NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Calculating the checksum for this record block. Need
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * to skip the rb's checksum fiddle.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw skip = (crc_skip_t *)Malloc(sizeof (crc_skip_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw skip->skip_next = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw skip->skip_offset = offsetof(mddb_rb_t, rb_checksum_fiddle);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw skip->skip_size = 3 * sizeof (uint_t);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (crcchk(rbp_32, &rbp_32->rb_checksum, dep->de_recsize, skip)) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = -1;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) mdmddberror(ep, MDE_DB_NODB, 0, 0, 0, NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* mddb_rb_t and mddb_rb32_t differ before the rb_timestamp field */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (!is_32bit_record) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((*lastaccess).tv_sec < rbp_32->rb_timestamp.tv_sec) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *lastaccess = rbp_32->rb_timestamp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else if ((*lastaccess).tv_sec ==
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_32->rb_timestamp.tv_sec) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((*lastaccess).tv_usec <
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_32->rb_timestamp.tv_usec)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *lastaccess = rbp_32->rb_timestamp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_64 = (mddb_rb_t *)rbp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((*lastaccess).tv_sec < rbp_64->rb_timestamp.tv_sec) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *lastaccess = rbp_64->rb_timestamp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else if ((*lastaccess).tv_sec ==
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_64->rb_timestamp.tv_sec) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((*lastaccess).tv_usec <
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rbp_64->rb_timestamp.tv_usec)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *lastaccess = rbp_64->rb_timestamp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Populates the fields in md_im_rec_t *tmp_mdrec. */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = extract_mduser_data(nm, tmp_mdrec, rbp, is_32bit_record, ep);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (rval < 0)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Adding record to the head of the list of all metadevices. */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec->prev = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (*mdimpp == NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec->next = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *mdimpp = tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (*mdimpp)->prev = tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec->next = *mdimpp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *mdimpp = tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwout:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Free the skip list */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw while (skip) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw crc_skip_t *skip_rm = skip;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw skip = skip->skip_next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free(skip_rm);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (rbp)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free(rbp);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (rval);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * read_all_mdrecords()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Reads the directory block and directory entries.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Runs magic, checksum, and revision checks on the directory block.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * < 0 for failure
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * 0 for success
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwstatic int
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwread_all_mdrecords(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t **mdimpp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_mb_t *mbp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_lb_t *lbp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_rb_t *nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdname_t *rsp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int fd,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_timeval32_t *lastaccess,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_error_t *ep
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int dbblk, rval = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw char db[DEV_BSIZE];
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_de_t *dep;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int desize;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*LINTED*/
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_db_t *dbp = (mddb_db_t *)&db;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Read in all directory blocks */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (dbblk = lbp->lb_dbfirstblk;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dbblk != 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dbblk = dbp->db_nextblk) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((rval = read_database_block(ep, fd, mbp, dbblk,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dbp, sizeof (db))) <= 0)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Set ep with error code for MDE_DB_NODB. This is the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * error code used in the kernel when there is a problem
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * with reading records in. Checks the magic number, the
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * revision, and the checksum for each directory block.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (dbp->db_magic != MDDB_MAGIC_DB) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = -1;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) mdmddberror(ep, MDE_DB_NODB, 0, 0, 0, NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (revchk(MDDB_REV_DB, dbp->db_revision)) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = -1;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) mdmddberror(ep, MDE_DB_NODB, 0, 0, 0, NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (crcchk(dbp, &dbp->db_checksum, MDDB_BSIZE, NULL)) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = -1;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) mdmddberror(ep, MDE_DB_NODB, 0, 0, 0, NULL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If db timestamp is more recent than the previously recorded
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * last modified timestamp, then update last modified.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((*lastaccess).tv_sec < dbp->db_timestamp.tv_sec) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *lastaccess = dbp->db_timestamp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw } else if ((*lastaccess).tv_sec == dbp->db_timestamp.tv_sec) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((*lastaccess).tv_usec < dbp->db_timestamp.tv_usec)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *lastaccess = dbp->db_timestamp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Creates dep list of all directory entries in the db */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (dbp->db_firstentry != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* LINTED */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dep = (mddb_de_t *)((caddr_t)(&dbp->db_firstentry)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw + sizeof (dbp->db_firstentry));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dbp->db_firstentry = dep;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw while (dep && dep->de_next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw desize = sizeof (*dep) -
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sizeof (dep->de_blks) +
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw sizeof (daddr_t) * dep->de_blkcount;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* LINTED */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dep->de_next = (mddb_de_t *)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ((caddr_t)dep + desize);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dep = dep->de_next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Process all directory entries in the directory block.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * For each directory entry, read_mdrec is called to read
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * in the record data.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw for (dep = dbp->db_firstentry; dep != NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw dep = dep->de_next) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * de_flags is set to the type of metadevice.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If directory entry does not correspond to a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * specific metadevice then it is set to zero.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * All namespace records(NM, SHR_NM, DID_SHR_NM) have a
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * value of zero in their de_flags field.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if ((dep->de_flags != 0)&&
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (dep->de_flags != MDDB_F_OPT) &&
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (dep->de_flags != MDDB_F_TRANS_LOG) &&
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (dep->de_flags != MDDB_F_CHANGELOG)) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = read_mdrecord(mdimpp, mbp, nm, dep,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rsp->cname, fd, lastaccess, ep);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (rval < 0)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwout:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (rval);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw/*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * report_metastat_info()
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Generates the metastat -c output. Also, updates the global variable
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * for a last accessed timestamp.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * Returns:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * < 0 for failure
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * 0 for success
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw *
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwint
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwreport_metastat_info(
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_mb_t *mb,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_lb_t *lbp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mddb_rb_t *nm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw pnm_rec_t **pnm,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdname_t *rsp,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int fd,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_timeval32_t *lastaccess,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_error_t *ep
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw{
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw int rval = 0;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* list of all metadevices in diskset */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *mdimp = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw md_im_rec_t *tmp_mdrec, *rm_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Read in metadevice records and add entries to mdimp list. */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rval = read_all_mdrecords(&mdimp, mb, lbp, nm, rsp, fd, lastaccess,
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw ep);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (rval < 0)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw goto out;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Adding a fake record to the head of the list of all metadevices. */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (mdimp != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec = Zalloc(sizeof (md_im_rec_t));
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec->prev = NULL;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdimp->prev = tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec->next = mdimp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw mdimp = tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /* Calling functions to process all metadevices on mdimp list */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw process_toplevel_devices(&mdimp, *pnm, MDDB_F_SOFTPART);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw process_toplevel_devices(&mdimp, *pnm, MDDB_F_TRANS_MASTER);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw process_toplevel_devices(&mdimp, *pnm, MDDB_F_MIRROR);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw process_toplevel_devices(&mdimp, *pnm, MDDB_F_RAID);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw process_toplevel_devices(&mdimp, *pnm, MDDB_F_STRIPE);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw process_toplevel_devices(&mdimp, *pnm, MDDB_F_HOTSPARE_POOL);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw (void) printf("\n");
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmwout:
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw /*
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * If mdreclist is not null, then this will walk through all
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw * elements and free them.
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw */
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec = mdimp;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw while (tmp_mdrec != NULL) {
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw rm_mdrec = tmp_mdrec;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw tmp_mdrec = tmp_mdrec->next;
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (rm_mdrec->record != NULL)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free(rm_mdrec->record);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw if (rm_mdrec->n_name != NULL)
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free(rm_mdrec->n_name);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw Free(rm_mdrec);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw }
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw free_pnm_rec_list(pnm);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw return (rval);
4745263a792e84bbd9e36b3ceb07d1275762cf9bmw}