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 5*8452SJohn.Wren.Kennedy@Sun.COM * Common Development and Distribution License (the "License"). 6*8452SJohn.Wren.Kennedy@Sun.COM * 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 */ 21*8452SJohn.Wren.Kennedy@Sun.COM 220Sstevel@tonic-gate /* 23*8452SJohn.Wren.Kennedy@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 240Sstevel@tonic-gate * Use is subject to license terms. 250Sstevel@tonic-gate */ 260Sstevel@tonic-gate 270Sstevel@tonic-gate #ifndef _SYS__MD_SP_H 280Sstevel@tonic-gate #define _SYS__MD_SP_H 290Sstevel@tonic-gate 300Sstevel@tonic-gate #include <sys/lvm/mdvar.h> 310Sstevel@tonic-gate 320Sstevel@tonic-gate #ifdef __cplusplus 330Sstevel@tonic-gate extern "C" { 340Sstevel@tonic-gate #endif 350Sstevel@tonic-gate 360Sstevel@tonic-gate #define META_SP_DEBUG ("META_SP_DEBUG") 370Sstevel@tonic-gate 380Sstevel@tonic-gate /* on-disk structures */ 390Sstevel@tonic-gate #define MD_SP_MAGIC (0x20000127) 400Sstevel@tonic-gate /* number of sectors to reserve at the beginning of the volume */ 410Sstevel@tonic-gate #define MD_SP_START (0) 420Sstevel@tonic-gate /* current watermark version number */ 430Sstevel@tonic-gate #define MD_SP_VERSION (1) 440Sstevel@tonic-gate /* size of a watermark in sectors */ 450Sstevel@tonic-gate #define MD_SP_WMSIZE (1) 460Sstevel@tonic-gate /* free watermark name */ 470Sstevel@tonic-gate #define MD_SP_FREEWMNAME "free" 480Sstevel@tonic-gate /* local set name */ 490Sstevel@tonic-gate #define MD_SP_LOCALSETNAME "" 500Sstevel@tonic-gate /* maximum length of a soft partition metadevice name. eg. dXXXX\0 */ 510Sstevel@tonic-gate #define MD_SP_MAX_DEVNAME_PLUS_1 (6) 520Sstevel@tonic-gate 530Sstevel@tonic-gate /* 540Sstevel@tonic-gate * The size of this structure is forced to be 512 bytes (ie a sector) by 550Sstevel@tonic-gate * using a union. Note the MD_MAX_SETNAME_PLUS_1 is set in meta_basic.h 560Sstevel@tonic-gate */ 570Sstevel@tonic-gate 580Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 590Sstevel@tonic-gate #pragma pack(4) 600Sstevel@tonic-gate #endif 610Sstevel@tonic-gate typedef union mp_watermark { 620Sstevel@tonic-gate struct { 630Sstevel@tonic-gate uint32_t wm_magic; /* magic number */ 640Sstevel@tonic-gate uint32_t wm_version; /* version number */ 650Sstevel@tonic-gate uint32_t wm_checksum; /* structure checksum */ 660Sstevel@tonic-gate uint32_t wm_seq; /* sequence number */ 670Sstevel@tonic-gate uint32_t wm_type; /* extent type */ 680Sstevel@tonic-gate uint64_t wm_length; /* length of extent */ 690Sstevel@tonic-gate char wm_mdname[MD_MAX_SETNAME_PLUS_1 + 700Sstevel@tonic-gate MD_SP_MAX_DEVNAME_PLUS_1]; /* SP name */ 710Sstevel@tonic-gate char wm_setname[MD_MAX_SETNAME_PLUS_1]; /* setname */ 720Sstevel@tonic-gate } wm; 730Sstevel@tonic-gate uchar_t wm_pad[MD_SP_WMSIZE * DEV_BSIZE]; 740Sstevel@tonic-gate } mp_watermark_t; 750Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 760Sstevel@tonic-gate #pragma pack() 770Sstevel@tonic-gate #endif 780Sstevel@tonic-gate 790Sstevel@tonic-gate #define wm_magic wm.wm_magic 800Sstevel@tonic-gate #define wm_version wm.wm_version 810Sstevel@tonic-gate #define wm_checksum wm.wm_checksum 820Sstevel@tonic-gate #define wm_seq wm.wm_seq 830Sstevel@tonic-gate #define wm_type wm.wm_type 840Sstevel@tonic-gate #define wm_length wm.wm_length 850Sstevel@tonic-gate #define wm_mdname wm.wm_mdname 860Sstevel@tonic-gate #define wm_setname wm.wm_setname 870Sstevel@tonic-gate 880Sstevel@tonic-gate /* Watermark types */ 890Sstevel@tonic-gate typedef enum sp_ext_type { 900Sstevel@tonic-gate EXTTYP_ALLOC = 0x1, /* this extent is in use by a soft partition */ 910Sstevel@tonic-gate EXTTYP_FREE = 0x2, /* extent is not in use */ 920Sstevel@tonic-gate EXTTYP_END = 0x3, /* last descriptor on the volume */ 930Sstevel@tonic-gate EXTTYP_RESERVED = 0x4 /* extent will not be used or updated */ 940Sstevel@tonic-gate } sp_ext_type_t; 950Sstevel@tonic-gate 960Sstevel@tonic-gate /* ioctls */ 970Sstevel@tonic-gate #define MD_IOC_SPSTATUS (MDIOC_MISC|0) 980Sstevel@tonic-gate #define MD_IOC_SPUPDATEWM (MDIOC_MISC|1) 990Sstevel@tonic-gate #define MD_IOC_SPREADWM (MDIOC_MISC|2) 100*8452SJohn.Wren.Kennedy@Sun.COM #define MD_MN_IOC_SPUPDATEWM (MDIOC_MISC|3) 1010Sstevel@tonic-gate 1020Sstevel@tonic-gate #ifdef _KERNEL 1030Sstevel@tonic-gate 1040Sstevel@tonic-gate /* 1050Sstevel@tonic-gate * parent and child save areas provide the mechanism for tracking 1060Sstevel@tonic-gate * I/O operations in the metadevice stack. 1070Sstevel@tonic-gate */ 1080Sstevel@tonic-gate 1090Sstevel@tonic-gate /* soft partitioning parent save area */ 1100Sstevel@tonic-gate typedef struct md_spps { /* soft partition parent save */ 1110Sstevel@tonic-gate DAEMON_QUEUE 1120Sstevel@tonic-gate mp_unit_t *ps_un; /* sp unit structure */ 1130Sstevel@tonic-gate mdi_unit_t *ps_ui; /* incore unit struct */ 1140Sstevel@tonic-gate buf_t *ps_bp; /* parent buffer */ 1150Sstevel@tonic-gate caddr_t ps_addr; 1160Sstevel@tonic-gate int ps_frags; 1170Sstevel@tonic-gate int ps_flags; 1180Sstevel@tonic-gate /* 1190Sstevel@tonic-gate * New structure members should be added here; fields added 1200Sstevel@tonic-gate * after ps_mx will not be zeroed during initialization. 1210Sstevel@tonic-gate */ 1220Sstevel@tonic-gate kmutex_t ps_mx; 1230Sstevel@tonic-gate } md_spps_t; 1240Sstevel@tonic-gate 1250Sstevel@tonic-gate /* parent save flags. */ 1260Sstevel@tonic-gate #define MD_SPPS_ERROR 0x0001 1270Sstevel@tonic-gate #define MD_SPPS_DONTFREE 0x0002 1280Sstevel@tonic-gate #define MD_SPPS_DONE 0x0004 1290Sstevel@tonic-gate 1300Sstevel@tonic-gate /* soft partitioning child save area */ 1310Sstevel@tonic-gate typedef struct md_spcs { 1320Sstevel@tonic-gate DAEMON_QUEUE 1330Sstevel@tonic-gate minor_t cs_mdunit; /* child minor number */ 1340Sstevel@tonic-gate md_spps_t *cs_ps; /* parent save pointer */ 1350Sstevel@tonic-gate /* Add new structure members HERE!! */ 1360Sstevel@tonic-gate buf_t cs_buf; /* child buffer */ 1370Sstevel@tonic-gate /* DO NOT add struture members here; cs_buf is dynamically sized */ 1380Sstevel@tonic-gate } md_spcs_t; 1390Sstevel@tonic-gate 1400Sstevel@tonic-gate #define SPPS_FREE(kc, ps) \ 1410Sstevel@tonic-gate { \ 1420Sstevel@tonic-gate if ((ps)->ps_flags & MD_SPPS_DONTFREE) \ 1430Sstevel@tonic-gate (ps)->ps_flags |= MD_SPPS_DONE; \ 1440Sstevel@tonic-gate else \ 1450Sstevel@tonic-gate kmem_cache_free((kc), (ps)); \ 1460Sstevel@tonic-gate } 1470Sstevel@tonic-gate 1480Sstevel@tonic-gate /* externals from sp.c */ 1490Sstevel@tonic-gate extern int sp_build_incore(void *, int); 1500Sstevel@tonic-gate extern void reset_sp(mp_unit_t *, minor_t, int); 1510Sstevel@tonic-gate extern int sp_directed_read(minor_t, vol_directed_rd_t *, int); 1520Sstevel@tonic-gate 1530Sstevel@tonic-gate /* externals from sp_ioctl.c */ 1540Sstevel@tonic-gate extern int md_sp_ioctl(dev_t dev, int cmd, void *data, 1550Sstevel@tonic-gate int mode, IOLOCK *lockp); 1560Sstevel@tonic-gate 1570Sstevel@tonic-gate #endif /* _KERNEL */ 1580Sstevel@tonic-gate 1590Sstevel@tonic-gate #ifdef __cplusplus 1600Sstevel@tonic-gate } 1610Sstevel@tonic-gate #endif 1620Sstevel@tonic-gate 1630Sstevel@tonic-gate #endif /* _SYS__MD_SP_H */ 164