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