array.h revision 174604
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 174604 2007-12-15 00:56:17Z scottl $
27 */
28#include <dev/hptrr/hptrr_config.h>
29/*
30 * $Id: array.h,v 1.40 2007/03/12 10:05:44 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 40
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
125
126	HPT_MMASK outdated_members;
127	HPT_MMASK offline_members;
128
129	PVDEV member[MAX_MEMBERS];
130
131	RAID_FLAGS flags;
132
133	HPT_U64 rebuilt_sectors;
134
135
136	HPT_U8 name[MAX_ARRAY_NAME];
137	PHPT_TRANSFORM transform;
138
139	TIME_RECORD create_time;
140	HPT_U8  description[64];
141	HPT_U8  create_manager[16];
142
143#ifdef OS_SUPPORT_TASK
144	int floating_priority;
145	OSM_TASK ioctl_task;
146	IOCTL_ARG ioctl_arg;
147
148	char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
149	char ioctl_outbuf[sizeof(HPT_UINT)];
150#endif
151
152} HPT_ARRAY, *PHPT_ARRAY;
153
154#ifdef OS_SUPPORT_TASK
155void ldm_start_rebuild(struct _VDEV *pArray);
156#else
157#define ldm_start_rebuild(pArray)
158#endif
159
160typedef struct _raw_partition{
161	struct _raw_partition * next;
162	HPT_RAW_LBA start;
163	HPT_RAW_LBA capacity;
164	PVDEV   vd_part;
165} RAW_PARTITION, *PRAW_PARTITION;
166
167typedef struct hpt_partiton
168{
169	PVDEV raw_disk;
170	HPT_RAW_LBA des_location;
171	PRAW_PARTITION raw_part;
172	HPT_U8  del_mbr;
173	HPT_U8  reserved[3];
174} HPT_PARTITION, *PHPT_PARTITION;
175
176HPT_U16 get_strip_size(PVDEV vd);
177
178void ldm_check_array_online(PVDEV pArray);
179void ldm_generic_member_failed(PVDEV member);
180void ldm_sync_array_info(PVDEV pArray);
181void ldm_sync_array_stamp(PVDEV pArray);
182void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
183
184#if defined(__cplusplus)
185}
186#endif
187#endif
188