1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  *
  25  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  26  */
  27 
  28 #ifndef _STMF_SBD_IOCTL_H
  29 #define _STMF_SBD_IOCTL_H
  30 
  31 #ifdef  __cplusplus
  32 extern "C" {
  33 #endif
  34 
  35 /*
  36  * error codes from sbd.
  37  */
  38 typedef enum sbd_ret {
  39         SBD_RET_META_CREATION_FAILED = 0x01,
  40         SBD_RET_INVALID_BLKSIZE,
  41         SBD_RET_REQUIRES_SEPARATE_META,
  42         SBD_RET_FILE_ALREADY_REGISTERED,
  43         SBD_RET_GUID_ALREADY_REGISTERED,
  44         SBD_RET_DATA_PATH_NOT_ABSOLUTE,
  45         SBD_RET_META_PATH_NOT_ABSOLUTE,
  46         SBD_RET_META_FILE_LOOKUP_FAILED,
  47         SBD_RET_ZFS_META_CREATE_FAILED,
  48         SBD_ZVOL_META_NAME_MISMATCH,
  49         SBD_RET_DATA_FILE_LOOKUP_FAILED,
  50         SBD_RET_WRONG_META_FILE_TYPE,
  51         SBD_RET_WRONG_DATA_FILE_TYPE,
  52         SBD_RET_DATA_FILE_OPEN_FAILED,
  53         SBD_RET_META_FILE_OPEN_FAILED,
  54         SBD_RET_DATA_FILE_GETATTR_FAILED,
  55         SBD_RET_META_FILE_GETATTR_FAILED,
  56         SBD_RET_FILE_SIZE_ERROR,
  57         SBD_RET_FILE_ALIGN_ERROR,
  58         SBD_RET_SIZE_OUT_OF_RANGE,
  59         SBD_RET_SIZE_NOT_SUPPORTED_BY_FS,
  60         SBD_RET_NO_META,
  61         SBD_RET_VERSION_NOT_SUPPORTED,
  62         SBD_RET_LU_BUSY,
  63         SBD_RET_NOT_FOUND,
  64         SBD_RET_INSUFFICIENT_BUF_SPACE,
  65         SBD_RET_WRITE_CACHE_SET_FAILED,
  66         SBD_RET_ACCESS_STATE_FAILED,
  67 
  68         SBD_RET_MAX_VAL
  69 } sbd_ret_t;
  70 
  71 #define SBD_IOCTL_DEF(n)        ((((int)0x5B) << 16) | (n))
  72 #define SBD_IOCTL_CREATE_AND_REGISTER_LU                SBD_IOCTL_DEF(1)
  73 #define SBD_IOCTL_IMPORT_LU                             SBD_IOCTL_DEF(2)
  74 #define SBD_IOCTL_DELETE_LU                             SBD_IOCTL_DEF(3)
  75 #define SBD_IOCTL_MODIFY_LU                             SBD_IOCTL_DEF(4)
  76 #define SBD_IOCTL_GET_LU_PROPS                          SBD_IOCTL_DEF(5)
  77 #define SBD_IOCTL_GET_LU_LIST                           SBD_IOCTL_DEF(6)
  78 #define SBD_IOCTL_SET_LU_STANDBY                        SBD_IOCTL_DEF(7)
  79 #define SBD_IOCTL_SET_GLOBAL_LU                         SBD_IOCTL_DEF(8)
  80 #define SBD_IOCTL_GET_GLOBAL_LU                         SBD_IOCTL_DEF(9)
  81 #define SBD_IOCTL_GET_UNMAP_PROPS                       SBD_IOCTL_DEF(10)
  82 
  83 typedef struct sbd_create_and_reg_lu {
  84         uint32_t        slu_struct_size;
  85         uint16_t        slu_meta_fname_valid:1,
  86                         slu_lu_size_valid:1,
  87                         slu_blksize_valid:1,
  88                         slu_vid_valid:1,
  89                         slu_pid_valid:1,
  90                         slu_rev_valid:1,
  91                         slu_serial_valid:1,
  92                         slu_alias_valid:1,
  93                         slu_mgmt_url_valid:1,
  94                         slu_guid_valid:1,
  95                         slu_company_id_valid:1,
  96                         slu_host_id_valid:1,
  97                         slu_writeback_cache_disable_valid:1,
  98                         slu_writeback_cache_disable:1,
  99                         slu_write_protected:1;
 100         uint16_t        slu_meta_fname_off;
 101         uint64_t        slu_lu_size;
 102         uint16_t        slu_data_fname_off;
 103         uint16_t        slu_serial_off;
 104         uint8_t         slu_serial_size;
 105         uint8_t         slu_ret_filesize_nbits;
 106         uint16_t        slu_blksize;
 107         uint32_t        slu_company_id;
 108         uint16_t        slu_alias_off;
 109         uint16_t        slu_mgmt_url_off;
 110         uint32_t        slu_host_id;
 111         char            slu_rev[4];
 112         char            slu_vid[8];
 113         char            slu_pid[16];
 114         uint8_t         slu_guid[16];
 115         char            slu_buf[8];     /* likely more than 8 */
 116 } sbd_create_and_reg_lu_t;
 117 
 118 typedef struct sbd_global_props {
 119         uint32_t        mlu_struct_size;
 120         uint32_t        mlu_vid_valid:1,
 121                         mlu_pid_valid:1,
 122                         mlu_rev_valid:1,
 123                         mlu_serial_valid:1,
 124                         mlu_mgmt_url_valid:1,
 125                         mlu_company_id_valid:1,
 126                         mlu_host_id_valid:1;
 127         uint16_t        mlu_serial_off;
 128         uint8_t         mlu_serial_size;
 129         uint8_t         mlu_rsvd1;
 130         uint32_t        mlu_company_id;
 131         uint16_t        mlu_mgmt_url_off;
 132         uint16_t        rsvd1;
 133         uint32_t        mlu_host_id;
 134         uint32_t        mlu_buf_size_needed;
 135         char            mlu_rev[4];
 136         char            mlu_vid[8];
 137         char            mlu_pid[16];
 138         char            mlu_buf[8];     /* likely more than 8 */
 139 } sbd_global_props_t;
 140 
 141 typedef struct sbd_set_lu_standby {
 142         uint8_t         stlu_guid[16];
 143 } sbd_set_lu_standby_t;
 144 
 145 
 146 typedef struct sbd_import_lu {
 147         uint32_t        ilu_struct_size;
 148         uint32_t        ilu_rsvd;
 149         uint8_t         ilu_ret_guid[16];
 150         char            ilu_meta_fname[8]; /* Can be more than 8 */
 151 } sbd_import_lu_t;
 152 
 153 typedef struct sbd_modify_lu {
 154         uint32_t        mlu_struct_size;
 155         uint32_t        mlu_lu_size_valid:1,
 156                         mlu_serial_valid:1,
 157                         mlu_alias_valid:1,
 158                         mlu_mgmt_url_valid:1,
 159                         mlu_writeback_cache_disable_valid:1,
 160                         mlu_writeback_cache_disable:1,
 161                         mlu_write_protected_valid:1,
 162                         mlu_write_protected:1,
 163                         mlu_by_guid:1,
 164                         mlu_by_fname:1,
 165                         mlu_standby_valid:1,
 166                         mlu_standby:1;
 167         uint64_t        mlu_lu_size;
 168         uint16_t        mlu_alias_off;
 169         uint16_t        mlu_mgmt_url_off;
 170         uint16_t        mlu_serial_off;
 171         uint16_t        mlu_serial_size;
 172         uint16_t        mlu_fname_off;
 173         uint16_t        mlu_rsvd1;
 174         uint32_t        mlu_rsvd2;
 175         uint8_t         mlu_input_guid[16];
 176         char            mlu_buf[8]; /* can be more than 8 */
 177 } sbd_modify_lu_t;
 178 
 179 typedef struct sbd_delete_lu {
 180         uint32_t        dlu_struct_size;
 181         uint16_t        dlu_by_guid:1,
 182                         dlu_by_meta_name:1;
 183         uint16_t        dlu_rsvd;
 184         uint8_t         dlu_guid[16];
 185         uint8_t         dlu_meta_name[8];
 186 } sbd_delete_lu_t;
 187 
 188 /*
 189  * sbd access states
 190  */
 191 #define SBD_LU_ACTIVE                   1
 192 #define SBD_LU_TRANSITION_TO_ACTIVE     2
 193 #define SBD_LU_STANDBY                  3
 194 #define SBD_LU_TRANSITION_TO_STANDBY    4
 195 
 196 typedef struct sbd_lu_props {
 197         uint32_t        slp_input_guid:1,       /* GUID or meta filename */
 198                         slp_separate_meta:1,
 199                         slp_meta_fname_valid:1,
 200                         slp_data_fname_valid:1,
 201                         slp_zfs_meta:1,
 202                         slp_alias_valid:1,
 203                         slp_mgmt_url_valid:1,
 204                         slp_lu_vid:1,
 205                         slp_lu_pid:1,
 206                         slp_lu_rev:1,
 207                         slp_serial_valid:1,
 208                         slp_writeback_cache_disable_cur:1,
 209                         slp_writeback_cache_disable_saved:1,
 210                         slp_write_protected:1;
 211         uint16_t        slp_meta_fname_off;
 212         uint16_t        slp_data_fname_off;
 213         uint64_t        slp_lu_size;
 214         uint16_t        slp_serial_off;
 215         uint16_t        slp_blksize;
 216         uint16_t        slp_alias_off;
 217         uint16_t        slp_mgmt_url_off;
 218         uint32_t        slp_buf_size_needed;    /* Upon return */
 219         uint16_t        slp_serial_size;
 220         uint16_t        slp_access_state;
 221         char            slp_rev[4];
 222         char            slp_vid[8];
 223         char            slp_pid[16];
 224         uint8_t         slp_guid[16];
 225         uint8_t         slp_buf[8];     /* likely more than 8 */
 226 } sbd_lu_props_t;
 227 
 228 typedef struct sbd_unmap_props {
 229         uint32_t        sup_found_lu:1,
 230                         sup_zvol_path_valid:1,
 231                         sup_guid_valid:1,
 232                         sup_unmap_enabled;
 233         uint32_t        sup_rsvd;
 234         char            sup_zvol_path[256];
 235         uint8_t         sup_guid[16];
 236 } sbd_unmap_props_t;
 237 
 238 #ifdef  __cplusplus
 239 }
 240 #endif
 241 
 242 #endif /* _STMF_SBD_IOCTL_H */