10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * CDDL HEADER START 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * The contents of this file are subject to the terms of the 51623Stw21770 * Common Development and Distribution License (the "License"). 61623Stw21770 * You may not use this file except in compliance with the License. 70Sstevel@tonic-gate * 80Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 100Sstevel@tonic-gate * See the License for the specific language governing permissions 110Sstevel@tonic-gate * and limitations under the License. 120Sstevel@tonic-gate * 130Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 140Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 160Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 170Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 180Sstevel@tonic-gate * 190Sstevel@tonic-gate * CDDL HEADER END 200Sstevel@tonic-gate */ 217563SPrasad.Singamsetty@Sun.COM 220Sstevel@tonic-gate /* 23*12678SJames.Hall@Sun.COM * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved. 240Sstevel@tonic-gate */ 250Sstevel@tonic-gate 260Sstevel@tonic-gate #ifndef _SYS_MDVAR_H 270Sstevel@tonic-gate #define _SYS_MDVAR_H 280Sstevel@tonic-gate 290Sstevel@tonic-gate #include <sys/types.h> 300Sstevel@tonic-gate #include <sys/kmem.h> 310Sstevel@tonic-gate #include <sys/mkdev.h> 320Sstevel@tonic-gate #include <sys/param.h> 330Sstevel@tonic-gate #include <sys/systm.h> 340Sstevel@tonic-gate #include <sys/t_lock.h> 350Sstevel@tonic-gate #include <sys/open.h> 360Sstevel@tonic-gate #include <sys/devops.h> 370Sstevel@tonic-gate #include <sys/modctl.h> 380Sstevel@tonic-gate #ifdef DEBUG 390Sstevel@tonic-gate #include <sys/thread.h> 400Sstevel@tonic-gate #endif 410Sstevel@tonic-gate #include <sys/kstat.h> 420Sstevel@tonic-gate #include <sys/efi_partition.h> 430Sstevel@tonic-gate #include <sys/byteorder.h> 440Sstevel@tonic-gate #include <sys/door.h> 450Sstevel@tonic-gate 460Sstevel@tonic-gate #include <sys/lvm/mdmn_commd.h> 470Sstevel@tonic-gate #include <sys/lvm/mdio.h> 480Sstevel@tonic-gate #include <sys/lvm/md_mdiox.h> 490Sstevel@tonic-gate #include <sys/lvm/md_mddb.h> 500Sstevel@tonic-gate #include <sys/lvm/md_notify.h> 510Sstevel@tonic-gate 520Sstevel@tonic-gate #ifdef __cplusplus 530Sstevel@tonic-gate extern "C" { 540Sstevel@tonic-gate #endif 550Sstevel@tonic-gate 560Sstevel@tonic-gate /* 570Sstevel@tonic-gate * defaults 580Sstevel@tonic-gate */ 590Sstevel@tonic-gate #define NMD_DEFAULT 128 /* number of metadevices */ 600Sstevel@tonic-gate #define MD_NOPS 25 /* number of misc modules */ 610Sstevel@tonic-gate #define MAXBOOTLIST 64 620Sstevel@tonic-gate 630Sstevel@tonic-gate /* 640Sstevel@tonic-gate * Needed for backwards-compatibility with metadevices created under 650Sstevel@tonic-gate * 2.6 or earlier. Back then, a krwlock_t was twelve bytes. More 660Sstevel@tonic-gate * recently, it's four bytes. Since these get included in structures 670Sstevel@tonic-gate * written out to disk, we have to make sure we're using the largest 680Sstevel@tonic-gate * size. Things will get interesting if krwlock_t ever gets bigger 690Sstevel@tonic-gate * than twelve bytes. 700Sstevel@tonic-gate */ 710Sstevel@tonic-gate 720Sstevel@tonic-gate typedef union _md_krwlock { 730Sstevel@tonic-gate krwlock_t lock; 740Sstevel@tonic-gate struct { 750Sstevel@tonic-gate void *_opaque[3]; 760Sstevel@tonic-gate } xx; 770Sstevel@tonic-gate } md_krwlock_t; 780Sstevel@tonic-gate 790Sstevel@tonic-gate typedef struct { 800Sstevel@tonic-gate kmutex_t md_io_mx; /* counter mutex */ 810Sstevel@tonic-gate kcondvar_t md_io_cv; /* ioctl wait on if draining */ 820Sstevel@tonic-gate long io_cnt; /* number of I/Os */ 830Sstevel@tonic-gate long io_state; /* !0 if waiting on zero */ 840Sstevel@tonic-gate } md_set_io_t; 850Sstevel@tonic-gate 860Sstevel@tonic-gate typedef enum set_iostate { 870Sstevel@tonic-gate MD_SET_ACTIVE = 1, 880Sstevel@tonic-gate MD_SET_RELEASE = 2 890Sstevel@tonic-gate }set_iostate_t; 900Sstevel@tonic-gate 910Sstevel@tonic-gate /* 920Sstevel@tonic-gate * for md_dev64_t translation 930Sstevel@tonic-gate */ 940Sstevel@tonic-gate struct md_xlate_table { 950Sstevel@tonic-gate dev32_t mini_devt; 960Sstevel@tonic-gate dev32_t targ_devt; 970Sstevel@tonic-gate }; 980Sstevel@tonic-gate 990Sstevel@tonic-gate extern struct md_xlate_table *md_tuple_table; 1000Sstevel@tonic-gate 1010Sstevel@tonic-gate /* 1020Sstevel@tonic-gate * for major number translation 1030Sstevel@tonic-gate */ 1040Sstevel@tonic-gate 1050Sstevel@tonic-gate struct md_xlate_major_table { 1060Sstevel@tonic-gate char *drv_name; 1070Sstevel@tonic-gate major_t targ_maj; 1080Sstevel@tonic-gate }; 1090Sstevel@tonic-gate 1100Sstevel@tonic-gate extern struct md_xlate_major_table *md_major_tuple_table; 1110Sstevel@tonic-gate 1120Sstevel@tonic-gate extern int md_tuple_length; 1130Sstevel@tonic-gate extern uint_t md_majortab_len; 1140Sstevel@tonic-gate extern int md_in_upgrade; 1150Sstevel@tonic-gate 1160Sstevel@tonic-gate extern md_mn_nodeid_t md_mn_mynode_id; 1170Sstevel@tonic-gate 1180Sstevel@tonic-gate #define MD_UPGRADE (md_in_upgrade == 1) 1190Sstevel@tonic-gate 1200Sstevel@tonic-gate /* 1210Sstevel@tonic-gate * Flags used during upgrade: 1220Sstevel@tonic-gate * 1230Sstevel@tonic-gate * md_keep_repl_state flag means that mddb should be kept in the format 1240Sstevel@tonic-gate * that was found on disk (non-device id format vs. device id format). 1250Sstevel@tonic-gate * This is used during the upgrade process when install is probing 1260Sstevel@tonic-gate * for root disks so that the user can choose the one to be upgraded. 1270Sstevel@tonic-gate * 1280Sstevel@tonic-gate * md_devid_destroy flag is used to destroy device ids stored in the 1290Sstevel@tonic-gate * metadevice state database (mddb). 1300Sstevel@tonic-gate * 1310Sstevel@tonic-gate * The md_devid_destroy flag is to be used only in a catastrophic failure 1320Sstevel@tonic-gate * case. An example of this would be if a user upgrades firmware on all 1330Sstevel@tonic-gate * disks where this causes the disks to now have different device id's. 1340Sstevel@tonic-gate * The user would not be able to boot a mirror'd root filesystem since the 1350Sstevel@tonic-gate * system would recognize none of the device id's stored in the mddb. 1360Sstevel@tonic-gate * This flag would destroy all device id information stored in the mddb and 1370Sstevel@tonic-gate * if the md_keep_repl_state flag was not set, the mddb would be reconverted 1380Sstevel@tonic-gate * to device id format on SLVM startup and all of the device id 1390Sstevel@tonic-gate * information would be regenerated. 1400Sstevel@tonic-gate * 1410Sstevel@tonic-gate * If the md_devid_destroy flag is set and the md_keep_repl_state flag is 1420Sstevel@tonic-gate * set, the mddb's would have their device id information destroyed and 1430Sstevel@tonic-gate * would be left in non-devid format since the device id information would 1440Sstevel@tonic-gate * not be regenerated. 1450Sstevel@tonic-gate * 1460Sstevel@tonic-gate * This flag is not documented anywhere and is only to be used as a last 1470Sstevel@tonic-gate * resort as in the described case or if a device driver has a bug where 1480Sstevel@tonic-gate * device id's are found to not be unique. If device id's aren't unique, 1490Sstevel@tonic-gate * the user could run without device id's until a patch is released for 1500Sstevel@tonic-gate * that driver. 1510Sstevel@tonic-gate */ 1520Sstevel@tonic-gate extern int md_keep_repl_state; 1530Sstevel@tonic-gate extern int md_devid_destroy; 1540Sstevel@tonic-gate extern int mdmn_door_did; 1550Sstevel@tonic-gate #ifdef _KERNEL 1560Sstevel@tonic-gate extern door_handle_t mdmn_door_handle; 1570Sstevel@tonic-gate #endif /* _KERNEL */ 1580Sstevel@tonic-gate 1590Sstevel@tonic-gate /* 1600Sstevel@tonic-gate * An io_lock mechanism for raid, the MD_UL_XXXX bits are used for 1610Sstevel@tonic-gate * convenience. 1620Sstevel@tonic-gate */ 1630Sstevel@tonic-gate typedef struct md_io_lock { 1640Sstevel@tonic-gate ulong_t io_readercnt; /* number of unit readers */ 1650Sstevel@tonic-gate ulong_t io_wanabecnt; /* # pending on becoming unit writer */ 1660Sstevel@tonic-gate ulong_t io_lock; 1670Sstevel@tonic-gate void *io_list_front; 1680Sstevel@tonic-gate void *io_list_back; 1690Sstevel@tonic-gate kmutex_t io_mx; 1700Sstevel@tonic-gate kcondvar_t io_cv; 1710Sstevel@tonic-gate kmutex_t io_list_mutex; /* list of waiting io */ 1720Sstevel@tonic-gate kthread_id_t io_owner; /* writer thread */ 1730Sstevel@tonic-gate } md_io_lock_t; 1740Sstevel@tonic-gate 1750Sstevel@tonic-gate /* 1760Sstevel@tonic-gate * The following flags are in un_flag field of mdc_unit struct. 1770Sstevel@tonic-gate */ 1780Sstevel@tonic-gate #define MD_LABELED 0x1 /* First sector of the metadevice is a label */ 1790Sstevel@tonic-gate #define MD_EFILABEL 0x2 /* This md has an EFI label and no vtoc */ 1800Sstevel@tonic-gate 1810Sstevel@tonic-gate /* 1820Sstevel@tonic-gate * This is the number of bytes a DKIOCGETEFI ioctl returns 1830Sstevel@tonic-gate * For now it's one time the header and once the size for a partition info 1840Sstevel@tonic-gate */ 1850Sstevel@tonic-gate #define MD_EFI_LABEL_SIZE (sizeof (efi_gpt_t) + sizeof (efi_gpe_t)) 1860Sstevel@tonic-gate 1870Sstevel@tonic-gate /* This is the number of bytes consumed by efi_gpe_PartitionName */ 1880Sstevel@tonic-gate #define MD_EFI_PARTNAME_BYTES (EFI_PART_NAME_LEN * sizeof (ushort_t)) 1890Sstevel@tonic-gate 1900Sstevel@tonic-gate typedef enum hs_cmds { 1910Sstevel@tonic-gate HS_GET, HS_FREE, HS_BAD, HSP_INCREF, HSP_DECREF, HS_MKDEV 1920Sstevel@tonic-gate } hs_cmds_t; 1930Sstevel@tonic-gate 1940Sstevel@tonic-gate typedef struct md_link { 1950Sstevel@tonic-gate struct md_link *ln_next; 1960Sstevel@tonic-gate set_t ln_setno; 1970Sstevel@tonic-gate uint_t ln_id; 1980Sstevel@tonic-gate } md_link_t; 1990Sstevel@tonic-gate 2000Sstevel@tonic-gate typedef struct mdi_unit { 2010Sstevel@tonic-gate md_link_t ui_link; 2020Sstevel@tonic-gate ulong_t ui_readercnt; /* number of unit readers */ 2030Sstevel@tonic-gate ulong_t ui_wanabecnt; /* # pending on becoming unit writer */ 2040Sstevel@tonic-gate ulong_t ui_lock; 2050Sstevel@tonic-gate kmutex_t ui_mx; 2060Sstevel@tonic-gate kcondvar_t ui_cv; 2070Sstevel@tonic-gate int ui_opsindex; 2080Sstevel@tonic-gate uint_t ui_ocnt[OTYPCNT]; /* open counts */ 2090Sstevel@tonic-gate md_io_lock_t *ui_io_lock; /* pointer to io lock */ 2100Sstevel@tonic-gate kstat_t *ui_kstat; /* kernel statistics */ 2110Sstevel@tonic-gate kthread_id_t ui_owner; /* writer thread */ 2120Sstevel@tonic-gate uint_t ui_tstate; /* transient state bits */ 2130Sstevel@tonic-gate uint_t ui_capab; /* Capability bits supported */ 2140Sstevel@tonic-gate } mdi_unit_t; 2150Sstevel@tonic-gate 2160Sstevel@tonic-gate /* 2170Sstevel@tonic-gate * Following are used with ui_lock 2180Sstevel@tonic-gate * which is in the unit incore structure. 2190Sstevel@tonic-gate */ 2200Sstevel@tonic-gate #define MD_UL_WRITER 0x0001 /* Stall all new strategy calls */ 2210Sstevel@tonic-gate #define MD_UL_WANABEWRITER 0x0002 2220Sstevel@tonic-gate #define MD_UL_OPENORCLOSE 0x0004 2230Sstevel@tonic-gate 2240Sstevel@tonic-gate #define MD_UL_OPEN 0x0008 /* unit is open */ 2250Sstevel@tonic-gate #define MD_UL_EXCL 0x0010 /* unit is open exclusively */ 2260Sstevel@tonic-gate 2270Sstevel@tonic-gate /* 2280Sstevel@tonic-gate * The softpart open code may do an I/O to validate the watermarks 2290Sstevel@tonic-gate * and should hold no open locks during this I/O. So, mark the unit 2300Sstevel@tonic-gate * as OPENINPROGRESS and drop the locks. This will keep any other 2310Sstevel@tonic-gate * softpart open's waiting until the validate has completed. 2320Sstevel@tonic-gate */ 2330Sstevel@tonic-gate #define MD_UL_OPENINPROGRESS 0x0020 /* Open in Progress */ 2340Sstevel@tonic-gate 2350Sstevel@tonic-gate /* 2360Sstevel@tonic-gate * Following are used with ui_tstate to specify any transient states which 2370Sstevel@tonic-gate * occur during metadevice operation. These are not written to the metadb as 2380Sstevel@tonic-gate * they do not represent a failure of the underlying metadevice. 2390Sstevel@tonic-gate * Transient errors are stored in the lower 16 bits and other transient 2400Sstevel@tonic-gate * state is stored in the upper 16 bits. 2410Sstevel@tonic-gate * MD_NOTOPENABLE should contain all the states that are set prior to an 2420Sstevel@tonic-gate * open (by snarf) and that indicate that a metadevice cannot be opened. 2430Sstevel@tonic-gate */ 2440Sstevel@tonic-gate #define MD_DEV_ERRORED 0x0000ffff /* ui_tstate error bits */ 2450Sstevel@tonic-gate #define MD_EOF_METADEVICE 0x00000001 /* EOF'd metadevice */ 2460Sstevel@tonic-gate #define MD_64MD_ON_32KERNEL 0x00000002 /* 64bit metadev on 32bit kernel */ 2470Sstevel@tonic-gate #define MD_INACCESSIBLE 0x00000004 /* metadevice unavailable */ 2480Sstevel@tonic-gate #define MD_RETRYING 0x00010000 /* retrying errored failfast I/O */ 2490Sstevel@tonic-gate #define MD_OPENLOCKED 0x00020000 /* MN: open locked before removing */ 2500Sstevel@tonic-gate #define MD_ERR_PENDING 0x00040000 /* MN: error pending */ 2510Sstevel@tonic-gate #define MD_ABR_CAP 0x00080000 /* MN: Application Based Recovery */ 2520Sstevel@tonic-gate #define MD_DMR_CAP 0x00100000 /* MN: Directed Mirror Read */ 2530Sstevel@tonic-gate #define MD_RELEASE_IOERR_DONE 0x00200000 /* ioerr console message done */ 2540Sstevel@tonic-gate #define MD_RESYNC_NOT_DONE 0x00400000 /* resync not done yet */ 2550Sstevel@tonic-gate 2560Sstevel@tonic-gate /* A metadevice cannot be opened when these states are set */ 2570Sstevel@tonic-gate #define MD_NOTOPENABLE (MD_EOF_METADEVICE|MD_64MD_ON_32KERNEL) 2580Sstevel@tonic-gate 2590Sstevel@tonic-gate typedef struct md_ioctl_lock { 2600Sstevel@tonic-gate int l_flags; /* locks held */ 2610Sstevel@tonic-gate mdi_unit_t *l_ui; /* unit for which lock is held */ 2620Sstevel@tonic-gate } md_ioctl_lock_t; 2630Sstevel@tonic-gate 2640Sstevel@tonic-gate #define MD_MASTER_DROPPED 0x0001 2650Sstevel@tonic-gate #define MD_READER_HELD 0x0002 2660Sstevel@tonic-gate #define MD_WRITER_HELD 0x0004 2670Sstevel@tonic-gate #define MD_IO_HELD 0x0008 2680Sstevel@tonic-gate #define MD_ARRAY_READER 0x0010 2690Sstevel@tonic-gate #define MD_ARRAY_WRITER 0x0020 2700Sstevel@tonic-gate #define STALE_OK 0x0100 2710Sstevel@tonic-gate #define NO_OLD 0x0200 2720Sstevel@tonic-gate #define NO_LOCK 0x0400 2730Sstevel@tonic-gate #define MD_MT_IOCTL 0x80000 /* MD_GBL_IOCTL_LOCK not set */ 2740Sstevel@tonic-gate #define IOLOCK md_ioctl_lock_t 2750Sstevel@tonic-gate 2760Sstevel@tonic-gate #define WR_LOCK MD_WRITER_HELD 2770Sstevel@tonic-gate #define RD_LOCK MD_READER_HELD | STALE_OK 2780Sstevel@tonic-gate #define ARRAY_WRITER MD_ARRAY_WRITER 2790Sstevel@tonic-gate #define ARRAY_READER MD_ARRAY_READER 2800Sstevel@tonic-gate #define WRITERS MD_WRITER_HELD | MD_IO_HELD | MD_ARRAY_WRITER 2810Sstevel@tonic-gate #define READERS RD_LOCK | MD_ARRAY_READER 2820Sstevel@tonic-gate 2830Sstevel@tonic-gate #define IOLOCK_RETURN_IOCTLEND(code, lock) \ 2840Sstevel@tonic-gate md_ioctl_lock_exit((code), (lock)->l_flags, (lock)->l_ui, TRUE) 2850Sstevel@tonic-gate 2860Sstevel@tonic-gate #define IOLOCK_RETURN(code, lock) \ 2870Sstevel@tonic-gate md_ioctl_lock_exit((code), (lock)->l_flags, (lock)->l_ui, FALSE) 2880Sstevel@tonic-gate 2890Sstevel@tonic-gate #define IOLOCK_RETURN_RELEASE(code, lock) \ 2900Sstevel@tonic-gate md_ioctl_releaselocks((code), (lock)->l_flags, (lock)->l_ui) 2910Sstevel@tonic-gate 2920Sstevel@tonic-gate #define IOLOCK_RETURN_REACQUIRE(lock) \ 2930Sstevel@tonic-gate md_ioctl_reacquirelocks((lock)->l_flags, (lock)->l_ui) 2940Sstevel@tonic-gate 2950Sstevel@tonic-gate #define IOLOCK_INIT(lock) bzero((caddr_t)(lock), sizeof (*(lock))) 2960Sstevel@tonic-gate /* 2970Sstevel@tonic-gate * checks to be sure locks are held 2980Sstevel@tonic-gate */ 2990Sstevel@tonic-gate #define UNIT_WRITER_HELD(un) \ 3000Sstevel@tonic-gate (MDI_UNIT(MD_SID(un))->ui_lock & MD_UL_WRITER) 3010Sstevel@tonic-gate #define UNIT_READER_HELD(un) \ 3020Sstevel@tonic-gate (MDI_UNIT(MD_SID(un))->ui_readercnt != 0) 3030Sstevel@tonic-gate #define IO_WRITER_HELD(un) \ 3040Sstevel@tonic-gate (MDI_UNIT(MD_SID(un))->ui_io_lock->io_lock & MD_UL_WRITER) 3050Sstevel@tonic-gate #define IO_READER_HELD(un) \ 3060Sstevel@tonic-gate (MDI_UNIT(MD_SID(un))->ui_io_lock->io_readercnt != 0) 3070Sstevel@tonic-gate 3080Sstevel@tonic-gate #ifdef DEBUG 3090Sstevel@tonic-gate #define STAT_INC(statvar) \ 3100Sstevel@tonic-gate statvar++ 3110Sstevel@tonic-gate #define STAT_DEC(statvar) \ 3120Sstevel@tonic-gate statvar-- 3130Sstevel@tonic-gate #define STAT_ZERO(statvar) \ 3140Sstevel@tonic-gate statvar = 0; 3150Sstevel@tonic-gate #define STAT_MAX(statmax, statvar) \ 3160Sstevel@tonic-gate { \ 3170Sstevel@tonic-gate statvar++; \ 3180Sstevel@tonic-gate if (statvar > statmax) \ 3190Sstevel@tonic-gate statmax = statvar; \ 3200Sstevel@tonic-gate } 3210Sstevel@tonic-gate #define STAT_CHECK(statvar, value) \ 3220Sstevel@tonic-gate { \ 3230Sstevel@tonic-gate if (value) \ 3240Sstevel@tonic-gate statvar++; \ 3250Sstevel@tonic-gate } 3260Sstevel@tonic-gate #else 3270Sstevel@tonic-gate #define STAT_INC(statvar) 3280Sstevel@tonic-gate #define STAT_DEC(statvar) 3290Sstevel@tonic-gate #define STAT_ZERO(statvar) 3300Sstevel@tonic-gate #define STAT_MAX(statmax, statvar) 3310Sstevel@tonic-gate #define STAT_CHECK(statvar, value) 3320Sstevel@tonic-gate #endif 3330Sstevel@tonic-gate /* 3340Sstevel@tonic-gate * bit map related macros 3350Sstevel@tonic-gate */ 3360Sstevel@tonic-gate #define setbit(a, i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) 3370Sstevel@tonic-gate #define clrbit(a, i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) 3380Sstevel@tonic-gate #define isset(a, i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) 3390Sstevel@tonic-gate #define isclr(a, i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) 3400Sstevel@tonic-gate 3410Sstevel@tonic-gate typedef struct daemon_queue { 3420Sstevel@tonic-gate int maxq_len; 3430Sstevel@tonic-gate int qlen; 3440Sstevel@tonic-gate int treqs; /* total number of requests */ 3450Sstevel@tonic-gate struct daemon_queue *dq_next; 3460Sstevel@tonic-gate struct daemon_queue *dq_prev; 3470Sstevel@tonic-gate void (*dq_call)(); 3480Sstevel@tonic-gate } daemon_queue_t; 3490Sstevel@tonic-gate 3500Sstevel@tonic-gate #define DAEMON_QUEUE daemon_queue_t dq; 3510Sstevel@tonic-gate 3520Sstevel@tonic-gate #ifdef _KERNEL 3530Sstevel@tonic-gate #include <sys/buf.h> 3540Sstevel@tonic-gate #include <sys/dkio.h> 3550Sstevel@tonic-gate #include <sys/vtoc.h> 3560Sstevel@tonic-gate 3570Sstevel@tonic-gate #define MD_DEV2SET(d) (MD_MIN2SET(md_getminor(d))) 3580Sstevel@tonic-gate 3590Sstevel@tonic-gate #define MD_UNIT(m) (md_set[MD_MIN2SET(m)].s_un[MD_MIN2UNIT(m)]) 3600Sstevel@tonic-gate #define MDI_UNIT(m) ((mdi_unit_t *) \ 3610Sstevel@tonic-gate md_set[MD_MIN2SET(m)].s_ui[MD_MIN2UNIT(m)]) 3620Sstevel@tonic-gate #define MD_VOIDUNIT(m) (md_set[MD_MIN2SET(m)].s_un[MD_MIN2UNIT(m)]) 3630Sstevel@tonic-gate #define MDI_VOIDUNIT(m) (md_set[MD_MIN2SET(m)].s_ui[MD_MIN2UNIT(m)]) 3640Sstevel@tonic-gate 3650Sstevel@tonic-gate /* 3660Sstevel@tonic-gate * This is the current maximum number of real disks per Virtual Disk. 3670Sstevel@tonic-gate */ 3680Sstevel@tonic-gate extern uint_t md_mdelay; /* md_mirror timeout delay */ 3690Sstevel@tonic-gate 3700Sstevel@tonic-gate #define MD_ADM_MINOR L_MAXMIN32 /* the minor number for md_admin */ 3710Sstevel@tonic-gate #define MD_MDELAY (md_mdelay) 3720Sstevel@tonic-gate #define NUM_USEC_IN_SEC 1000000 /* 1 million usec in a second */ 3730Sstevel@tonic-gate 3740Sstevel@tonic-gate #define ANY_SERVICE -1 /* md_get_named_service() wild card */ 3750Sstevel@tonic-gate 3760Sstevel@tonic-gate /* 3770Sstevel@tonic-gate * daemon threads are used in multiple places in md. The following set of 3780Sstevel@tonic-gate * structures and routines allow a common way to create and initialize them. 3790Sstevel@tonic-gate * 3800Sstevel@tonic-gate * md_requestq_entry_t - entry of creating request queues. 3810Sstevel@tonic-gate * struct mdq_anchor - request queue header 3820Sstevel@tonic-gate * 3830Sstevel@tonic-gate * Functions associated with request queues: 3840Sstevel@tonic-gate * 3850Sstevel@tonic-gate * int init_requestq_entry - 3860Sstevel@tonic-gate * void daemon_request - put a request on the queue. 3870Sstevel@tonic-gate */ 3880Sstevel@tonic-gate 3890Sstevel@tonic-gate typedef struct md_requestq_entry { 3900Sstevel@tonic-gate struct mdq_anchor *dispq_headp; 3910Sstevel@tonic-gate int *num_threadsp; /* threads servicing the queue */ 3920Sstevel@tonic-gate } md_requestq_entry_t; 3930Sstevel@tonic-gate 3940Sstevel@tonic-gate #define NULL_REQUESTQ_ENTRY(rqp)\ 3950Sstevel@tonic-gate ((rqp)->dispq_headp == NULL || (rqp)->num_threadsp == NULL) 3960Sstevel@tonic-gate 3970Sstevel@tonic-gate /* this typedef is used to differentiate between the two call styles */ 3980Sstevel@tonic-gate typedef enum callstyle { 3990Sstevel@tonic-gate REQ_OLD, 4000Sstevel@tonic-gate REQ_NEW 4010Sstevel@tonic-gate } callstyle_t; 4020Sstevel@tonic-gate 4030Sstevel@tonic-gate 4040Sstevel@tonic-gate #define daemon_request_new daemon_request 4050Sstevel@tonic-gate 4060Sstevel@tonic-gate typedef struct mdq_anchor { 4070Sstevel@tonic-gate DAEMON_QUEUE 4080Sstevel@tonic-gate kcondvar_t a_cv; /* Request has been put on queue */ 4090Sstevel@tonic-gate kmutex_t a_mx; 4100Sstevel@tonic-gate } mdq_anchor_t; 4110Sstevel@tonic-gate 4120Sstevel@tonic-gate typedef struct daemon_request { 4130Sstevel@tonic-gate DAEMON_QUEUE 4140Sstevel@tonic-gate kmutex_t dr_mx; 4150Sstevel@tonic-gate int dr_pending; 4160Sstevel@tonic-gate timeout_id_t dr_timeout_id; 4170Sstevel@tonic-gate } daemon_request_t; 4180Sstevel@tonic-gate 4190Sstevel@tonic-gate typedef struct sv_dev { 4200Sstevel@tonic-gate set_t setno; 4210Sstevel@tonic-gate side_t side; 4220Sstevel@tonic-gate mdkey_t key; 4230Sstevel@tonic-gate } sv_dev_t; 4240Sstevel@tonic-gate 4250Sstevel@tonic-gate /* 4260Sstevel@tonic-gate * Types of device probes 4270Sstevel@tonic-gate */ 4280Sstevel@tonic-gate 4290Sstevel@tonic-gate 4300Sstevel@tonic-gate typedef struct probe_req { 4310Sstevel@tonic-gate DAEMON_QUEUE 4320Sstevel@tonic-gate minor_t mnum; /* mnum of the metadevice to probe */ 4330Sstevel@tonic-gate void *private_handle; /* private handle */ 4340Sstevel@tonic-gate intptr_t (*probe_fcn)(); /* type of probeing to be done */ 4350Sstevel@tonic-gate } probe_req_t; 4360Sstevel@tonic-gate 4370Sstevel@tonic-gate /* Global flags */ 4380Sstevel@tonic-gate #define MD_NO_GBL_LOCKS_HELD 0x0000 /* currently holding no global locks */ 4390Sstevel@tonic-gate #define MD_GBL_DAEMONS_LIVE 0x0001 /* master daemon has been started. */ 4400Sstevel@tonic-gate #define MD_GBL_DAEMONS_DIE 0x0002 4410Sstevel@tonic-gate #define MD_GBL_HALTED 0x0004 /* driver is shut down */ 4420Sstevel@tonic-gate 4430Sstevel@tonic-gate /* Available bit was GBL_STALE 0x0008 */ 4440Sstevel@tonic-gate 4450Sstevel@tonic-gate #define MD_GBL_IOCTL_LOCK 0x0010 /* single-threads ioctls */ 4460Sstevel@tonic-gate #define MD_GBL_HS_LOCK 0x0020 /* single-threads hotspares */ 4470Sstevel@tonic-gate #define MD_GBL_OPEN 0x0040 /* admin is open */ 4480Sstevel@tonic-gate #define MD_GBL_EXCL 0x0080 /* admin is open exclusively */ 4490Sstevel@tonic-gate 4500Sstevel@tonic-gate #define MD_OFLG_NULL 0x0000 /* Null flag */ 4510Sstevel@tonic-gate #define MD_OFLG_CONT_ERRS 0x0001 /* Continue on open errors */ 4520Sstevel@tonic-gate #define MD_OFLG_PROBEDEV 0x0002 /* force a simulated open */ 4530Sstevel@tonic-gate #define MD_OFLG_ISINIT 0x0004 /* raid initialization */ 4540Sstevel@tonic-gate #define MD_OFLG_FROMIOCTL 0x0008 /* Called from an ioctl handler */ 4550Sstevel@tonic-gate 4560Sstevel@tonic-gate 4570Sstevel@tonic-gate typedef struct md_named_services { 4580Sstevel@tonic-gate 4590Sstevel@tonic-gate intptr_t (*md_service)(); 4600Sstevel@tonic-gate char *md_name; 4610Sstevel@tonic-gate } md_named_services_t; 4620Sstevel@tonic-gate 4630Sstevel@tonic-gate typedef enum md_snarfcmd {MD_SNARF_CLEANUP, MD_SNARF_DOIT} md_snarfcmd_t; 4640Sstevel@tonic-gate 4650Sstevel@tonic-gate typedef struct md_ops { 4660Sstevel@tonic-gate int (*md_open)( 4670Sstevel@tonic-gate dev_t *devp, 4680Sstevel@tonic-gate int flag, 4690Sstevel@tonic-gate int otyp, 4700Sstevel@tonic-gate cred_t *credp, 4710Sstevel@tonic-gate int md_oflags); 4720Sstevel@tonic-gate int (*md_close)( 4730Sstevel@tonic-gate dev_t dev, 4740Sstevel@tonic-gate int flag, 4750Sstevel@tonic-gate int otyp, 4760Sstevel@tonic-gate cred_t *credp, 4770Sstevel@tonic-gate int md_oflags); 4780Sstevel@tonic-gate void (*md_strategy)( 4790Sstevel@tonic-gate buf_t *bufp, 4800Sstevel@tonic-gate int flag, 4810Sstevel@tonic-gate void *private); 4820Sstevel@tonic-gate int (*md_print)(); /* unused now */ 4830Sstevel@tonic-gate int (*md_dump)( 4840Sstevel@tonic-gate dev_t dev, 4850Sstevel@tonic-gate caddr_t addr, 4860Sstevel@tonic-gate daddr_t blkno, 4870Sstevel@tonic-gate int nblk); 4880Sstevel@tonic-gate int (*md_read)( 4890Sstevel@tonic-gate dev_t dev, 4900Sstevel@tonic-gate struct uio *uiop, 4910Sstevel@tonic-gate cred_t *credp); 4920Sstevel@tonic-gate int (*md_write)( 4930Sstevel@tonic-gate dev_t dev, 4940Sstevel@tonic-gate struct uio *uiop, 4950Sstevel@tonic-gate cred_t *credp); 4960Sstevel@tonic-gate int (*md_ioctl)( 4970Sstevel@tonic-gate dev_t dev, 4980Sstevel@tonic-gate int cmd, 4990Sstevel@tonic-gate void *data, 5000Sstevel@tonic-gate int mode, 5010Sstevel@tonic-gate IOLOCK *lockp); 5020Sstevel@tonic-gate int (*md_snarf)( 5030Sstevel@tonic-gate md_snarfcmd_t cmd, 5040Sstevel@tonic-gate set_t setno); 5050Sstevel@tonic-gate int (*md_halt)(); 5060Sstevel@tonic-gate int (*md_aread)( 5070Sstevel@tonic-gate dev_t dev, 5080Sstevel@tonic-gate struct aio_req *aiop, 5090Sstevel@tonic-gate cred_t *credp); 5100Sstevel@tonic-gate int (*md_awrite)( 5110Sstevel@tonic-gate dev_t dev, 5120Sstevel@tonic-gate struct aio_req *aiop, 5130Sstevel@tonic-gate cred_t *credp); 5140Sstevel@tonic-gate int (*md_imp_set)( 5150Sstevel@tonic-gate set_t setno); 5160Sstevel@tonic-gate md_named_services_t *md_services; 5170Sstevel@tonic-gate md_krwlock_t md_link_rw; 5180Sstevel@tonic-gate md_link_t *md_head; 5190Sstevel@tonic-gate /* 5200Sstevel@tonic-gate * NOTE: when TSlvm s10/onnv compatibility is not an issue: 5210Sstevel@tonic-gate * o md_modid and md_locked should be deleted. 5220Sstevel@tonic-gate * o md_mod should be added 5230Sstevel@tonic-gate * ddi_modhandle_t md_mod; 5240Sstevel@tonic-gate * and used instead of the md_mods array (md_mods should 5250Sstevel@tonic-gate * be deleted). 5260Sstevel@tonic-gate */ 5270Sstevel@tonic-gate int md_modid; 5280Sstevel@tonic-gate int md_locked; 5290Sstevel@tonic-gate int md_selfindex; 5300Sstevel@tonic-gate struct md_ops *md_next; 5310Sstevel@tonic-gate md_driver_t md_driver; 5320Sstevel@tonic-gate /* NOTE: TSlvm depends on offsets in and sizeof this structure */ 5330Sstevel@tonic-gate } md_ops_t; 5340Sstevel@tonic-gate 5350Sstevel@tonic-gate /* macro to generate linkage for a md misc plugin module */ 5360Sstevel@tonic-gate #define md_noop 5370Sstevel@tonic-gate #define MD_PLUGIN_MISC_MODULE(desc, init_init, fini_uninit) \ 5380Sstevel@tonic-gate static struct modlmisc modlmisc = { \ 5390Sstevel@tonic-gate &mod_miscops, "Solaris Volume Manager " desc \ 5400Sstevel@tonic-gate }; \ 5410Sstevel@tonic-gate static struct modlinkage modlinkage = { \ 5420Sstevel@tonic-gate MODREV_1, (void *)&modlmisc, NULL \ 5430Sstevel@tonic-gate }; \ 5440Sstevel@tonic-gate int \ 5450Sstevel@tonic-gate _init(void) \ 5460Sstevel@tonic-gate { \ 5470Sstevel@tonic-gate int i; \ 5480Sstevel@tonic-gate init_init; \ 5490Sstevel@tonic-gate if ((i = mod_install(&modlinkage)) != 0) { \ 5500Sstevel@tonic-gate fini_uninit; \ 5510Sstevel@tonic-gate } \ 5520Sstevel@tonic-gate return (i); \ 5530Sstevel@tonic-gate } \ 5540Sstevel@tonic-gate int \ 5550Sstevel@tonic-gate _fini() \ 5560Sstevel@tonic-gate { \ 5570Sstevel@tonic-gate int i; \ 5580Sstevel@tonic-gate if ((i = mod_remove(&modlinkage)) == 0) { \ 5590Sstevel@tonic-gate fini_uninit; \ 5600Sstevel@tonic-gate } \ 5610Sstevel@tonic-gate return (i); \ 5620Sstevel@tonic-gate } \ 5630Sstevel@tonic-gate int \ 5640Sstevel@tonic-gate _info(struct modinfo *modinfop) \ 5650Sstevel@tonic-gate { \ 5660Sstevel@tonic-gate return (mod_info(&modlinkage, modinfop)); \ 5670Sstevel@tonic-gate } 5680Sstevel@tonic-gate 5690Sstevel@tonic-gate typedef enum md_haltcmd {MD_HALT_ALL, MD_HALT_CHECK, MD_HALT_DOIT, 5700Sstevel@tonic-gate MD_HALT_CLOSE, MD_HALT_OPEN, MD_HALT_UNLOAD 5710Sstevel@tonic-gate } md_haltcmd_t; 5720Sstevel@tonic-gate 5730Sstevel@tonic-gate /* 5740Sstevel@tonic-gate * To support cpr (Energy Star) we need to know when the resync threads are 5750Sstevel@tonic-gate * running to not allow suspention. 5760Sstevel@tonic-gate */ 5770Sstevel@tonic-gate typedef struct md_resync_thds_cnt { 5780Sstevel@tonic-gate int md_raid_resync; /* count of active raid resync threads */ 5790Sstevel@tonic-gate int md_mirror_resync; /* count of active mirror resync threads */ 5800Sstevel@tonic-gate kmutex_t md_resync_mutex; /* protects both resync counts */ 5810Sstevel@tonic-gate } md_resync_t; 5820Sstevel@tonic-gate 5830Sstevel@tonic-gate /* 5840Sstevel@tonic-gate * flags used with call to individual strategy routines 5850Sstevel@tonic-gate */ 5860Sstevel@tonic-gate #define MD_STR_PASSEDON 0x0000ffff 5870Sstevel@tonic-gate #define MD_STR_NOTTOP 0x00000001 5880Sstevel@tonic-gate #define MD_STR_MAPPED 0x00000002 /* set when buf_t is mapped in */ 5890Sstevel@tonic-gate #define MD_STR_ABR 0x00000004 /* use ABR to handle any recovery */ 5900Sstevel@tonic-gate #define MD_STR_WMUPDATE 0x00000008 /* set if updating watermarks for sp */ 5910Sstevel@tonic-gate #define MD_IO_COUNTED 0x00000400 /* io has been counted */ 5920Sstevel@tonic-gate #define MD_NOBLOCK 0x00000800 /* do not block io durring release */ 5930Sstevel@tonic-gate 5940Sstevel@tonic-gate #define MD_STR_WAR 0x00010000 /* this write is write after read */ 5950Sstevel@tonic-gate #define MD_STR_WOW 0x00020000 /* handling a write-on-write */ 5960Sstevel@tonic-gate #define MD_STR_DMR 0x00040000 /* Directed Read request */ 5970Sstevel@tonic-gate #define MD_STR_DIRTY_RD 0x00080000 /* Read of a dirty block */ 5980Sstevel@tonic-gate #define MD_STR_FLAG_ERR 0x00100000 /* Flag any write error on this i/o */ 5997975SAchim.Maurer@Sun.COM #define MD_STR_BLOCK_OK 0x00200000 /* Flag if caller i/o can be blocked */ 6000Sstevel@tonic-gate 6010Sstevel@tonic-gate /* 6020Sstevel@tonic-gate * Bits for return value of md_getdevnum 6030Sstevel@tonic-gate */ 6040Sstevel@tonic-gate #define MD_TRUST_DEVT 1 6050Sstevel@tonic-gate #define MD_NOTRUST_DEVT 0 6060Sstevel@tonic-gate 6070Sstevel@tonic-gate /* Flag for drivers to pass to kmem_cache_alloc() */ 6080Sstevel@tonic-gate #define MD_ALLOCFLAGS (KM_PUSHPAGE | KM_SLEEP) 6090Sstevel@tonic-gate 6100Sstevel@tonic-gate /* Named services */ 6110Sstevel@tonic-gate #define MD_CHECK_OFFLINE "check_offline" 6120Sstevel@tonic-gate #define MD_INC_ABR_COUNT "inc abr count" 6130Sstevel@tonic-gate #define MD_DEC_ABR_COUNT "dec abr count" 6140Sstevel@tonic-gate 6154491Sjmf /* md_getdevname_common flags for namespace lock */ 6164491Sjmf #define MD_WAIT_LOCK 0 6174491Sjmf #define MD_NOWAIT_LOCK 1 6184491Sjmf 6190Sstevel@tonic-gate /* Externals from md.c */ 6200Sstevel@tonic-gate extern int md_snarf_db_set(set_t setno, md_error_t *ep); 6210Sstevel@tonic-gate extern void get_info(struct dk_cinfo *, minor_t); 6220Sstevel@tonic-gate extern void get_minfo(struct dk_minfo *, minor_t); 6230Sstevel@tonic-gate extern int mdstrategy(buf_t *); 6240Sstevel@tonic-gate extern int md_create_minor_node(set_t, minor_t); 6257627SChris.Horne@Sun.COM extern void md_nblocks_set(minor_t mnum, uint64_t nblocks); 6260Sstevel@tonic-gate 6270Sstevel@tonic-gate /* External from md_subr.c */ 6280Sstevel@tonic-gate extern int md_inc_iocount(set_t); 6290Sstevel@tonic-gate extern void md_inc_iocount_noblock(set_t); 6300Sstevel@tonic-gate extern void md_dec_iocount(set_t); 6310Sstevel@tonic-gate extern int md_isblock_setio(set_t); 6320Sstevel@tonic-gate extern int md_block_setio(set_t); 6330Sstevel@tonic-gate extern void md_clearblock_setio(set_t); 6340Sstevel@tonic-gate extern void md_unblock_setio(set_t); 6350Sstevel@tonic-gate extern int md_tas_block_setio(set_t); 6360Sstevel@tonic-gate extern void md_biodone(struct buf *); 6370Sstevel@tonic-gate extern void md_bioreset(struct buf *); 6380Sstevel@tonic-gate extern md_dev64_t md_xlate_targ_2_mini(md_dev64_t); 6390Sstevel@tonic-gate extern md_dev64_t md_xlate_mini_2_targ(md_dev64_t); 6400Sstevel@tonic-gate extern void md_xlate_free(int); 6410Sstevel@tonic-gate extern major_t md_targ_name_to_major(char *); 6420Sstevel@tonic-gate extern char *md_targ_major_to_name(major_t); 6430Sstevel@tonic-gate extern void md_majortab_free(); 6440Sstevel@tonic-gate extern void md_set_status(int); 6450Sstevel@tonic-gate extern void md_clr_status(int); 6460Sstevel@tonic-gate extern int md_get_status(void); 6470Sstevel@tonic-gate extern void md_set_setstatus(set_t, int); 6480Sstevel@tonic-gate extern void md_clr_setstatus(set_t, int); 6490Sstevel@tonic-gate extern uint_t md_get_setstatus(set_t); 6500Sstevel@tonic-gate extern void *md_unit_readerlock(mdi_unit_t *); 6510Sstevel@tonic-gate extern void *md_unit_writerlock(mdi_unit_t *); 6520Sstevel@tonic-gate extern void md_unit_readerexit(mdi_unit_t *); 6530Sstevel@tonic-gate extern void md_unit_writerexit(mdi_unit_t *); 6540Sstevel@tonic-gate extern void md_ioctl_releaselocks(int, int, mdi_unit_t *); 6550Sstevel@tonic-gate extern void md_ioctl_reacquirelocks(int, mdi_unit_t *); 6560Sstevel@tonic-gate extern int md_ioctl_lock_exit(int, int, mdi_unit_t *, int); 6570Sstevel@tonic-gate extern int md_ioctl_lock_enter(void); 6580Sstevel@tonic-gate extern void *md_ioctl_readerlock(IOLOCK *, mdi_unit_t *); 6590Sstevel@tonic-gate extern void md_ioctl_readerexit(IOLOCK *); 6600Sstevel@tonic-gate extern void *md_ioctl_writerlock(IOLOCK *, mdi_unit_t *); 6610Sstevel@tonic-gate extern void md_ioctl_writerexit(IOLOCK *); 6620Sstevel@tonic-gate extern void md_ioctl_io_exit(IOLOCK *); 6630Sstevel@tonic-gate extern void *md_ioctl_io_lock(IOLOCK *, mdi_unit_t *); 6640Sstevel@tonic-gate extern void md_ioctl_droplocks(IOLOCK *); 6650Sstevel@tonic-gate extern void md_array_writer(IOLOCK *); 6660Sstevel@tonic-gate extern void md_array_reader(IOLOCK *); 6670Sstevel@tonic-gate extern void *md_ioctl_openclose_enter(IOLOCK *, mdi_unit_t *); 6680Sstevel@tonic-gate extern void md_ioctl_openclose_exit(IOLOCK *); 6690Sstevel@tonic-gate extern void md_ioctl_openclose_exit_lh(IOLOCK *); 6700Sstevel@tonic-gate extern void *md_unit_openclose_enter(mdi_unit_t *); 6710Sstevel@tonic-gate extern void md_unit_openclose_exit(mdi_unit_t *); 6720Sstevel@tonic-gate extern void md_unit_openclose_exit_lh(mdi_unit_t *); 6730Sstevel@tonic-gate extern int md_unit_isopen(mdi_unit_t *ui); 6740Sstevel@tonic-gate extern int md_unit_incopen(minor_t mnum, int flag, int otyp); 6750Sstevel@tonic-gate extern int md_unit_decopen(minor_t mnum, int otyp); 6760Sstevel@tonic-gate extern void *md_io_readerlock(mdi_unit_t *); 6770Sstevel@tonic-gate extern void *md_io_writerlock(mdi_unit_t *); 6780Sstevel@tonic-gate extern void md_io_readerexit(mdi_unit_t *); 6790Sstevel@tonic-gate extern void md_io_writerexit(mdi_unit_t *); 6800Sstevel@tonic-gate extern intptr_t (*md_get_named_service())(); 6810Sstevel@tonic-gate extern int init_requestq(md_requestq_entry_t *, void (*)(), 6820Sstevel@tonic-gate caddr_t, int, int); 6830Sstevel@tonic-gate extern void daemon_request(mdq_anchor_t *, void(*)(), 6840Sstevel@tonic-gate daemon_queue_t *, callstyle_t); 6850Sstevel@tonic-gate extern void md_daemon(int, mdq_anchor_t *); 6860Sstevel@tonic-gate extern void mddb_commitrec_wrapper(mddb_recid_t); 6870Sstevel@tonic-gate extern void mddb_commitrecs_wrapper(mddb_recid_t *); 6880Sstevel@tonic-gate extern void mddb_deleterec_wrapper(mddb_recid_t); 6890Sstevel@tonic-gate extern void md_holdset_enter(set_t setno); 6900Sstevel@tonic-gate extern void md_holdset_exit(set_t setno); 6910Sstevel@tonic-gate extern int md_holdset_testandenter(set_t setno); 6920Sstevel@tonic-gate extern void md_haltsnarf_enter(set_t setno); 6930Sstevel@tonic-gate extern void md_haltsnarf_exit(set_t setno); 6940Sstevel@tonic-gate extern void md_haltsnarf_wait(set_t setno); 6950Sstevel@tonic-gate extern int md_halt_set(set_t setno, enum md_haltcmd cmd); 6960Sstevel@tonic-gate extern int md_halt(int global_lock_flag); 6970Sstevel@tonic-gate extern int md_layered_open(minor_t, md_dev64_t *, int); 6980Sstevel@tonic-gate extern void md_layered_close(md_dev64_t, int); 6990Sstevel@tonic-gate extern char *md_get_device_name(md_dev64_t); 7000Sstevel@tonic-gate extern int errdone(mdi_unit_t *, struct buf *, int); 7010Sstevel@tonic-gate extern int md_checkbuf(mdi_unit_t *, md_unit_t *, buf_t *); 7020Sstevel@tonic-gate extern int md_start_daemons(int init_queues); 7030Sstevel@tonic-gate extern int md_loadsubmod(set_t, char *, int); 7040Sstevel@tonic-gate extern int md_getmodindex(md_driver_t *, int, int); 7050Sstevel@tonic-gate extern void md_call_strategy(buf_t *, int, void *); 7060Sstevel@tonic-gate extern int md_call_ioctl(md_dev64_t, int, void *, int, IOLOCK *); 7070Sstevel@tonic-gate extern void md_rem_link(set_t, int, krwlock_t *, md_link_t **); 7080Sstevel@tonic-gate extern int md_dev_exists(md_dev64_t); 7090Sstevel@tonic-gate extern md_parent_t md_get_parent(md_dev64_t); 7100Sstevel@tonic-gate extern void md_set_parent(md_dev64_t, md_parent_t); 7110Sstevel@tonic-gate extern void md_reset_parent(md_dev64_t); 7121623Stw21770 extern struct hot_spare_pool *find_hot_spare_pool(set_t, int); 7130Sstevel@tonic-gate extern int md_hot_spare_ifc(hs_cmds_t, mddb_recid_t, u_longlong_t, int, 7140Sstevel@tonic-gate mddb_recid_t *, mdkey_t *, md_dev64_t *, diskaddr_t *); 7150Sstevel@tonic-gate extern int md_notify_interface(md_event_cmds_t cmd, md_tags_t type, 7160Sstevel@tonic-gate set_t set, md_dev64_t dev, md_event_type_t event); 7170Sstevel@tonic-gate extern void svm_gen_sysevent(char *se_class, char *se_subclass, 7180Sstevel@tonic-gate uint32_t tag, set_t setno, md_dev64_t devid); 7190Sstevel@tonic-gate extern void md_create_unit_incore(minor_t, md_ops_t *, int); 7200Sstevel@tonic-gate extern void md_destroy_unit_incore(minor_t, md_ops_t *); 7210Sstevel@tonic-gate extern void md_rem_names(sv_dev_t *, int); 7220Sstevel@tonic-gate struct uio; 7230Sstevel@tonic-gate extern int md_chk_uio(struct uio *); 7240Sstevel@tonic-gate extern char *md_shortname(minor_t mnum); 7250Sstevel@tonic-gate extern char *md_devname(set_t setno, md_dev64_t dev, char *buf, 7260Sstevel@tonic-gate size_t size); 7270Sstevel@tonic-gate extern void md_minphys(buf_t *); 7280Sstevel@tonic-gate extern void md_kstat_init(minor_t mnum); 7290Sstevel@tonic-gate extern void md_kstat_init_ui(minor_t mnum, mdi_unit_t *ui); 7300Sstevel@tonic-gate extern void md_kstat_destroy(minor_t mnum); 7310Sstevel@tonic-gate extern void md_kstat_destroy_ui(mdi_unit_t *ui); 7320Sstevel@tonic-gate extern void md_kstat_waitq_enter(mdi_unit_t *ui); 7330Sstevel@tonic-gate extern void md_kstat_waitq_to_runq(mdi_unit_t *ui); 7340Sstevel@tonic-gate extern void md_kstat_waitq_exit(mdi_unit_t *ui); 7350Sstevel@tonic-gate extern void md_kstat_runq_enter(mdi_unit_t *ui); 7360Sstevel@tonic-gate extern void md_kstat_runq_exit(mdi_unit_t *ui); 7370Sstevel@tonic-gate extern void md_kstat_done(mdi_unit_t *ui, buf_t *bp, int war); 7380Sstevel@tonic-gate extern pid_t md_getpid(void); 7390Sstevel@tonic-gate extern proc_t *md_getproc(void); 7400Sstevel@tonic-gate extern int md_checkpid(pid_t pid, proc_t *proc); 7410Sstevel@tonic-gate extern char *md_strdup(char *cp); 7420Sstevel@tonic-gate extern void freestr(char *cp); 7437563SPrasad.Singamsetty@Sun.COM extern int md_check_ioctl_against_unit(int, mdc_unit_t); 7440Sstevel@tonic-gate extern mddb_recid_t md_vtoc_to_efi_record(mddb_recid_t, set_t); 7450Sstevel@tonic-gate 7468452SJohn.Wren.Kennedy@Sun.COM extern int mdmn_ksend_message(set_t, md_mn_msgtype_t, uint_t, 7478452SJohn.Wren.Kennedy@Sun.COM md_mn_nodeid_t, char *, int, md_mn_kresult_t *); 7480Sstevel@tonic-gate extern void mdmn_ksend_show_error(int, md_mn_kresult_t *, const char *); 7490Sstevel@tonic-gate extern int mdmn_send_capability_message(minor_t, volcap_t, IOLOCK *); 7500Sstevel@tonic-gate extern void mdmn_clear_all_capabilities(minor_t); 7510Sstevel@tonic-gate extern int md_init_probereq(struct md_probedev_impl *p, 7520Sstevel@tonic-gate daemon_queue_t **hdrpp); 7530Sstevel@tonic-gate extern boolean_t callb_md_mrs_cpr(void *, int); 7541623Stw21770 extern void md_upd_set_unnext(set_t, unit_t); 7551623Stw21770 extern int md_rem_selfname(minor_t); 7561623Stw21770 extern void md_rem_hspname(set_t, mdkey_t); 7578452SJohn.Wren.Kennedy@Sun.COM extern void *md_create_taskq(set_t, minor_t); 7580Sstevel@tonic-gate 7590Sstevel@tonic-gate /* Externals from md_ioctl.c */ 7600Sstevel@tonic-gate extern int md_mn_is_commd_present(void); 7618452SJohn.Wren.Kennedy@Sun.COM extern int md_mn_is_commd_present_lite(void); 7620Sstevel@tonic-gate extern void md_mn_clear_commd_present(void); 7630Sstevel@tonic-gate extern int md_admin_ioctl(md_dev64_t, int, caddr_t, int, IOLOCK *lockp); 7640Sstevel@tonic-gate extern void md_get_geom(md_unit_t *, struct dk_geom *); 7657563SPrasad.Singamsetty@Sun.COM extern int md_set_vtoc(md_unit_t *, struct vtoc *); 7660Sstevel@tonic-gate extern void md_get_vtoc(md_unit_t *, struct vtoc *); 7677563SPrasad.Singamsetty@Sun.COM extern int md_set_extvtoc(md_unit_t *, struct extvtoc *); 7687563SPrasad.Singamsetty@Sun.COM extern void md_get_extvtoc(md_unit_t *, struct extvtoc *); 7690Sstevel@tonic-gate extern void md_get_cgapart(md_unit_t *, struct dk_map *); 7700Sstevel@tonic-gate extern void md_get_efi(md_unit_t *, char *); 7710Sstevel@tonic-gate extern int md_set_efi(md_unit_t *, char *); 7720Sstevel@tonic-gate extern int md_dkiocgetefi(minor_t, void *, int); 7730Sstevel@tonic-gate extern int md_dkiocsetefi(minor_t, void *, int); 7740Sstevel@tonic-gate extern int md_dkiocpartition(minor_t, void *, int); 7751623Stw21770 extern void md_remove_minor_node(minor_t); 7760Sstevel@tonic-gate 7770Sstevel@tonic-gate 7780Sstevel@tonic-gate /* Externals from md_names.c */ 7790Sstevel@tonic-gate extern mdkey_t md_setdevname(set_t, side_t, mdkey_t, char *, minor_t, char *, 7801945Sjeanm int imp_flag, ddi_devid_t devid, char *minorname, 7811623Stw21770 set_t, md_error_t *); 7820Sstevel@tonic-gate extern int md_getdevname(set_t, side_t, mdkey_t, md_dev64_t, char *, 7830Sstevel@tonic-gate size_t); 7844491Sjmf extern int md_getdevname_common(set_t, side_t, mdkey_t, md_dev64_t, char *, 7854491Sjmf size_t, int); 7861623Stw21770 extern int md_gethspinfo(set_t, side_t, mdkey_t, char *, hsp_t *, 7871623Stw21770 char *); 7880Sstevel@tonic-gate extern int md_getkeyfromdev(set_t, side_t, md_dev64_t, mdkey_t *, int *); 7890Sstevel@tonic-gate extern int md_devid_found(set_t, side_t, mdkey_t); 7900Sstevel@tonic-gate extern int md_getnment(set_t, side_t, mdkey_t, md_dev64_t, 7910Sstevel@tonic-gate char *, uint_t, major_t *, minor_t *, mdkey_t *); 7920Sstevel@tonic-gate extern md_dev64_t md_getdevnum(set_t, side_t, mdkey_t, int); 7930Sstevel@tonic-gate extern mdkey_t md_getnextkey(set_t, side_t, mdkey_t, uint_t *); 7940Sstevel@tonic-gate extern int md_remdevname(set_t, side_t, mdkey_t); 7950Sstevel@tonic-gate extern mdkey_t md_setshared_name(set_t, char *, int); 7960Sstevel@tonic-gate extern char *md_getshared_name(set_t, mdkey_t); 7970Sstevel@tonic-gate extern int md_remshared_name(set_t, mdkey_t); 7980Sstevel@tonic-gate extern mdkey_t md_getshared_key(set_t, char *); 7990Sstevel@tonic-gate extern int md_setshared_data(set_t, uint_t, caddr_t); 8000Sstevel@tonic-gate extern caddr_t md_getshared_data(set_t, uint_t); 8010Sstevel@tonic-gate extern int md_load_namespace(set_t, md_error_t *ep, int); 8020Sstevel@tonic-gate extern void md_unload_namespace(set_t, int); 8030Sstevel@tonic-gate extern int md_nm_did_chkspace(set_t); 8040Sstevel@tonic-gate extern void md_bioinit(); 8050Sstevel@tonic-gate extern buf_t *md_bioclone(buf_t *, off_t, size_t, dev_t, diskaddr_t, 8060Sstevel@tonic-gate int (*)(buf_t *), buf_t *, int); 8070Sstevel@tonic-gate extern int md_getdevid(set_t setno, side_t side, mdkey_t key, 8080Sstevel@tonic-gate ddi_devid_t devid, ushort_t *did_size); 8090Sstevel@tonic-gate extern int md_getdevidminor(set_t setno, side_t side, mdkey_t key, 8100Sstevel@tonic-gate char *minorname, size_t minorname_len); 8110Sstevel@tonic-gate extern int md_update_namespace(set_t setno, side_t side, mdkey_t key, 812*12678SJames.Hall@Sun.COM caddr_t devname, caddr_t pathname, major_t major, 813*12678SJames.Hall@Sun.COM minor_t mnum); 8140Sstevel@tonic-gate extern int md_update_locator_namespace(set_t setno, side_t side, 8150Sstevel@tonic-gate caddr_t devname, caddr_t pathname, md_dev64_t devt); 8160Sstevel@tonic-gate extern int md_update_namespace_did(set_t setno, side_t side, mdkey_t key, 8170Sstevel@tonic-gate md_error_t *ep); 8180Sstevel@tonic-gate extern int md_validate_devid(set_t setno, side_t side, int *maxsz); 8190Sstevel@tonic-gate extern int md_get_invdid(set_t setno, side_t side, int cnt, int maxsz, 8200Sstevel@tonic-gate void *didptr); 8210Sstevel@tonic-gate extern md_dev64_t md_resolve_bydevid(minor_t, md_dev64_t, mdkey_t key); 8220Sstevel@tonic-gate extern md_dev64_t md_expldev(md_dev64_t); 8230Sstevel@tonic-gate extern dev32_t md_cmpldev(md_dev64_t); 8240Sstevel@tonic-gate extern dev_t md_dev64_to_dev(md_dev64_t); 8250Sstevel@tonic-gate extern md_dev64_t md_makedevice(major_t, minor_t); 8260Sstevel@tonic-gate extern major_t md_getmajor(md_dev64_t); 8270Sstevel@tonic-gate extern minor_t md_getminor(md_dev64_t); 8280Sstevel@tonic-gate extern void md_timeval(md_timeval32_t *); 8291945Sjeanm extern int md_imp_snarf_set(mddb_config_t *); 8300Sstevel@tonic-gate 8310Sstevel@tonic-gate /* externals from md_mddb.c */ 8320Sstevel@tonic-gate extern int mddb_reread_rr(set_t, mddb_recid_t); 8330Sstevel@tonic-gate extern int mddb_setowner(mddb_recid_t id, md_mn_nodeid_t owner); 8340Sstevel@tonic-gate extern int mddb_parse(mddb_parse_parm_t *mpp); 8350Sstevel@tonic-gate extern int mddb_block(mddb_block_parm_t *mpp); 8360Sstevel@tonic-gate extern int mddb_optrecfix(mddb_optrec_parm_t *mop); 8370Sstevel@tonic-gate extern int mddb_check_write_ioctl(mddb_config_t *info); 8380Sstevel@tonic-gate extern int mddb_setflags_ioctl(mddb_setflags_config_t *info); 8390Sstevel@tonic-gate extern struct nm_next_hdr *get_first_record(set_t, int, int); 8400Sstevel@tonic-gate extern void *lookup_entry(struct nm_next_hdr *, set_t, 8410Sstevel@tonic-gate side_t, mdkey_t, md_dev64_t, int); 8420Sstevel@tonic-gate extern void *lookup_shared_entry(struct nm_next_hdr *, 8430Sstevel@tonic-gate mdkey_t key, char *, mddb_recid_t *, int); 8440Sstevel@tonic-gate extern int remove_shared_entry(struct nm_next_hdr *, mdkey_t key, 8450Sstevel@tonic-gate char *, int); 846*12678SJames.Hall@Sun.COM extern int remove_entry(struct nm_next_hdr *, side_t, mdkey_t, int); 8470Sstevel@tonic-gate extern void *alloc_entry(struct nm_next_hdr *, mddb_recid_t, size_t, int, 8480Sstevel@tonic-gate mddb_recid_t *); 8490Sstevel@tonic-gate extern void *getshared_name(set_t, mdkey_t, int); 8500Sstevel@tonic-gate 8510Sstevel@tonic-gate #endif /* _KERNEL */ 8520Sstevel@tonic-gate 853734Smw145384 854734Smw145384 /* externals from md_revchk.c */ 855734Smw145384 extern int revchk(uint_t my_rev, uint_t data); 856734Smw145384 857734Smw145384 8580Sstevel@tonic-gate #ifdef __cplusplus 8590Sstevel@tonic-gate } 8600Sstevel@tonic-gate #endif 8610Sstevel@tonic-gate 8620Sstevel@tonic-gate #endif /* _SYS_MDVAR_H */ 863