1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate /* 23*0Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24*0Sstevel@tonic-gate * Use is subject to license terms. 25*0Sstevel@tonic-gate */ 26*0Sstevel@tonic-gate 27*0Sstevel@tonic-gate #ifndef _SYS__MD_SP_H 28*0Sstevel@tonic-gate #define _SYS__MD_SP_H 29*0Sstevel@tonic-gate 30*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 31*0Sstevel@tonic-gate 32*0Sstevel@tonic-gate #include <sys/lvm/mdvar.h> 33*0Sstevel@tonic-gate 34*0Sstevel@tonic-gate #ifdef __cplusplus 35*0Sstevel@tonic-gate extern "C" { 36*0Sstevel@tonic-gate #endif 37*0Sstevel@tonic-gate 38*0Sstevel@tonic-gate #define META_SP_DEBUG ("META_SP_DEBUG") 39*0Sstevel@tonic-gate 40*0Sstevel@tonic-gate /* on-disk structures */ 41*0Sstevel@tonic-gate #define MD_SP_MAGIC (0x20000127) 42*0Sstevel@tonic-gate /* number of sectors to reserve at the beginning of the volume */ 43*0Sstevel@tonic-gate #define MD_SP_START (0) 44*0Sstevel@tonic-gate /* current watermark version number */ 45*0Sstevel@tonic-gate #define MD_SP_VERSION (1) 46*0Sstevel@tonic-gate /* size of a watermark in sectors */ 47*0Sstevel@tonic-gate #define MD_SP_WMSIZE (1) 48*0Sstevel@tonic-gate /* free watermark name */ 49*0Sstevel@tonic-gate #define MD_SP_FREEWMNAME "free" 50*0Sstevel@tonic-gate /* local set name */ 51*0Sstevel@tonic-gate #define MD_SP_LOCALSETNAME "" 52*0Sstevel@tonic-gate /* maximum length of a soft partition metadevice name. eg. dXXXX\0 */ 53*0Sstevel@tonic-gate #define MD_SP_MAX_DEVNAME_PLUS_1 (6) 54*0Sstevel@tonic-gate 55*0Sstevel@tonic-gate /* 56*0Sstevel@tonic-gate * The size of this structure is forced to be 512 bytes (ie a sector) by 57*0Sstevel@tonic-gate * using a union. Note the MD_MAX_SETNAME_PLUS_1 is set in meta_basic.h 58*0Sstevel@tonic-gate */ 59*0Sstevel@tonic-gate 60*0Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 61*0Sstevel@tonic-gate #pragma pack(4) 62*0Sstevel@tonic-gate #endif 63*0Sstevel@tonic-gate typedef union mp_watermark { 64*0Sstevel@tonic-gate struct { 65*0Sstevel@tonic-gate uint32_t wm_magic; /* magic number */ 66*0Sstevel@tonic-gate uint32_t wm_version; /* version number */ 67*0Sstevel@tonic-gate uint32_t wm_checksum; /* structure checksum */ 68*0Sstevel@tonic-gate uint32_t wm_seq; /* sequence number */ 69*0Sstevel@tonic-gate uint32_t wm_type; /* extent type */ 70*0Sstevel@tonic-gate uint64_t wm_length; /* length of extent */ 71*0Sstevel@tonic-gate char wm_mdname[MD_MAX_SETNAME_PLUS_1 + 72*0Sstevel@tonic-gate MD_SP_MAX_DEVNAME_PLUS_1]; /* SP name */ 73*0Sstevel@tonic-gate char wm_setname[MD_MAX_SETNAME_PLUS_1]; /* setname */ 74*0Sstevel@tonic-gate } wm; 75*0Sstevel@tonic-gate uchar_t wm_pad[MD_SP_WMSIZE * DEV_BSIZE]; 76*0Sstevel@tonic-gate } mp_watermark_t; 77*0Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 78*0Sstevel@tonic-gate #pragma pack() 79*0Sstevel@tonic-gate #endif 80*0Sstevel@tonic-gate 81*0Sstevel@tonic-gate #define wm_magic wm.wm_magic 82*0Sstevel@tonic-gate #define wm_version wm.wm_version 83*0Sstevel@tonic-gate #define wm_checksum wm.wm_checksum 84*0Sstevel@tonic-gate #define wm_seq wm.wm_seq 85*0Sstevel@tonic-gate #define wm_type wm.wm_type 86*0Sstevel@tonic-gate #define wm_length wm.wm_length 87*0Sstevel@tonic-gate #define wm_mdname wm.wm_mdname 88*0Sstevel@tonic-gate #define wm_setname wm.wm_setname 89*0Sstevel@tonic-gate 90*0Sstevel@tonic-gate /* Watermark types */ 91*0Sstevel@tonic-gate typedef enum sp_ext_type { 92*0Sstevel@tonic-gate EXTTYP_ALLOC = 0x1, /* this extent is in use by a soft partition */ 93*0Sstevel@tonic-gate EXTTYP_FREE = 0x2, /* extent is not in use */ 94*0Sstevel@tonic-gate EXTTYP_END = 0x3, /* last descriptor on the volume */ 95*0Sstevel@tonic-gate EXTTYP_RESERVED = 0x4 /* extent will not be used or updated */ 96*0Sstevel@tonic-gate } sp_ext_type_t; 97*0Sstevel@tonic-gate 98*0Sstevel@tonic-gate /* ioctls */ 99*0Sstevel@tonic-gate #define MD_IOC_SPSTATUS (MDIOC_MISC|0) 100*0Sstevel@tonic-gate #define MD_IOC_SPUPDATEWM (MDIOC_MISC|1) 101*0Sstevel@tonic-gate #define MD_IOC_SPREADWM (MDIOC_MISC|2) 102*0Sstevel@tonic-gate 103*0Sstevel@tonic-gate #ifdef _KERNEL 104*0Sstevel@tonic-gate 105*0Sstevel@tonic-gate /* 106*0Sstevel@tonic-gate * parent and child save areas provide the mechanism for tracking 107*0Sstevel@tonic-gate * I/O operations in the metadevice stack. 108*0Sstevel@tonic-gate */ 109*0Sstevel@tonic-gate 110*0Sstevel@tonic-gate /* soft partitioning parent save area */ 111*0Sstevel@tonic-gate typedef struct md_spps { /* soft partition parent save */ 112*0Sstevel@tonic-gate DAEMON_QUEUE 113*0Sstevel@tonic-gate mp_unit_t *ps_un; /* sp unit structure */ 114*0Sstevel@tonic-gate mdi_unit_t *ps_ui; /* incore unit struct */ 115*0Sstevel@tonic-gate buf_t *ps_bp; /* parent buffer */ 116*0Sstevel@tonic-gate caddr_t ps_addr; 117*0Sstevel@tonic-gate int ps_frags; 118*0Sstevel@tonic-gate int ps_flags; 119*0Sstevel@tonic-gate /* 120*0Sstevel@tonic-gate * New structure members should be added here; fields added 121*0Sstevel@tonic-gate * after ps_mx will not be zeroed during initialization. 122*0Sstevel@tonic-gate */ 123*0Sstevel@tonic-gate kmutex_t ps_mx; 124*0Sstevel@tonic-gate } md_spps_t; 125*0Sstevel@tonic-gate 126*0Sstevel@tonic-gate /* parent save flags. */ 127*0Sstevel@tonic-gate #define MD_SPPS_ERROR 0x0001 128*0Sstevel@tonic-gate #define MD_SPPS_DONTFREE 0x0002 129*0Sstevel@tonic-gate #define MD_SPPS_DONE 0x0004 130*0Sstevel@tonic-gate 131*0Sstevel@tonic-gate /* soft partitioning child save area */ 132*0Sstevel@tonic-gate typedef struct md_spcs { 133*0Sstevel@tonic-gate DAEMON_QUEUE 134*0Sstevel@tonic-gate minor_t cs_mdunit; /* child minor number */ 135*0Sstevel@tonic-gate md_spps_t *cs_ps; /* parent save pointer */ 136*0Sstevel@tonic-gate /* Add new structure members HERE!! */ 137*0Sstevel@tonic-gate buf_t cs_buf; /* child buffer */ 138*0Sstevel@tonic-gate /* DO NOT add struture members here; cs_buf is dynamically sized */ 139*0Sstevel@tonic-gate } md_spcs_t; 140*0Sstevel@tonic-gate 141*0Sstevel@tonic-gate #define SPPS_FREE(kc, ps) \ 142*0Sstevel@tonic-gate { \ 143*0Sstevel@tonic-gate if ((ps)->ps_flags & MD_SPPS_DONTFREE) \ 144*0Sstevel@tonic-gate (ps)->ps_flags |= MD_SPPS_DONE; \ 145*0Sstevel@tonic-gate else \ 146*0Sstevel@tonic-gate kmem_cache_free((kc), (ps)); \ 147*0Sstevel@tonic-gate } 148*0Sstevel@tonic-gate 149*0Sstevel@tonic-gate /* externals from sp.c */ 150*0Sstevel@tonic-gate extern int sp_build_incore(void *, int); 151*0Sstevel@tonic-gate extern void reset_sp(mp_unit_t *, minor_t, int); 152*0Sstevel@tonic-gate extern int sp_directed_read(minor_t, vol_directed_rd_t *, int); 153*0Sstevel@tonic-gate 154*0Sstevel@tonic-gate /* externals from sp_ioctl.c */ 155*0Sstevel@tonic-gate extern int md_sp_ioctl(dev_t dev, int cmd, void *data, 156*0Sstevel@tonic-gate int mode, IOLOCK *lockp); 157*0Sstevel@tonic-gate 158*0Sstevel@tonic-gate #endif /* _KERNEL */ 159*0Sstevel@tonic-gate 160*0Sstevel@tonic-gate #ifdef __cplusplus 161*0Sstevel@tonic-gate } 162*0Sstevel@tonic-gate #endif 163*0Sstevel@tonic-gate 164*0Sstevel@tonic-gate #endif /* _SYS__MD_SP_H */ 165