sdbc_stats.c revision 570de38f63910201fdd77246630b7aa8f9dc5661
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * CDDL HEADER START
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * The contents of this file are subject to the terms of the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Common Development and Distribution License (the "License").
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * You may not use this file except in compliance with the License.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * or http://www.opensolaris.org/os/licensing.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * See the License for the specific language governing permissions
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * and limitations under the License.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * When distributing Covered Code, include this CDDL HEADER in each
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * If applicable, add the following below this CDDL HEADER, with the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * fields enclosed by brackets "[]" replaced with your own identifying
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * information: Portions Copyright [yyyy] [name of copyright owner]
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * CDDL HEADER END
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Use is subject to license terms.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <stdio.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <stdlib.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <string.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <unistd.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <errno.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <inttypes.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <kstat.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <sys/nsctl/nsctl.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include <sys/nsctl/sd_bcache.h>
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include "sdbc_stats.h"
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include "dsstat.h"
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include "common.h"
83c4dfe9546fd839e7a52bca7e9920da918f916ejg#include "report.h"
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgstatic sdbcstat_t *sdbc_top;
83c4dfe9546fd839e7a52bca7e9920da918f916ejgkstat_t *sdbc_global = NULL;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgvoid sdbc_header();
83c4dfe9546fd839e7a52bca7e9920da918f916ejgint sdbc_value_check(sdbcstat_t *);
83c4dfe9546fd839e7a52bca7e9920da918f916ejgint sdbc_validate(kstat_t *);
83c4dfe9546fd839e7a52bca7e9920da918f916ejguint32_t sdbc_getdelta(sdbcstat_t *, char *);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgvoid sdbc_addstat(sdbcstat_t *);
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbcstat_t *sdbc_delstat(sdbcstat_t *);
83c4dfe9546fd839e7a52bca7e9920da918f916ejgvoid center(int, char *);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_discover() - looks for new statistics to be monitored.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Verifies that any statistics found are now already being
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * monitored.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgint
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_discover(kstat_ctl_t *kc)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg static int validated = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_t *ksp;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int kinst;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char kname[KSTAT_STRLEN + 1];
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *cur;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *sdbcstat = NULL;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_t *io_ksp;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp(ksp->ks_module, SDBC_KSTAT_MODULE) != 0 ||
83c4dfe9546fd839e7a52bca7e9920da918f916ejg strncmp(ksp->ks_name, SDBC_KSTAT_CDSTATS, 2) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (kstat_read(kc, ksp, NULL) == -1)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Validate kstat structure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (! validated) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_validate(ksp))
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (EINVAL);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg validated++;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Duplicate check
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (cur = sdbc_top; cur; cur = cur->next) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char *cur_vname, *tst_vname;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur_vname = kstat_value(cur->pre_set,
83c4dfe9546fd839e7a52bca7e9920da918f916ejg SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg tst_vname = kstat_value(ksp,
83c4dfe9546fd839e7a52bca7e9920da918f916ejg SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (strncmp(cur_vname, tst_vname, NAMED_LEN) == 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg goto next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Initialize new record
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat = (sdbcstat_t *)calloc(1, sizeof (sdbcstat_t));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kinst = ksp->ks_instance;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Set kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat->pre_set = kstat_retrieve(kc, ksp);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbcstat->pre_set == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg goto next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat->collected |= GOT_SET_KSTAT;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * I/O kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) sprintf(kname, "%s%d", SDBC_IOKSTAT_CDSTATS, kinst);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg io_ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, kinst, kname);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat->pre_io = kstat_retrieve(kc, io_ksp);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbcstat->pre_io == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg goto next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat->collected |= GOT_IO_KSTAT;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgnext:
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Check if we got a complete set of stats
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbcstat == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (SDBC_COMPLETE(sdbcstat->collected)) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) sdbc_delstat(sdbcstat);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbc_addstat(sdbcstat);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_top == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (EAGAIN);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_update() - updates all of the statistics currently being monitored.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgint
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_update(kstat_ctl_t *kc)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_t *ksp;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *cur;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Update global kstat information */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, -1, SDBC_KSTAT_GSTATS);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (ksp == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (EAGAIN);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_global)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_free(sdbc_global);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbc_global = kstat_retrieve(kc, ksp);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (cur = sdbc_top; cur != NULL; cur = cur->next) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int kinst;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char *kname, *cname, *pname;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_t *set_ksp, *io_ksp;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur->collected = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Age off old stats
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (cur->cur_set != NULL) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_free(cur->pre_set);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_free(cur->pre_io);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur->pre_set = cur->cur_set;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur->pre_io = cur->cur_io;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Update set kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kinst = cur->pre_set->ks_instance;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kname = cur->pre_set->ks_name;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg set_ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, kinst, kname);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if ((cur->cur_set = kstat_retrieve(kc, set_ksp)) == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur->collected |= GOT_SET_KSTAT;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Validate set
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg pname = kstat_value(cur->pre_set, SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cname = kstat_value(cur->cur_set, SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (strncmp(pname, cname, NAMED_LEN) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * Update I/O kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kinst = cur->pre_io->ks_instance;
25e8c5aa2b496d9026e958ac731a610167574f59vikram kname = cur->pre_io->ks_name;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg io_ksp = kstat_lookup(kc, SDBC_KSTAT_MODULE, kinst, kname);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if ((cur->cur_io = kstat_retrieve(kc, io_ksp)) == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur->collected |= GOT_IO_KSTAT;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram/*
25e8c5aa2b496d9026e958ac731a610167574f59vikram * sdbc_report() - outputs statistics for the statistics currently being
25e8c5aa2b496d9026e958ac731a610167574f59vikram * monitored. Deletes statistics for volumes that have been disabled.
25e8c5aa2b496d9026e958ac731a610167574f59vikram *
25e8c5aa2b496d9026e958ac731a610167574f59vikram */
25e8c5aa2b496d9026e958ac731a610167574f59vikramint
25e8c5aa2b496d9026e958ac731a610167574f59vikramsdbc_report()
25e8c5aa2b496d9026e958ac731a610167574f59vikram{
25e8c5aa2b496d9026e958ac731a610167574f59vikram vslist_t *vslist = vs_top;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *cur, *pre = NULL;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_top == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (cur = sdbc_top; cur != NULL; ) { /* CSTYLED */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg static uint32_t linesout = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg uint32_t *offline;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char volname[NAMED_LEN + 1];
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char rmode[STAT_HDR_SIZE];
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char wmode[STAT_HDR_SIZE];
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Parse volume name */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) strncpy(volname, kstat_value(cur->pre_set,
83c4dfe9546fd839e7a52bca7e9920da918f916ejg SDBC_CDKSTAT_VOL_NAME), NAMED_LEN);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg volname[NAMED_LEN] = '\0';
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Check to see if the user specified this volume */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (vslist = vs_top; vslist != NULL; vslist = vslist->next)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (strcmp(volname, vslist->volname) == 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg break;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (vs_top != NULL && vslist == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg goto next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Check if volume is offline and zflag applies */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (zflag && sdbc_value_check(cur) == 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg goto next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Output volume name */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbc_header();
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(DATA_C16, volname);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (SDBC_COMPLETE(cur->collected)) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *next = sdbc_delstat(cur);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (! pre)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur = sdbc_top = next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg else
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur = pre->next = next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(" <<volume disabled>>\n");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg offline = kstat_value(cur->cur_set, SDBC_CDKSTAT_FAILED);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (*offline) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(" <<volume offline>>\n");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg linesout++;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg goto next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Type/status flags */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & FLAGS) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg uint32_t *dhint, *nhint;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg uint32_t hints;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg dhint = kstat_value(cur->cur_set, SDBC_CDKSTAT_CDHINTS);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg nhint = kstat_value(sdbc_global, SDBC_GKSTAT_NODEHINTS);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (! nhint)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (EINVAL);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg hints = *nhint;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg hints &= (NSC_FORCED_WRTHRU | NSC_NO_FORCED_WRTHRU |
83c4dfe9546fd839e7a52bca7e9920da918f916ejg NSC_NOCACHE);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg hints |= *dhint;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (hints & NSC_NOCACHE)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) strcpy(rmode, "D");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg else
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) strcpy(rmode, "C");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if ((hints & NSC_FORCED_WRTHRU) || (hints & NSC_WRTHRU))
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) strcpy(wmode, "D");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg else
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) strcpy(wmode, "C");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(DATA_C2, rmode);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(DATA_C2, wmode);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* Output set information */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cd_report(cur);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgnext:
83c4dfe9546fd839e7a52bca7e9920da918f916ejg pre = cur;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur = cur->next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_header() - outputs an appropriate header by referencing the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * global variables dflsgs
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgvoid
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_header()
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int rcount = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (hflags == HEADERS_EXL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if ((linesout % DISPLAY_LINES) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (hflags == HEADERS_BOR)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (linesout != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (hflags & HEADERS_ATT)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (hflags & HEADERS_OUT)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg else
83c4dfe9546fd839e7a52bca7e9920da918f916ejg hflags |= HEADERS_OUT;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (linesout)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf("\n");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* first line header */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (! (dflags & SUMMARY) && dflags != FLAGS) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(VOL_HDR_FMT, " ");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & FLAGS) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(STAT_HDR_FMT, " ");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(STAT_HDR_FMT, " ");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & READ) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int size;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg size = KPS_HDR_SIZE * 2 + HIT_HDR_SIZE;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg center(size, "- read -");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg rcount++;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & WRITE) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int size;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg size = KPS_HDR_SIZE * 2 + HIT_HDR_SIZE;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg center(size, "- write -");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg rcount++;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags != FLAGS)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf("\n");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* second line header */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(VOL_HDR_FMT, "volume");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & FLAGS) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(STAT_HDR_FMT, "rd");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(STAT_HDR_FMT, "wr");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & SUMMARY) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(KPS_HDR_FMT, "ckps");
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam (void) printf(KPS_HDR_FMT, "dkps");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(HIT_HDR_FMT, HIT_HDR_TXT);
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam
83c4dfe9546fd839e7a52bca7e9920da918f916ejg goto out;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & READ) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(KPS_HDR_FMT, "ckps");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(KPS_HDR_FMT, "dkps");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(HIT_HDR_FMT, RHIT_HDR_TXT);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & WRITE) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(KPS_HDR_FMT, "ckps");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(KPS_HDR_FMT, "dkps");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(HIT_HDR_FMT, WHIT_HDR_TXT);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & DESTAGED)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(KPS_HDR_FMT, "dstg");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (dflags & WRCANCEL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(KPS_HDR_FMT, "cwrl");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgout:
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf("\n");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_getstat() - find cache stat by name matching
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * paraemters
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam * char *vn - the volume name to match against
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * returns
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t * - the matching strcture, NULL if not found
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbcstat_t *
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_getstat(char *vn)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *cur, *pre = NULL;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (cur = sdbc_top; cur; ) { /* CSTYLED */
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam char *volname =
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_value(cur->pre_set, SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (SDBC_COMPLETE(cur->collected)) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *next = sdbc_delstat(cur);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (! pre)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur = sdbc_top = next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg else
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur = pre->next = next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg continue;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (strncmp(volname, vn, NAMED_LEN) == 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (cur);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam pre = cur;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur = cur->next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (NULL);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_addstat() - adds a fully populated sdbcstat_t structure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * to the linked list of currently monitored kstats. The structure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * will be added in alphabetical order, using the volume name as the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * key.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - to be added to the list.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgvoid
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_addstat(sdbcstat_t *sdbcstat)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *cur;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_top == NULL) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbc_top = sdbcstat;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam
83c4dfe9546fd839e7a52bca7e9920da918f916ejg for (cur = sdbc_top; cur != NULL; cur = cur->next) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char *cur_vname, *nxt_vname, *tst_vname;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur_vname = kstat_value(cur->pre_set,
83c4dfe9546fd839e7a52bca7e9920da918f916ejg SDBC_CDKSTAT_VOL_NAME);
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam tst_vname = kstat_value(sdbcstat->pre_set,
83c4dfe9546fd839e7a52bca7e9920da918f916ejg SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (strncmp(cur_vname, tst_vname, NAMED_LEN) > 0) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (cur == sdbc_top)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbc_top = sdbcstat;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat->next = cur;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * If we get to the last item in the list, then just
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * add this one to the end
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (cur->next == NULL) {
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam cur->next = sdbcstat;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg nxt_vname = kstat_value(cur->next->pre_set,
83c4dfe9546fd839e7a52bca7e9920da918f916ejg SDBC_CDKSTAT_VOL_NAME);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (strncmp(nxt_vname, tst_vname, NAMED_LEN) > 0) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat->next = cur->next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur->next = sdbcstat;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_delstat() - deallocate memory for the structure being
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * passed in.
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - structure to be deallocated
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * returns
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t * - pointer to the "next" structures in the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * linked list. May be NULL if we are removing the last
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * structure in the linked list.
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbcstat_t *
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_delstat(sdbcstat_t *sdbcstat)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat_t *next = sdbcstat->next;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_free(sdbcstat->pre_set);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_free(sdbcstat->pre_io);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_free(sdbcstat->cur_set);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_free(sdbcstat->cur_io);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg free(sdbcstat);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat = NULL;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (next);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_value_check() - Checks for activity, supports -z switch
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - structure to be checked
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * returns
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 1 - activity
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 0 - no activity
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgint
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliamsdbc_value_check(sdbcstat_t *sdbcstat)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (SDBC_COMPLETE(sdbcstat->collected))
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_READ) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_READ) != 0)
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_WRITE) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_WRITE) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_WRCANCELNS) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (io_value_check(sdbcstat->pre_io->ks_data,
83c4dfe9546fd839e7a52bca7e9920da918f916ejg sdbcstat->cur_io->ks_data) != 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_validate() - validates the structure of the kstats by attempting to
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * lookup fields used by this module
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * kstat_t *ksp - kstat to be examined
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * returns
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 1 - one or more fields missing
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 0 - all fields present
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgint
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_validate(kstat_t *ksp)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (! kstat_value(ksp, SDBC_CDKSTAT_VOL_NAME) ||
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ! kstat_value(ksp, SDBC_CDKSTAT_FAILED) ||
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ! kstat_value(ksp, SDBC_CDKSTAT_CDHINTS) ||
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ! kstat_value(ksp, SDBC_CDKSTAT_CACHE_READ) ||
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ! kstat_value(ksp, SDBC_CDKSTAT_DISK_READ) ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ! kstat_value(ksp, SDBC_CDKSTAT_CACHE_WRITE) ||
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ! kstat_value(ksp, SDBC_CDKSTAT_DISK_WRITE) ||
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ! kstat_value(ksp, SDBC_CDKSTAT_DESTAGED) ||
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam ! kstat_value(ksp, SDBC_CDKSTAT_WRCANCELNS))
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_getvalues() - populates a values structure with data obtained from the
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * kstat
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - pointer to the structure containing the kstats
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcvals_t *vals - pointer to the structure that will receive the values
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * int flags - flags that describe adjustments made to the values
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * returns
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 1 - failure
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * 0 - success
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejgint
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_getvalues(sdbcstat_t *sdbcstat, sdbcvals_t *vals, int flags)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int divisor = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int factors;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg uint64_t hr_etime;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg double etime;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_io_t *cur;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg kstat_io_t *pre;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (sdbcstat == NULL)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (1);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam cur = sdbcstat->cur_io->ks_data;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg pre = sdbcstat->pre_io->ks_data;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg hr_etime = hrtime_delta(pre->rlastupdate, cur->rlastupdate);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg etime = hr_etime / (double)NANOSEC;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* read data */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_read =
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_READ));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->disk_read =
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_READ));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_reads = vals->cache_read + vals->disk_read;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (vals->cache_read == 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->read_hit = 0.0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg else
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->read_hit =
83c4dfe9546fd839e7a52bca7e9920da918f916ejg ((float)vals->cache_read / vals->total_reads) * 100.0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* write data */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_write =
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_CACHE_WRITE));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->disk_write =
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DISK_WRITE));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_writes = vals->cache_write + vals->disk_write;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->destaged =
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_DESTAGED));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (vals->cache_write == 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->write_hit = 0.0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg else
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam vals->write_hit = ((float)vals->cache_write /
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (vals->total_writes - vals->destaged)) * 100.0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* miscellaneous */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->write_cancellations =
83c4dfe9546fd839e7a52bca7e9920da918f916ejg FBA_SIZE(sdbc_getdelta(sdbcstat, SDBC_CDKSTAT_WRCANCELNS));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_cache = vals->cache_read + vals->cache_write;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_disk = vals->disk_read + vals->disk_write;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam /* total cache hit calculation */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_hit = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg factors = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (vals->cache_read != 0) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_hit += vals->read_hit;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg factors++;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (vals->cache_write != 0) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_hit += vals->write_hit;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg factors++;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (vals->cache_hit)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_hit /= (float)factors;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg /* adjustments */
83c4dfe9546fd839e7a52bca7e9920da918f916ejg divisor = 1;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (flags & SDBC_KBYTES)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg divisor *= KILOBYTE;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if ((flags & SDBC_INTAVG) && (etime > 0))
83c4dfe9546fd839e7a52bca7e9920da918f916ejg divisor *= etime;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (divisor != 1) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_read /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->disk_read /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_reads /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->cache_write /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->disk_write /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_writes /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_cache /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->total_disk /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->destaged /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg vals->write_cancellations /= divisor;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (0);
c3b4ae1846dcc50dda26b0cf1a3d787b8077a0ffJerry Gilliam}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg/*
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbc_getdelta() - calculates the difference between two kstat fields
83c4dfe9546fd839e7a52bca7e9920da918f916ejg *
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * parameters
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * sdbcstat_t *sdbcstat - the SDBC stat strcture containing the two fields
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * char *name - the name of the fields
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * returns
83c4dfe9546fd839e7a52bca7e9920da918f916ejg * uint32_t value of the differences adjusted for overflow of the data type
83c4dfe9546fd839e7a52bca7e9920da918f916ejg */
83c4dfe9546fd839e7a52bca7e9920da918f916ejguint32_t
83c4dfe9546fd839e7a52bca7e9920da918f916ejgsdbc_getdelta(sdbcstat_t *sdbcstat, char *name)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg uint32_t *cur_val;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg uint32_t *pre_val;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg pre_val = kstat_value(sdbcstat->pre_set, name);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg cur_val = kstat_value(sdbcstat->cur_set, name);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return (u32_delta(*pre_val, *cur_val));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgvoid
83c4dfe9546fd839e7a52bca7e9920da918f916ejgcenter(int size, char *hdr)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg{
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int lpad = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg int rpad = 0;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg char fmt[10];
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (size == 0)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg return;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (strlen(hdr) < size) {
83c4dfe9546fd839e7a52bca7e9920da918f916ejg lpad = (size - strlen(hdr)) / 2;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg if (lpad * 2 < size)
83c4dfe9546fd839e7a52bca7e9920da918f916ejg lpad++;
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejg rpad = size - (lpad + strlen(hdr));
83c4dfe9546fd839e7a52bca7e9920da918f916ejg }
83c4dfe9546fd839e7a52bca7e9920da918f916ejg
83c4dfe9546fd839e7a52bca7e9920da918f916ejgoutput:
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) sprintf(fmt, "%%%ds%%s%%%ds", lpad, rpad);
83c4dfe9546fd839e7a52bca7e9920da918f916ejg (void) printf(fmt, " ", hdr, " ");
83c4dfe9546fd839e7a52bca7e9920da918f916ejg}
83c4dfe9546fd839e7a52bca7e9920da918f916ejg