1/* 2 * Copyright (c) HighPoint Technologies, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: releng/11.0/sys/dev/hptrr/array.h 176018 2008-02-06 01:02:20Z scottl $ 27 */ 28#include <dev/hptrr/hptrr_config.h> 29/* 30 * $Id: array.h,v 1.44 2007/11/01 03:05:27 gmm Exp $ 31 * Copyright (C) 2004-2005 HighPoint Technologies, Inc. All rights reserved. 32 */ 33#ifndef _HPT_ARRAY_H_ 34#define _HPT_ARRAY_H_ 35 36#define VERMAGIC_ARRAY 43 37 38#if defined(__cplusplus) 39extern "C" { 40#endif 41 42#define MAX_ARRAY_NAME 16 43 44#ifndef MAX_MEMBERS 45#define MAX_MEMBERS 16 46#endif 47 48#if MAX_MEMBERS<=16 49typedef HPT_U16 HPT_MMASK; 50#elif MAX_MEMBERS<=32 51typedef HPT_U32 HPT_MMASK; 52#elif MAX_MEMBERS<=64 53typedef HPT_U64 HPT_MMASK; 54#else 55#error "MAX_MEMBERS too large" 56#endif 57 58#define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x)) 59 60#if MAX_MEMBERS<32 61#define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x) 62#else 63#define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x)) 64#endif 65 66#define MAX_REBUILD_SECTORS 128 67 68typedef struct _RAID_FLAGS { 69 HPT_UINT rf_need_initialize : 1; 70 HPT_UINT rf_need_rebuild: 1; 71 HPT_UINT rf_need_sync: 1; 72 /* ioctl flags */ 73 HPT_UINT rf_auto_rebuild: 1; 74 HPT_UINT rf_rebuilding: 1; 75 HPT_UINT rf_verifying: 1; 76 HPT_UINT rf_initializing: 1; 77 HPT_UINT rf_abort_verifying: 1; 78 HPT_UINT rf_raid15: 1; 79 HPT_UINT rf_v3_format : 1; 80 HPT_UINT rf_need_transform : 1; 81 HPT_UINT rf_transforming : 1; 82 HPT_UINT rf_abort_transform : 1; 83 HPT_UINT rf_log_write: 1; 84} RAID_FLAGS; 85 86typedef struct transform_cmd_ext 87{ 88 HPT_LBA lba; 89 HPT_U16 total_sectors; 90 HPT_U16 finished_sectors; 91} TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT; 92 93 94#define TO_MOVE_DATA 0 95#define TO_INITIALIZE 1 96#define TO_INITIALIZE_ONLY 2 97#define TO_MOVE_DATA_ONLY 3 98typedef struct hpt_transform 99{ 100 HPT_U32 stamp; 101 PVDEV source; 102 PVDEV target; 103 struct list_head link; 104 HPT_U8 transform_from_tail; 105 struct tq_item task; 106 107 struct lock_request lock; 108 TRANSFORM_CMD_EXT cmdext; 109 110 HPT_U64 transform_point; 111 HPT_U16 transform_sectors_per_step; 112 HPT_U8 operation; 113 HPT_U8 disabled; 114} HPT_TRANSFORM, *PHPT_TRANSFORM; 115 116typedef struct hpt_array 117{ 118 HPT_U32 array_stamp; 119 HPT_U32 data_stamp; 120 121 HPT_U8 ndisk; 122 HPT_U8 block_size_shift; 123 HPT_U16 strip_width; 124 HPT_U8 sector_size_shift; /*sector size = 512B<<sector_size_shift*/ 125 HPT_U8 jid; 126 HPT_U8 reserved[2]; 127 128 129 HPT_MMASK outdated_members; 130 HPT_MMASK offline_members; 131 132 PVDEV member[MAX_MEMBERS]; 133 134 RAID_FLAGS flags; 135 136 HPT_U64 rebuilt_sectors; 137 138 139 HPT_U8 name[MAX_ARRAY_NAME]; 140 PHPT_TRANSFORM transform; 141 142 TIME_RECORD create_time; 143 HPT_U8 description[64]; 144 HPT_U8 create_manager[16]; 145 146#ifdef OS_SUPPORT_TASK 147 int floating_priority; 148 OSM_TASK ioctl_task; 149 IOCTL_ARG ioctl_arg; 150 151 char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)]; 152 char ioctl_outbuf[sizeof(HPT_UINT)]; 153#endif 154 155} HPT_ARRAY, *PHPT_ARRAY; 156 157#ifdef OS_SUPPORT_TASK 158void ldm_start_rebuild(struct _VDEV *pArray); 159#else 160#define ldm_start_rebuild(pArray) 161#endif 162 163typedef struct _raw_partition{ 164 struct _raw_partition * next; 165 __HPT_RAW_LBA start; 166 __HPT_RAW_LBA capacity; 167 PVDEV vd_part; 168} RAW_PARTITION, *PRAW_PARTITION; 169 170typedef struct hpt_partiton 171{ 172 PVDEV raw_disk; 173 __HPT_RAW_LBA des_location; 174 PRAW_PARTITION raw_part; 175 HPT_U8 del_mbr; 176 HPT_U8 reserved[3]; 177} HPT_PARTITION, *PHPT_PARTITION; 178 179HPT_U16 get_strip_size(PVDEV vd); 180 181void ldm_check_array_online(PVDEV pArray); 182void ldm_generic_member_failed(PVDEV member); 183void ldm_sync_array_info(PVDEV pArray); 184void ldm_sync_array_stamp(PVDEV pArray); 185void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition); 186 187#if defined(__cplusplus) 188} 189#endif 190#endif 191