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