xref: /dragonfly/sys/dev/raid/hptrr/array.h (revision 479ab7f0)
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: head/sys/dev/hptrr/array.h 176018 2008-02-06 01:02:20Z scottl $
27  */
28 #include <dev/raid/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)
39 extern "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
49 typedef HPT_U16 HPT_MMASK;
50 #elif MAX_MEMBERS<=32
51 typedef HPT_U32 HPT_MMASK;
52 #elif MAX_MEMBERS<=64
53 typedef 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 
68 typedef 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 
86 typedef 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
98 typedef 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 
116 typedef 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
158 void ldm_start_rebuild(struct _VDEV *pArray);
159 #else
160 #define ldm_start_rebuild(pArray)
161 #endif
162 
163 typedef 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 
170 typedef 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 
179 HPT_U16 get_strip_size(PVDEV vd);
180 
181 void ldm_check_array_online(PVDEV pArray);
182 void ldm_generic_member_failed(PVDEV member);
183 void ldm_sync_array_info(PVDEV pArray);
184 void ldm_sync_array_stamp(PVDEV pArray);
185 void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
186 
187 #if defined(__cplusplus)
188 }
189 #endif
190 #endif
191