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         SBD_RET_UNMAP_SET_FAILED,
  68 
  69         SBD_RET_MAX_VAL
  70 } sbd_ret_t;
  71 
  72 #define SBD_IOCTL_DEF(n)        ((((int)0x5B) << 16) | (n))
  73 #define SBD_IOCTL_CREATE_AND_REGISTER_LU                SBD_IOCTL_DEF(1)
  74 #define SBD_IOCTL_IMPORT_LU                             SBD_IOCTL_DEF(2)
  75 #define SBD_IOCTL_DELETE_LU                             SBD_IOCTL_DEF(3)
  76 #define SBD_IOCTL_MODIFY_LU                             SBD_IOCTL_DEF(4)
  77 #define SBD_IOCTL_GET_LU_PROPS                          SBD_IOCTL_DEF(5)
  78 #define SBD_IOCTL_GET_LU_LIST                           SBD_IOCTL_DEF(6)
  79 #define SBD_IOCTL_SET_LU_STANDBY                        SBD_IOCTL_DEF(7)
  80 #define SBD_IOCTL_SET_GLOBAL_LU                         SBD_IOCTL_DEF(8)
  81 #define SBD_IOCTL_GET_GLOBAL_LU                         SBD_IOCTL_DEF(9)
  82 #define SBD_IOCTL_GET_UNMAP_PROPS                       SBD_IOCTL_DEF(10)
  83 
  84 typedef struct sbd_create_and_reg_lu {
  85         uint32_t        slu_struct_size;
  86         uint32_t        slu_meta_fname_valid:1,
  87                         slu_lu_size_valid:1,
  88                         slu_blksize_valid:1,
  89                         slu_vid_valid:1,
  90                         slu_pid_valid:1,
  91                         slu_rev_valid:1,
  92                         slu_serial_valid:1,
  93                         slu_alias_valid:1,
  94                         slu_mgmt_url_valid:1,
  95                         slu_guid_valid:1,
  96                         slu_company_id_valid:1,
  97                         slu_host_id_valid:1,
  98                         slu_writeback_cache_disable_valid:1,
  99                         slu_writeback_cache_disable:1,
 100                         slu_write_protected:1,
 101                         slu_unmap_valid:1,
 102                         slu_unmap:1;
 103         uint32_t        slu_pad1;       /* To preserve 64-bit alignment */
 104         uint16_t        slu_pad2;       /* for the following fields. */
 105         uint16_t        slu_meta_fname_off;
 106         uint64_t        slu_lu_size;
 107         uint16_t        slu_data_fname_off;
 108         uint16_t        slu_serial_off;
 109         uint8_t         slu_serial_size;
 110         uint8_t         slu_ret_filesize_nbits;
 111         uint16_t        slu_blksize;
 112         uint32_t        slu_company_id;
 113         uint16_t        slu_alias_off;
 114         uint16_t        slu_mgmt_url_off;
 115         uint32_t        slu_host_id;
 116         char            slu_rev[4];
 117         char            slu_vid[8];
 118         char            slu_pid[16];
 119         uint8_t         slu_guid[16];
 120         char            slu_buf[8];     /* likely more than 8 */
 121 } sbd_create_and_reg_lu_t;
 122 
 123 typedef struct sbd_global_props {
 124         uint32_t        mlu_struct_size;
 125         uint32_t        mlu_vid_valid:1,
 126                         mlu_pid_valid:1,
 127                         mlu_rev_valid:1,
 128                         mlu_serial_valid:1,
 129                         mlu_mgmt_url_valid:1,
 130                         mlu_company_id_valid:1,
 131                         mlu_host_id_valid:1;
 132         uint16_t        mlu_serial_off;
 133         uint8_t         mlu_serial_size;
 134         uint8_t         mlu_rsvd1;
 135         uint32_t        mlu_company_id;
 136         uint16_t        mlu_mgmt_url_off;
 137         uint16_t        rsvd1;
 138         uint32_t        mlu_host_id;
 139         uint32_t        mlu_buf_size_needed;
 140         char            mlu_rev[4];
 141         char            mlu_vid[8];
 142         char            mlu_pid[16];
 143         char            mlu_buf[8];     /* likely more than 8 */
 144 } sbd_global_props_t;
 145 
 146 typedef struct sbd_set_lu_standby {
 147         uint8_t         stlu_guid[16];
 148 } sbd_set_lu_standby_t;
 149 
 150 
 151 typedef struct sbd_import_lu {
 152         uint32_t        ilu_struct_size;
 153         uint32_t        ilu_rsvd;
 154         uint8_t         ilu_ret_guid[16];
 155         char            ilu_meta_fname[8]; /* Can be more than 8 */
 156 } sbd_import_lu_t;
 157 
 158 typedef struct sbd_modify_lu {
 159         uint32_t        mlu_struct_size;
 160         uint32_t        mlu_lu_size_valid:1,
 161                         mlu_serial_valid:1,
 162                         mlu_alias_valid:1,
 163                         mlu_mgmt_url_valid:1,
 164                         mlu_writeback_cache_disable_valid:1,
 165                         mlu_writeback_cache_disable:1,
 166                         mlu_write_protected_valid:1,
 167                         mlu_write_protected:1,
 168                         mlu_by_guid:1,
 169                         mlu_by_fname:1,
 170                         mlu_standby_valid:1,
 171                         mlu_standby:1,
 172                         mlu_unmap_valid:1,
 173                         mlu_unmap:1;
 174         uint64_t        mlu_lu_size;
 175         uint16_t        mlu_alias_off;
 176         uint16_t        mlu_mgmt_url_off;
 177         uint16_t        mlu_serial_off;
 178         uint16_t        mlu_serial_size;
 179         uint16_t        mlu_fname_off;
 180         uint16_t        mlu_rsvd1;
 181         uint32_t        mlu_rsvd2;
 182         uint8_t         mlu_input_guid[16];
 183         char            mlu_buf[8]; /* can be more than 8 */
 184 } sbd_modify_lu_t;
 185 
 186 typedef struct sbd_delete_lu {
 187         uint32_t        dlu_struct_size;
 188         uint16_t        dlu_by_guid:1,
 189                         dlu_by_meta_name:1;
 190         uint16_t        dlu_rsvd;
 191         uint8_t         dlu_guid[16];
 192         uint8_t         dlu_meta_name[8];
 193 } sbd_delete_lu_t;
 194 
 195 /*
 196  * sbd access states
 197  */
 198 #define SBD_LU_ACTIVE                   1
 199 #define SBD_LU_TRANSITION_TO_ACTIVE     2
 200 #define SBD_LU_STANDBY                  3
 201 #define SBD_LU_TRANSITION_TO_STANDBY    4
 202 
 203 typedef struct sbd_lu_props {
 204         uint32_t        slp_input_guid:1,       /* GUID or meta filename */
 205                         slp_separate_meta:1,
 206                         slp_meta_fname_valid:1,
 207                         slp_data_fname_valid:1,
 208                         slp_zfs_meta:1,
 209                         slp_alias_valid:1,
 210                         slp_mgmt_url_valid:1,
 211                         slp_lu_vid:1,
 212                         slp_lu_pid:1,
 213                         slp_lu_rev:1,
 214                         slp_serial_valid:1,
 215                         slp_unmap_cur:1,
 216                         slp_unmap_saved:1,
 217                         slp_writeback_cache_disable_cur:1,
 218                         slp_writeback_cache_disable_saved:1,
 219                         slp_write_protected:1;
 220         uint16_t        slp_meta_fname_off;
 221         uint16_t        slp_data_fname_off;
 222         uint64_t        slp_lu_size;
 223         uint16_t        slp_serial_off;
 224         uint16_t        slp_blksize;
 225         uint16_t        slp_alias_off;
 226         uint16_t        slp_mgmt_url_off;
 227         uint32_t        slp_buf_size_needed;    /* Upon return */
 228         uint16_t        slp_serial_size;
 229         uint16_t        slp_access_state;
 230         char            slp_rev[4];
 231         char            slp_vid[8];
 232         char            slp_pid[16];
 233         uint8_t         slp_guid[16];
 234         uint8_t         slp_buf[8];     /* likely more than 8 */
 235 } sbd_lu_props_t;
 236 
 237 typedef struct sbd_unmap_props {
 238         uint32_t        sup_found_lu:1,
 239                         sup_zvol_path_valid:1,
 240                         sup_guid_valid:1,
 241                         sup_unmap_enabled;
 242         uint32_t        sup_rsvd;
 243         char            sup_zvol_path[256];
 244         uint8_t         sup_guid[16];
 245 } sbd_unmap_props_t;
 246 
 247 #ifdef  __cplusplus
 248 }
 249 #endif
 250 
 251 #endif /* _STMF_SBD_IOCTL_H */