11fdeb165SXin LI /* $Id: array.h,v 1.46 2010/02/05 06:57:43 mah Exp $ */ 21fdeb165SXin LI /*- 34d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 4718cf2ccSPedro F. Giffuni * 51fdeb165SXin LI * Copyright (C) 2004-2011 HighPoint Technologies, Inc. 61fdeb165SXin LI * All rights reserved. 71fdeb165SXin LI * 81fdeb165SXin LI * Redistribution and use in source and binary forms, with or without 91fdeb165SXin LI * modification, are permitted provided that the following conditions 101fdeb165SXin LI * are met: 111fdeb165SXin LI * 1. Redistributions of source code must retain the above copyright 121fdeb165SXin LI * notice, this list of conditions and the following disclaimer. 131fdeb165SXin LI * 2. Redistributions in binary form must reproduce the above copyright 141fdeb165SXin LI * notice, this list of conditions and the following disclaimer in the 151fdeb165SXin LI * documentation and/or other materials provided with the distribution. 161fdeb165SXin LI * 171fdeb165SXin LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 181fdeb165SXin LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191fdeb165SXin LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201fdeb165SXin LI * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 211fdeb165SXin LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221fdeb165SXin LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231fdeb165SXin LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241fdeb165SXin LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251fdeb165SXin LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261fdeb165SXin LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271fdeb165SXin LI * SUCH DAMAGE. 281fdeb165SXin LI * 291fdeb165SXin LI */ 301fdeb165SXin LI #include <dev/hptnr/hptnr_config.h> 311fdeb165SXin LI #ifndef _HPT_ARRAY_H_ 321fdeb165SXin LI #define _HPT_ARRAY_H_ 331fdeb165SXin LI 341fdeb165SXin LI #define VERMAGIC_ARRAY 46 351fdeb165SXin LI 361fdeb165SXin LI #if defined(__cplusplus) 371fdeb165SXin LI extern "C" { 381fdeb165SXin LI #endif 391fdeb165SXin LI 401fdeb165SXin LI #define MAX_ARRAY_NAME 16 411fdeb165SXin LI 421fdeb165SXin LI #ifndef MAX_MEMBERS 431fdeb165SXin LI #define MAX_MEMBERS 16 441fdeb165SXin LI #endif 451fdeb165SXin LI 461fdeb165SXin LI #if MAX_MEMBERS<=16 471fdeb165SXin LI typedef HPT_U16 HPT_MMASK; 481fdeb165SXin LI #elif MAX_MEMBERS<=32 491fdeb165SXin LI typedef HPT_U32 HPT_MMASK; 501fdeb165SXin LI #elif MAX_MEMBERS<=64 511fdeb165SXin LI typedef HPT_U64 HPT_MMASK; 521fdeb165SXin LI #else 531fdeb165SXin LI #error "MAX_MEMBERS too large" 541fdeb165SXin LI #endif 551fdeb165SXin LI 561fdeb165SXin LI #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x)) 571fdeb165SXin LI 581fdeb165SXin LI #if MAX_MEMBERS<32 591fdeb165SXin LI #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x) 601fdeb165SXin LI #else 611fdeb165SXin LI #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x)) 621fdeb165SXin LI #endif 631fdeb165SXin LI 641fdeb165SXin LI #define MAX_REBUILD_SECTORS 128 651fdeb165SXin LI 661fdeb165SXin LI typedef struct _RAID_FLAGS { 671fdeb165SXin LI HPT_UINT rf_need_initialize : 1; 681fdeb165SXin LI HPT_UINT rf_need_rebuild: 1; 691fdeb165SXin LI HPT_UINT rf_need_sync: 1; 701fdeb165SXin LI /* ioctl flags */ 711fdeb165SXin LI HPT_UINT rf_auto_rebuild: 1; 721fdeb165SXin LI HPT_UINT rf_rebuilding: 1; 731fdeb165SXin LI HPT_UINT rf_verifying: 1; 741fdeb165SXin LI HPT_UINT rf_initializing: 1; 751fdeb165SXin LI HPT_UINT rf_abort_verifying: 1; 761fdeb165SXin LI HPT_UINT rf_raid15: 1; 771fdeb165SXin LI HPT_UINT rf_v3_format : 1; 781fdeb165SXin LI HPT_UINT rf_need_transform : 1; 791fdeb165SXin LI HPT_UINT rf_transforming : 1; 801fdeb165SXin LI HPT_UINT rf_abort_transform : 1; 811fdeb165SXin LI HPT_UINT rf_log_write: 1; 821fdeb165SXin LI } RAID_FLAGS; 831fdeb165SXin LI 841fdeb165SXin LI typedef struct transform_cmd_ext 851fdeb165SXin LI { 861fdeb165SXin LI HPT_LBA lba; 871fdeb165SXin LI HPT_U16 total_sectors; 881fdeb165SXin LI HPT_U16 finished_sectors; 891fdeb165SXin LI } TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT; 901fdeb165SXin LI 911fdeb165SXin LI 921fdeb165SXin LI #define TO_MOVE_DATA 0 931fdeb165SXin LI #define TO_INITIALIZE 1 941fdeb165SXin LI #define TO_INITIALIZE_ONLY 2 951fdeb165SXin LI #define TO_MOVE_DATA_ONLY 3 961fdeb165SXin LI typedef struct hpt_transform 971fdeb165SXin LI { 981fdeb165SXin LI HPT_U32 stamp; 991fdeb165SXin LI PVDEV source; 1001fdeb165SXin LI PVDEV target; 1011fdeb165SXin LI struct list_head link; 1021fdeb165SXin LI HPT_U8 transform_from_tail; 1031fdeb165SXin LI struct tq_item task; 1041fdeb165SXin LI 1051fdeb165SXin LI struct lock_request lock; 1061fdeb165SXin LI TRANSFORM_CMD_EXT cmdext; 1071fdeb165SXin LI 1081fdeb165SXin LI HPT_U64 transform_point; 1091fdeb165SXin LI HPT_U16 transform_sectors_per_step; 1101fdeb165SXin LI HPT_U8 operation; 1111fdeb165SXin LI HPT_U8 disabled; 1121fdeb165SXin LI } HPT_TRANSFORM, *PHPT_TRANSFORM; 1131fdeb165SXin LI 1141fdeb165SXin LI typedef struct hpt_array 1151fdeb165SXin LI { 1161fdeb165SXin LI HPT_U32 array_stamp; 1171fdeb165SXin LI HPT_U32 data_stamp; 1181fdeb165SXin LI HPT_U32 array_sn; 1191fdeb165SXin LI 1201fdeb165SXin LI HPT_U8 ndisk; 1211fdeb165SXin LI HPT_U8 block_size_shift; 1221fdeb165SXin LI HPT_U16 strip_width; 1231fdeb165SXin LI HPT_U8 sector_size_shift; /*sector size = 512B<<sector_size_shift*/ 1241fdeb165SXin LI HPT_U8 jid; 1251fdeb165SXin LI HPT_U8 reserved[2]; 1261fdeb165SXin LI 1271fdeb165SXin LI 1281fdeb165SXin LI HPT_MMASK outdated_members; 1291fdeb165SXin LI HPT_MMASK offline_members; 1301fdeb165SXin LI 1311fdeb165SXin LI PVDEV member[MAX_MEMBERS]; 1321fdeb165SXin LI 1331fdeb165SXin LI RAID_FLAGS flags; 1341fdeb165SXin LI 1351fdeb165SXin LI HPT_U64 rebuilt_sectors; 1361fdeb165SXin LI 1371fdeb165SXin LI 1381fdeb165SXin LI HPT_U8 name[MAX_ARRAY_NAME]; 1391fdeb165SXin LI PHPT_TRANSFORM transform; 1401fdeb165SXin LI 1411fdeb165SXin LI TIME_RECORD create_time; 1421fdeb165SXin LI HPT_U8 description[64]; 1431fdeb165SXin LI HPT_U8 create_manager[16]; 1441fdeb165SXin LI 1451fdeb165SXin LI #ifdef OS_SUPPORT_TASK 1461fdeb165SXin LI int floating_priority; 1471fdeb165SXin LI OSM_TASK ioctl_task; 1481fdeb165SXin LI IOCTL_ARG ioctl_arg; 1491fdeb165SXin LI 1501fdeb165SXin LI char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)]; 1511fdeb165SXin LI char ioctl_outbuf[sizeof(HPT_UINT)]; 1521fdeb165SXin LI #endif 1531fdeb165SXin LI 1541fdeb165SXin LI } HPT_ARRAY, *PHPT_ARRAY; 1551fdeb165SXin LI 1561fdeb165SXin LI #ifdef OS_SUPPORT_TASK 1571fdeb165SXin LI void ldm_start_rebuild(struct _VDEV *pArray); 1581fdeb165SXin LI #else 1591fdeb165SXin LI #define ldm_start_rebuild(pArray) 1601fdeb165SXin LI #endif 1611fdeb165SXin LI 1621fdeb165SXin LI typedef struct _raw_partition{ 1631fdeb165SXin LI struct _raw_partition * next; 1641fdeb165SXin LI __HPT_RAW_LBA start; 1651fdeb165SXin LI __HPT_RAW_LBA capacity; 1661fdeb165SXin LI PVDEV vd_part; 1671fdeb165SXin LI } RAW_PARTITION, *PRAW_PARTITION; 1681fdeb165SXin LI 1691fdeb165SXin LI typedef struct hpt_partiton 1701fdeb165SXin LI { 1711fdeb165SXin LI PVDEV raw_disk; 1721fdeb165SXin LI __HPT_RAW_LBA des_location; 1731fdeb165SXin LI PRAW_PARTITION raw_part; 1741fdeb165SXin LI HPT_U8 del_mbr; 1751fdeb165SXin LI HPT_U8 reserved[3]; 1761fdeb165SXin LI } HPT_PARTITION, *PHPT_PARTITION; 1771fdeb165SXin LI 1781fdeb165SXin LI void ldm_check_array_online(PVDEV pArray); 1791fdeb165SXin LI void ldm_generic_member_failed(PVDEV member); 1801fdeb165SXin LI void ldm_sync_array_info(PVDEV pArray); 1811fdeb165SXin LI void ldm_sync_array_stamp(PVDEV pArray); 1821fdeb165SXin LI void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition); 1831fdeb165SXin LI 1841fdeb165SXin LI #if defined(__cplusplus) 1851fdeb165SXin LI } 1861fdeb165SXin LI #endif 1871fdeb165SXin LI #endif 188