/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#include <sys/mdb_modapi.h>
#include <rpc/auth_unix.h>
#include <rpc/auth_des.h>
/* HACK HACK so we can bring in rdc_io.h and friends */
#define nstset_t char
/*
* Walker for an array of rdc_k_info_t structures.
* A global walk is assumed to start at rdc_k_info.
*/
struct rdc_kinfo_winfo {
};
static int
{
int rdc_max_sets;
mdb_warn("failed to read 'rdc_k_info'");
return (WALK_ERR);
}
mdb_warn("failed to read 'rdc_max_sets'");
return (WALK_ERR);
}
return (WALK_NEXT);
}
static int
{
int status;
return (WALK_DONE);
return (WALK_DONE);
wsp->walk_cbdata);
return (status);
}
static void
{
}
/*
* Walker for an array of rdc_u_info_t structures.
* A global walk is assumed to start at rdc_u_info.
*/
struct rdc_uinfo_winfo {
};
static int
{
int rdc_max_sets;
mdb_warn("failed to read 'rdc_u_info'");
return (WALK_ERR);
}
mdb_warn("failed to read 'rdc_max_sets'");
return (WALK_ERR);
}
return (WALK_NEXT);
}
static int
{
int status;
return (WALK_DONE);
return (WALK_DONE);
wsp->walk_cbdata);
return (status);
}
static void
{
}
/*
* Walker for the rdc_if chain.
* A global walk is assumed to start at rdc_if_top.
*/
static int
{
mdb_warn("unable to read 'rdc_if_top'");
return (WALK_ERR);
}
return (WALK_NEXT);
}
static int
{
int status;
return (WALK_DONE);
return (WALK_DONE);
}
wsp->walk_cbdata);
return (status);
}
static void
{
}
/*
* Displays the asynchronous sleep q on the server.
*/
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
while (addr) {
return (DCMD_ERR);
}
}
return (DCMD_OK);
}
/*
* display the header info for the pending diskq requests
*/
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
while (addr) {
return (DCMD_ERR);
}
mdb_printf("iohdr: type %d pos %d qpos %d len %d flag 0x%x"
}
return (DCMD_OK);
}
/*
* Display a krdc->group.
* Requires an address.
*/
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
#ifdef XXXJET
if (DCMD_HDRSPEC(flags)) {
}
#endif
mdb_printf("count: %d %8Twriter: %d %8T flags: %d\n",
if (RDC_IS_MEMQ(group)) {
mdb_printf("queue type: Memory based\n");
} else if (RDC_IS_DISKQ(group)) {
mdb_printf("queue type: Disk based %8Tqstate 0x%x\n",
}
mdb_printf("ra_queue head: 0x%p %8Ttail 0x%p\n",
mdb_printf("ra_queue blocks: %d %8Titems %d\n",
mdb_printf("ra_queue blockhwm: %d itemhwm: %d\n",
mdb_printf("ra_queue hwmhit: %d qfillsleep: %d\n",
mdb_printf("ra_queue throttle: %ld\n",
if (RDC_IS_DISKQ(group)) {
mdb_printf("head: %d %8Tnxtio: %d %8Ttail %d %8Tlastail: %d\n",
mdb_printf("blocks: %d %8Titems %d qfflags 0x%x \n",
mdb_printf("diskq throttle: %ld %8Tflags: %x\n",
mdb_printf("disk queue nitems_hwm: %d %8Tblocks_hwm: %d\n",
mdb_printf("diskqfd: 0x%p %8Tdisqrsrv: %d lastio: 0x%p\n",
mdb_printf("outstanding req %d iohdrs 0x%p iohdrs_last 0x%p\n",
}
mdb_inc_indent(4);
0, 0);
}
mdb_dec_indent(4);
return (DCMD_OK);
}
/*
* Display a krdc->lsrv.
* Requires an address.
*/
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
return (DCMD_ERR);
}
mdb_printf("ri_addr: 0x%p %8Tsecdata 0x%p\n",
return (DCMD_OK);
}
/*
* Display a rdc_if_t.
* Requires an address.
*/
static int
{
if (!(flags & DCMD_ADDRSPEC)) {
/*
* paranoid mode on: qualify walker name with module name
* using '`' syntax.
*/
if (mdb_walk_dcmd("rdc`rdc_if",
mdb_warn("failed to walk 'rdc_if'");
return (DCMD_ERR);
}
return (DCMD_OK);
}
return (DCMD_ERR);
}
mdb_printf("if_addr: 0x%p %8Tr_ifaddr 0x%p\n",
mdb_printf("if_down: %d %8Tprimary %d %8Tsecondary %d\n",
mdb_printf("\n");
return (DCMD_OK);
}
/*
* Display a rdc_buf_t
* Requires an address.
*/
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
mdb_printf("nsc_buf fd: 0x%p %8Tvec 0x%p\n",
mdb_printf("nsc_buf pos: %d %8Tlen %d\n",
mdb_printf("nsc_buf flag: 0x%x %8Terror %d\n",
mdb_printf("anon_buf : 0x%p %8Tfd 0x%p %8Tbufp 0x%p\n",
mdb_printf("vsize: %d %8Tflags 0x%x\n",
return (DCMD_OK);
}
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
mdb_printf("rdc_aio next: %p %8T nsc_buf: %p %8T nsc_qbuf %p\n",
mdb_printf("pos: %d len: %d qpos: %d flag: %x iostatus: %d index: %d"
return (DCMD_OK);
}
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
mdb_printf("dset id: %d %8T dset inuse: %d %8T dset delpend: %d\n",
mdb_printf("dset items: %d %8T dset head %p %8T dset tail %p \n",
return (DCMD_OK);
}
/*
* Display a single rdc_k_info structure.
* If called with no address, performs a global walk of all rdc_k_info.
* -a : all (i.e. display all devices, even if disabled
* -v : verbose
*/
{ NULL, 0, 0 }
};
static int
{
int dev_t_chars;
return (DCMD_USAGE);
if (!(flags & DCMD_ADDRSPEC)) {
/*
* paranoid mode on: qualify walker name with module name
* using '`' syntax.
*/
if (mdb_walk_dcmd("rdc`rdc_kinfo",
mdb_warn("failed to walk 'rdc_kinfo'");
return (DCMD_ERR);
}
return (DCMD_OK);
}
if (DCMD_HDRSPEC(flags)) {
}
return (DCMD_ERR);
}
mdb_warn("failed to read 'rdc_u_info'");
return (DCMD_ERR);
}
return (DCMD_OK);
mdb_printf(" disable pending");
mdb_printf(" async");
mdb_printf(" resume pending");
mdb_printf(" busywait");
#ifdef RDC_SMALLIO
mdb_printf(" smallio");
#endif
mdb_printf("\n");
if (!v_opt)
return (DCMD_OK);
/*
* verbose - print the rest of the structure as well.
*/
mdb_inc_indent(4);
mdb_printf("index: %d %8Trindex: %d %8Tbusyc: %d %8Tmaxfbas: %d\n",
mdb_printf("info_dev: 0x%p %8Tiodev: 0x%p %8T %8T vers %d\n",
mdb_printf("group: 0x%p %8Tgroup_next: 0x%p\n",
mdb_printf("group lock: 0x%p aux_state: %d\n",
mdb_inc_indent(4);
}
mdb_dec_indent(4);
mdb_printf("servinfo: 0x%p %8Tintf: 0x%p\nbitmap: 0x%p %8T"
"bitmap_ref: 0x%p\n",
mdb_printf("bmap_size: %d %8Tbmaprsrv: %d%8T bmap_write: %d\n",
mdb_printf("net_dataset: 0x%p %8Tdisk_status: %d %8T\n",
krdc->multi_next);
mdb_dec_indent(4);
return (DCMD_OK);
}
static int
{
int dev_t_chars;
int rdcflags;
return (DCMD_USAGE);
if (!(flags & DCMD_ADDRSPEC)) {
/*
* paranoid mode on: qualify walker name with module name
* using '`' syntax.
*/
if (mdb_walk_dcmd("rdc`rdc_uinfo",
mdb_warn("failed to walk 'rdc_uinfo'");
return (DCMD_ERR);
}
return (DCMD_OK);
}
if (DCMD_HDRSPEC(flags)) {
}
return (DCMD_ERR);
}
mdb_warn("failed to read 'rdc_k_info'");
return (DCMD_ERR);
}
return (DCMD_OK);
mdb_warn("failed to read 'rdc_k_info1'");
return (DCMD_ERR);
}
mdb_warn("failed to read group info ");
return (DCMD_ERR);
}
}
if (rdcflags & RDC_PRIMARY)
mdb_printf(" primary");
mdb_printf(" slave");
if (rdcflags & RDC_SYNCING)
mdb_printf(" syncing");
if (rdcflags & RDC_SYNC_NEEDED)
mdb_printf(" sync_need");
if (rdcflags & RDC_RSYNC_NEEDED)
mdb_printf(" rsync_need");
if (rdcflags & RDC_LOGGING)
mdb_printf(" logging");
if (rdcflags & RDC_QUEUING)
mdb_printf(" queuing");
if (rdcflags & RDC_DISKQ_FAILED)
mdb_printf(" diskq failed");
if (rdcflags & RDC_VOL_FAILED)
mdb_printf(" vol failed");
if (rdcflags & RDC_BMP_FAILED)
mdb_printf(" bmp failed");
mdb_printf(" async");
if (rdcflags & RDC_CLR_AFTERSYNC)
mdb_printf(" clr_bitmap_aftersync");
if (dqp) {
mdb_printf(" noblock");
}
#ifdef RDC_SMALLIO
if (rdcflags & RDC_SMALLIO)
mdb_printf(" smallio");
#endif
mdb_printf("\n");
if (!v_opt)
return (DCMD_OK);
/*
* verbose - print the rest of the structure as well.
*/
mdb_inc_indent(4);
mdb_printf("\n");
mdb_printf("primary: %s %8Tfile: %s \nbitmap: %s ",
mdb_printf("secondary: %s %8Tfile: %s \nbitmap: %s ",
mdb_printf("sflags: %d %8Tbflags: %d%8T mflags: %d\n",
mdb_printf("index: %d %8Tsync_pos: %d%8T vsize: %d\n",
mdb_printf("setid: %d %8Tbits set: %d %8Tautosync: %d\n",
mdb_printf("maxqfbas: %d %8Tmaxqitems: %d\n",
mdb_printf("group: %s %8TdirectIO: %s\n",
if (dqp) {
} else {
mdb_printf("\n");
}
mdb_printf("\n");
mdb_dec_indent(4);
mdb_printf("\n");
return (DCMD_OK);
}
/*ARGSUSED*/
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
mdb_inc_indent(4);
mdb_printf("id_cache_dev:\n");
mdb_inc_indent(4);
mdb_printf("bi_fd: 0x%p %8Tbi_iodev: 0x%p %8Tbi_krdc 0x%p\n",
mdb_printf("bi_rsrv: %d %8Tbi_orsrv: %d %8Tbi_failed: %d %8T\n"
mdb_dec_indent(4);
mdb_printf("id_cache_dev:\n");
mdb_inc_indent(4);
mdb_printf("bi_fd: 0x%p %8Tbi_iodev: 0x%p %8Tbi_krdc 0x%p\n",
mdb_printf("bi_rsrv: %d %8Tbi_orsrv: %d %8Tbi_failed: %d %8T\n"
mdb_dec_indent(4);
mdb_printf("id_sets: %d %8Tid_release: %d %8Tid_flag %d",
mdb_printf("closing");
}
mdb_printf("\n");
mdb_dec_indent(4);
return (DCMD_OK);
}
/*
* Display general sv module information.
*/
mdb_dec_indent(4); \
return (DCMD_ERR); \
} \
/*ARGSUSED*/
static int
{
if (argc != 0)
return (DCMD_USAGE);
mdb_warn("unable to read 'sndr_major_rev'");
return (DCMD_ERR);
}
mdb_warn("unable to read 'sndr_minor_rev'");
return (DCMD_ERR);
}
mdb_warn("unable to read 'sndr_micro_rev'");
return (DCMD_ERR);
}
mdb_warn("unable to read 'sndr_baseline_rev'");
return (DCMD_ERR);
}
mdb_printf("Remote Mirror module version: kernel %d.%d.%d.%d; "
mdb_inc_indent(4);
mdb_dec_indent(4);
return (DCMD_OK);
}
static int
{
int rc;
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
mdb_warn("failed to read 'rdc_u_info'");
return (DCMD_ERR);
}
return (rc);
}
static int
{
int rc;
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_ERR);
}
mdb_warn("failed to read 'rdc_k_info'");
return (DCMD_ERR);
}
return (rc);
}
#ifdef DEBUG
/*
* This routine is used to set the seq field in the rdc_kinfo->group
* structure. Used to test that the queue code handles the integer
* overflow correctly.
* Takes two arguments index and value.
* The index is the index into the kinfo structure array and
* the value is the new value to set into the seq field.
*/
/*ARGSUSED*/
static int
{
int index;
if (argc != 2) {
mdb_warn("must have two arguments, index and value\n");
return (DCMD_ERR);
}
/*
* Find out where in memory the seq field.
* The structure offset first.
*/
mdb_warn("failed to read 'rdc_k_info'");
return (DCMD_ERR);
}
sizeof (rdc_group_t *)) {
mdb_warn("failed to fetch the group structure for set %d\n",
index);
return (DCMD_ERR);
}
return (DCMD_ERR);
}
return (DCMD_OK);
}
/*
* This routine is used to set the seqack field in the rdc_kinfo->group
* structure. Used to test that the queue code handles the integer
* overflow correctly.
* Takes two arguments index and value.
* The index is the index into the kinfo structure array and
* the value is the new value to set into the seqack field.
*/
/*ARGSUSED*/
static int
{
int index;
if (argc != 2) {
mdb_warn("must have two arguments, index and value\n");
return (DCMD_ERR);
}
/*
* Find out where in memory the seqack field.
* The structure offset first.
*/
mdb_warn("failed to read 'rdc_k_info'");
return (DCMD_ERR);
}
sizeof (rdc_group_t *)) {
mdb_warn("failed to fetch the group structure for set %d\n",
index);
return (DCMD_ERR);
}
return (DCMD_ERR);
}
return (DCMD_OK);
}
/*
* random define printing stuff, just does the define, and print the result
*/
/*ARGSUSED*/
static int
{
int num;
if (argc < 1) {
mdb_warn("must have an argument\n");
return (DCMD_ERR);
}
return (DCMD_OK);
}
/*ARGSUSED*/
static int
{
int num;
if (argc < 1) {
mdb_warn("must have an argument\n");
return (DCMD_ERR);
}
return (DCMD_OK);
}
static int
{
int st;
int i, num;
unsigned char *bmap;
unsigned char *bmaddr;
int bmsize;
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
if (argc < 1) {
mdb_warn("must have an argument\n");
return (DCMD_ERR);
}
return (DCMD_ERR);
}
mdb_warn("failed to read bitmap");
return (DCMD_ERR);
}
return (DCMD_OK);
}
static int
{
unsigned char *brefbyte;
unsigned int *brefint;
void *bradder;
int brsize;
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
if (argc < 1) {
mdb_warn("must have an argument\n");
return (DCMD_ERR);
}
return (DCMD_ERR);
}
sizeof (*refops)) {
return (DCMD_ERR);
}
if (refcntsize == sizeof (unsigned char)) {
mdb_warn("failed to read bitmap");
return (DCMD_ERR);
}
} else {
mdb_warn("failed to read bitmap");
return (DCMD_ERR);
}
}
if (refcntsize == sizeof (unsigned char))
else
i);
return (DCMD_OK);
}
/*ARGSUSED*/
static int
{
int num;
if (argc < 1) {
mdb_warn("must have an argument\n");
return (DCMD_ERR);
}
return (DCMD_OK);
}
/*ARGSUSED*/
static int
{
int num;
if (argc < 1) {
mdb_warn("must have an argument\n");
return (DCMD_ERR);
}
return (DCMD_OK);
}
static char *
{
int i;
for (i = 31; i >= 0; i--) {
bitstr[i] = '1';
} else {
bitstr[i] = '0';
}
bitval *= 2;
}
return (bitstr);
}
/*ARGSUSED*/
static int
{
if (argc < 2) {
mdb_warn("must have 2 args (pos, len)\n");
return (DCMD_ERR);
}
if (len <= 0) {
mdb_printf("non positive len specified");
return (DCMD_ERR);
}
mdb_printf("len out of range, 32 bit bitmask");
return (DCMD_ERR);
}
st++;
}
return (DCMD_OK);
}
/*
* Dump the bitmap of the krdc structure indicated by the index
* argument. Used by the ZatoIchi tests.
*/
/*ARGSUSED*/
static int
{
int index;
unsigned char *data;
int bmapsize;
int i;
int st = 0;
int en = 0;
if (argc < 1) {
mdb_warn("must have index argument\n");
return (DCMD_ERR);
}
i = argc;
if (i == 3) {
i--;
}
if (i == 2) {
}
/*
* Find out where in memory the rdc_k_kinfo array starts
*/
mdb_warn("failed to read 'rdc_k_info'");
return (DCMD_ERR);
}
!= sizeof (bmapsize)) {
return (DCMD_ERR);
}
!= sizeof (bmapdata)) {
return (DCMD_ERR);
}
mdb_warn("failed to read the bitmap data\n");
return (DCMD_ERR);
}
mdb_printf("bitmap data address 0x%p bitmap size %d\n"
mdb_warn("offset is out of range st %d bms %d en %d",
return (DCMD_ERR);
}
st /= 8;
en /= 8;
if ((i % 16) == 15) {
mdb_printf(" fbas: %x - %x\n", s, e);
}
}
mdb_printf("\n");
return (DCMD_OK);
}
/*
* dump the bitmap reference count
*/
/*ARGSUSED*/
static int
{
int index;
unsigned char *data;
int bmapsize;
int i;
int st = 0;
int en = 0;
if (argc < 1) {
mdb_warn("must have index argument\n");
return (DCMD_ERR);
}
i = argc;
if (i == 3) {
i--;
}
if (i == 2) {
}
/*
* Find out where in memory the rdc_k_kinfo array starts
*/
mdb_warn("failed to read 'rdc_k_info'");
return (DCMD_ERR);
}
!= sizeof (bmapsize)) {
return (DCMD_ERR);
}
bmapsize *= 8;
!= sizeof (bmapdata)) {
return (DCMD_ERR);
}
mdb_warn("failed to read the bitmap data\n");
return (DCMD_ERR);
}
mdb_printf("bitmap data address 0x%p bitmap size %d\n"
mdb_warn("offset is out of range");
}
if ((i % 16) == 15) {
int s = LOG_TO_FBA_NUM(i-15);
mdb_printf(" fbas: 0x%x - 0x%x \n", s, e);
}
}
mdb_printf("\n");
return (DCMD_OK);
}
static int
{
mdb_printf("\nRDC bitmap info\n");
mdb_printf("RDC bitmap reference count info\n");
return (DCMD_OK);
}
#endif
/*
* MDB module linkage information:
*/
#ifdef DEBUG
#endif
{ NULL }
};
{ "rdc_kinfo", "walk the rdc_k_info array",
{ "rdc_uinfo", "walk the rdc_u_info array",
{ "rdc_if", "walk rdc_if chain",
{ NULL }
};
};
const mdb_modinfo_t *
_mdb_init(void)
{
return (&modinfo);
}