1 /* $Id: array.h,v 1.46 2010/02/05 06:57:43 mah Exp $ */
3 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
5 * Copyright (C) 2004-2011 HighPoint Technologies, Inc.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 #include <dev/hptnr/hptnr_config.h>
35 #define VERMAGIC_ARRAY 46
37 #if defined(__cplusplus)
41 #define MAX_ARRAY_NAME 16
44 #define MAX_MEMBERS 16
48 typedef HPT_U16 HPT_MMASK;
50 typedef HPT_U32 HPT_MMASK;
52 typedef HPT_U64 HPT_MMASK;
54 #error "MAX_MEMBERS too large"
57 #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
60 #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
62 #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
65 #define MAX_REBUILD_SECTORS 128
67 typedef struct _RAID_FLAGS {
68 HPT_UINT rf_need_initialize : 1;
69 HPT_UINT rf_need_rebuild: 1;
70 HPT_UINT rf_need_sync: 1;
72 HPT_UINT rf_auto_rebuild: 1;
73 HPT_UINT rf_rebuilding: 1;
74 HPT_UINT rf_verifying: 1;
75 HPT_UINT rf_initializing: 1;
76 HPT_UINT rf_abort_verifying: 1;
77 HPT_UINT rf_raid15: 1;
78 HPT_UINT rf_v3_format : 1;
79 HPT_UINT rf_need_transform : 1;
80 HPT_UINT rf_transforming : 1;
81 HPT_UINT rf_abort_transform : 1;
82 HPT_UINT rf_log_write: 1;
85 typedef struct transform_cmd_ext
88 HPT_U16 total_sectors;
89 HPT_U16 finished_sectors;
90 } TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT;
93 #define TO_MOVE_DATA 0
94 #define TO_INITIALIZE 1
95 #define TO_INITIALIZE_ONLY 2
96 #define TO_MOVE_DATA_ONLY 3
97 typedef struct hpt_transform
102 struct list_head link;
103 HPT_U8 transform_from_tail;
106 struct lock_request lock;
107 TRANSFORM_CMD_EXT cmdext;
109 HPT_U64 transform_point;
110 HPT_U16 transform_sectors_per_step;
113 } HPT_TRANSFORM, *PHPT_TRANSFORM;
115 typedef struct hpt_array
122 HPT_U8 block_size_shift;
124 HPT_U8 sector_size_shift; /*sector size = 512B<<sector_size_shift*/
129 HPT_MMASK outdated_members;
130 HPT_MMASK offline_members;
132 PVDEV member[MAX_MEMBERS];
136 HPT_U64 rebuilt_sectors;
139 HPT_U8 name[MAX_ARRAY_NAME];
140 PHPT_TRANSFORM transform;
142 TIME_RECORD create_time;
143 HPT_U8 description[64];
144 HPT_U8 create_manager[16];
146 #ifdef OS_SUPPORT_TASK
147 int floating_priority;
151 char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
152 char ioctl_outbuf[sizeof(HPT_UINT)];
155 } HPT_ARRAY, *PHPT_ARRAY;
157 #ifdef OS_SUPPORT_TASK
158 void ldm_start_rebuild(struct _VDEV *pArray);
160 #define ldm_start_rebuild(pArray)
163 typedef struct _raw_partition{
164 struct _raw_partition * next;
166 __HPT_RAW_LBA capacity;
168 } RAW_PARTITION, *PRAW_PARTITION;
170 typedef struct hpt_partiton
173 __HPT_RAW_LBA des_location;
174 PRAW_PARTITION raw_part;
177 } HPT_PARTITION, *PHPT_PARTITION;
179 void ldm_check_array_online(PVDEV pArray);
180 void ldm_generic_member_failed(PVDEV member);
181 void ldm_sync_array_info(PVDEV pArray);
182 void ldm_sync_array_stamp(PVDEV pArray);
183 void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
185 #if defined(__cplusplus)