xref: /dflybsd-src/sys/dev/raid/hptrr/array.h (revision 22d266d8035c9d6ab6fbb31195b633b7bbf262a5)
10e32bd08SSascha Wildner /*
20e32bd08SSascha Wildner  * Copyright (c) HighPoint Technologies, Inc.
30e32bd08SSascha Wildner  * All rights reserved.
40e32bd08SSascha Wildner  *
50e32bd08SSascha Wildner  * Redistribution and use in source and binary forms, with or without
60e32bd08SSascha Wildner  * modification, are permitted provided that the following conditions
70e32bd08SSascha Wildner  * are met:
80e32bd08SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
90e32bd08SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
100e32bd08SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
110e32bd08SSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
120e32bd08SSascha Wildner  *    documentation and/or other materials provided with the distribution.
130e32bd08SSascha Wildner  *
140e32bd08SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
150e32bd08SSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
160e32bd08SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
170e32bd08SSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
180e32bd08SSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
190e32bd08SSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
200e32bd08SSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
210e32bd08SSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
220e32bd08SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
230e32bd08SSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
240e32bd08SSascha Wildner  * SUCH DAMAGE.
250e32bd08SSascha Wildner  *
26*22d266d8SSascha Wildner  * $FreeBSD: head/sys/dev/hptrr/array.h 176018 2008-02-06 01:02:20Z scottl $
270e32bd08SSascha Wildner  */
280e32bd08SSascha Wildner #include <dev/raid/hptrr/hptrr_config.h>
290e32bd08SSascha Wildner /*
300e32bd08SSascha Wildner  * $Id: array.h,v 1.44 2007/11/01 03:05:27 gmm Exp $
310e32bd08SSascha Wildner  * Copyright (C) 2004-2005 HighPoint Technologies, Inc. All rights reserved.
320e32bd08SSascha Wildner  */
330e32bd08SSascha Wildner #ifndef _HPT_ARRAY_H_
340e32bd08SSascha Wildner #define _HPT_ARRAY_H_
350e32bd08SSascha Wildner 
360e32bd08SSascha Wildner #define VERMAGIC_ARRAY 43
370e32bd08SSascha Wildner 
380e32bd08SSascha Wildner #if defined(__cplusplus)
390e32bd08SSascha Wildner extern "C" {
400e32bd08SSascha Wildner #endif
410e32bd08SSascha Wildner 
420e32bd08SSascha Wildner #define MAX_ARRAY_NAME 16
430e32bd08SSascha Wildner 
440e32bd08SSascha Wildner #ifndef MAX_MEMBERS
450e32bd08SSascha Wildner #define MAX_MEMBERS    16
460e32bd08SSascha Wildner #endif
470e32bd08SSascha Wildner 
480e32bd08SSascha Wildner #if MAX_MEMBERS<=16
490e32bd08SSascha Wildner typedef HPT_U16 HPT_MMASK;
500e32bd08SSascha Wildner #elif MAX_MEMBERS<=32
510e32bd08SSascha Wildner typedef HPT_U32 HPT_MMASK;
520e32bd08SSascha Wildner #elif MAX_MEMBERS<=64
530e32bd08SSascha Wildner typedef HPT_U64 HPT_MMASK;
540e32bd08SSascha Wildner #else
550e32bd08SSascha Wildner #error "MAX_MEMBERS too large"
560e32bd08SSascha Wildner #endif
570e32bd08SSascha Wildner 
580e32bd08SSascha Wildner #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
590e32bd08SSascha Wildner 
600e32bd08SSascha Wildner #if MAX_MEMBERS<32
610e32bd08SSascha Wildner #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
620e32bd08SSascha Wildner #else
630e32bd08SSascha Wildner #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
640e32bd08SSascha Wildner #endif
650e32bd08SSascha Wildner 
660e32bd08SSascha Wildner #define MAX_REBUILD_SECTORS 128
670e32bd08SSascha Wildner 
680e32bd08SSascha Wildner typedef struct _RAID_FLAGS {
690e32bd08SSascha Wildner 	HPT_UINT rf_need_initialize : 1;
700e32bd08SSascha Wildner 	HPT_UINT rf_need_rebuild: 1;
710e32bd08SSascha Wildner 	HPT_UINT rf_need_sync: 1;
720e32bd08SSascha Wildner 	/* ioctl flags */
730e32bd08SSascha Wildner 	HPT_UINT rf_auto_rebuild: 1;
740e32bd08SSascha Wildner 	HPT_UINT rf_rebuilding: 1;
750e32bd08SSascha Wildner 	HPT_UINT rf_verifying: 1;
760e32bd08SSascha Wildner 	HPT_UINT rf_initializing: 1;
770e32bd08SSascha Wildner 	HPT_UINT rf_abort_verifying: 1;
780e32bd08SSascha Wildner 	HPT_UINT rf_raid15: 1;
790e32bd08SSascha Wildner 	HPT_UINT rf_v3_format : 1;
800e32bd08SSascha Wildner 	HPT_UINT rf_need_transform : 1;
810e32bd08SSascha Wildner 	HPT_UINT rf_transforming : 1;
820e32bd08SSascha Wildner 	HPT_UINT rf_abort_transform : 1;
830e32bd08SSascha Wildner 	HPT_UINT rf_log_write: 1;
840e32bd08SSascha Wildner } RAID_FLAGS;
850e32bd08SSascha Wildner 
860e32bd08SSascha Wildner typedef struct transform_cmd_ext
870e32bd08SSascha Wildner {
880e32bd08SSascha Wildner 	HPT_LBA lba;
890e32bd08SSascha Wildner 	HPT_U16 total_sectors;
900e32bd08SSascha Wildner 	HPT_U16 finished_sectors;
910e32bd08SSascha Wildner } TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT;
920e32bd08SSascha Wildner 
930e32bd08SSascha Wildner 
940e32bd08SSascha Wildner #define TO_MOVE_DATA        0
950e32bd08SSascha Wildner #define TO_INITIALIZE       1
960e32bd08SSascha Wildner #define TO_INITIALIZE_ONLY  2
970e32bd08SSascha Wildner #define TO_MOVE_DATA_ONLY   3
980e32bd08SSascha Wildner typedef struct hpt_transform
990e32bd08SSascha Wildner {
1000e32bd08SSascha Wildner 	HPT_U32 stamp;
1010e32bd08SSascha Wildner 	PVDEV source;
1020e32bd08SSascha Wildner 	PVDEV target;
1030e32bd08SSascha Wildner 	struct list_head link;
1040e32bd08SSascha Wildner 	HPT_U8 transform_from_tail;
1050e32bd08SSascha Wildner 	struct tq_item task;
1060e32bd08SSascha Wildner 
1070e32bd08SSascha Wildner 	struct lock_request lock;
1080e32bd08SSascha Wildner 	TRANSFORM_CMD_EXT cmdext;
1090e32bd08SSascha Wildner 
1100e32bd08SSascha Wildner 	HPT_U64 transform_point;
1110e32bd08SSascha Wildner 	HPT_U16 transform_sectors_per_step;
1120e32bd08SSascha Wildner 	HPT_U8  operation;
1130e32bd08SSascha Wildner 	HPT_U8  disabled;
1140e32bd08SSascha Wildner } HPT_TRANSFORM, *PHPT_TRANSFORM;
1150e32bd08SSascha Wildner 
1160e32bd08SSascha Wildner typedef struct hpt_array
1170e32bd08SSascha Wildner {
1180e32bd08SSascha Wildner 	HPT_U32 array_stamp;
1190e32bd08SSascha Wildner 	HPT_U32 data_stamp;
1200e32bd08SSascha Wildner 
1210e32bd08SSascha Wildner 	HPT_U8  ndisk;
1220e32bd08SSascha Wildner 	HPT_U8  block_size_shift;
1230e32bd08SSascha Wildner 	HPT_U16 strip_width;
1240e32bd08SSascha Wildner 	HPT_U8  sector_size_shift; /*sector size = 512B<<sector_size_shift*/
1250e32bd08SSascha Wildner 	HPT_U8  jid;
1260e32bd08SSascha Wildner 	HPT_U8  reserved[2];
1270e32bd08SSascha Wildner 
1280e32bd08SSascha Wildner 
1290e32bd08SSascha Wildner 	HPT_MMASK outdated_members;
1300e32bd08SSascha Wildner 	HPT_MMASK offline_members;
1310e32bd08SSascha Wildner 
1320e32bd08SSascha Wildner 	PVDEV member[MAX_MEMBERS];
1330e32bd08SSascha Wildner 
1340e32bd08SSascha Wildner 	RAID_FLAGS flags;
1350e32bd08SSascha Wildner 
1360e32bd08SSascha Wildner 	HPT_U64 rebuilt_sectors;
1370e32bd08SSascha Wildner 
1380e32bd08SSascha Wildner 
1390e32bd08SSascha Wildner 	HPT_U8 name[MAX_ARRAY_NAME];
1400e32bd08SSascha Wildner 	PHPT_TRANSFORM transform;
1410e32bd08SSascha Wildner 
1420e32bd08SSascha Wildner 	TIME_RECORD create_time;
1430e32bd08SSascha Wildner 	HPT_U8  description[64];
1440e32bd08SSascha Wildner 	HPT_U8  create_manager[16];
1450e32bd08SSascha Wildner 
1460e32bd08SSascha Wildner #ifdef OS_SUPPORT_TASK
1470e32bd08SSascha Wildner 	int floating_priority;
1480e32bd08SSascha Wildner 	OSM_TASK ioctl_task;
1490e32bd08SSascha Wildner 	IOCTL_ARG ioctl_arg;
1500e32bd08SSascha Wildner 
1510e32bd08SSascha Wildner 	char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
1520e32bd08SSascha Wildner 	char ioctl_outbuf[sizeof(HPT_UINT)];
1530e32bd08SSascha Wildner #endif
1540e32bd08SSascha Wildner 
1550e32bd08SSascha Wildner } HPT_ARRAY, *PHPT_ARRAY;
1560e32bd08SSascha Wildner 
1570e32bd08SSascha Wildner #ifdef OS_SUPPORT_TASK
1580e32bd08SSascha Wildner void ldm_start_rebuild(struct _VDEV *pArray);
1590e32bd08SSascha Wildner #else
1600e32bd08SSascha Wildner #define ldm_start_rebuild(pArray)
1610e32bd08SSascha Wildner #endif
1620e32bd08SSascha Wildner 
1630e32bd08SSascha Wildner typedef struct _raw_partition{
1640e32bd08SSascha Wildner 	struct _raw_partition * next;
1650e32bd08SSascha Wildner 	__HPT_RAW_LBA start;
1660e32bd08SSascha Wildner 	__HPT_RAW_LBA capacity;
1670e32bd08SSascha Wildner 	PVDEV   vd_part;
1680e32bd08SSascha Wildner } RAW_PARTITION, *PRAW_PARTITION;
1690e32bd08SSascha Wildner 
1700e32bd08SSascha Wildner typedef struct hpt_partiton
1710e32bd08SSascha Wildner {
1720e32bd08SSascha Wildner 	PVDEV raw_disk;
1730e32bd08SSascha Wildner 	__HPT_RAW_LBA des_location;
1740e32bd08SSascha Wildner 	PRAW_PARTITION raw_part;
1750e32bd08SSascha Wildner 	HPT_U8  del_mbr;
1760e32bd08SSascha Wildner 	HPT_U8  reserved[3];
1770e32bd08SSascha Wildner } HPT_PARTITION, *PHPT_PARTITION;
1780e32bd08SSascha Wildner 
1790e32bd08SSascha Wildner HPT_U16 get_strip_size(PVDEV vd);
1800e32bd08SSascha Wildner 
1810e32bd08SSascha Wildner void ldm_check_array_online(PVDEV pArray);
1820e32bd08SSascha Wildner void ldm_generic_member_failed(PVDEV member);
1830e32bd08SSascha Wildner void ldm_sync_array_info(PVDEV pArray);
1840e32bd08SSascha Wildner void ldm_sync_array_stamp(PVDEV pArray);
1850e32bd08SSascha Wildner void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
1860e32bd08SSascha Wildner 
1870e32bd08SSascha Wildner #if defined(__cplusplus)
1880e32bd08SSascha Wildner }
1890e32bd08SSascha Wildner #endif
1900e32bd08SSascha Wildner #endif
191