1993 }
1994
1995 /*
1996 * Update the zvol separately as this need only be called upon
1997 * completion of the metadata initialization.
1998 */
1999 if (sl->sl_flags & SL_ZFS_META) {
2000 if (sbd_update_zfs_prop(sl) != SBD_SUCCESS) {
2001 *err_ret = SBD_RET_META_CREATION_FAILED;
2002 ret = EIO;
2003 goto scm_err_out;
2004 }
2005 }
2006
2007 ret = sbd_populate_and_register_lu(sl, err_ret);
2008 if (ret) {
2009 goto scm_err_out;
2010 }
2011
2012 sl->sl_trans_op = SL_OP_NONE;
2013 atomic_add_32(&sbd_lu_count, 1);
2014 return (0);
2015
2016 scm_err_out:
2017 return (sbd_close_delete_lu(sl, ret));
2018 }
2019
2020 stmf_status_t
2021 sbd_proxy_msg(uint8_t *luid, void *proxy_arg, uint32_t proxy_arg_len,
2022 uint32_t type)
2023 {
2024 switch (type) {
2025 case STMF_MSG_LU_ACTIVE:
2026 return (sbd_proxy_reg_lu(luid, proxy_arg,
2027 proxy_arg_len));
2028 case STMF_MSG_LU_REGISTER:
2029 return (sbd_proxy_reg_lu(luid, proxy_arg,
2030 proxy_arg_len));
2031 case STMF_MSG_LU_DEREGISTER:
2032 return (sbd_proxy_dereg_lu(luid, proxy_arg,
2033 proxy_arg_len));
2167
2168 rw_init(&sl->sl_pgr->pgr_lock, NULL, RW_DRIVER, NULL);
2169 mutex_init(&sl->sl_lock, NULL, MUTEX_DRIVER, NULL);
2170 mutex_init(&sl->sl_metadata_lock, NULL, MUTEX_DRIVER, NULL);
2171 rw_init(&sl->sl_access_state_lock, NULL, RW_DRIVER, NULL);
2172
2173 sl->sl_trans_op = SL_OP_CREATE_REGISTER_LU;
2174
2175 if (sbd_link_lu(sl) != SBD_SUCCESS) {
2176 *err_ret = SBD_RET_FILE_ALREADY_REGISTERED;
2177 ret = EALREADY;
2178 goto scs_err_out;
2179 }
2180
2181 ret = sbd_populate_and_register_lu(sl, err_ret);
2182 if (ret) {
2183 goto scs_err_out;
2184 }
2185
2186 sl->sl_trans_op = SL_OP_NONE;
2187 atomic_add_32(&sbd_lu_count, 1);
2188 return (0);
2189
2190 scs_err_out:
2191 return (sbd_close_delete_lu(sl, ret));
2192 }
2193
2194 int
2195 sbd_load_sli_1_0(sbd_lu_t *sl, uint32_t *err_ret)
2196 {
2197 sbd_lu_info_1_0_t *sli = NULL;
2198 sbd_status_t sret;
2199
2200 sret = sbd_read_meta_section(sl, (sm_section_hdr_t **)&sli,
2201 SMS_ID_LU_INFO_1_0);
2202
2203 if (sret != SBD_SUCCESS) {
2204 *err_ret = SBD_RET_NO_META;
2205 return (EIO);
2206 }
2207 if (sli->sli_data_order != SMS_DATA_ORDER) {
2526 * get the current setting and use that
2527 */
2528 } else {
2529 sret = sbd_wcd_set(0, sl);
2530 if (sret != SBD_SUCCESS) {
2531 sbd_wcd_get(&wcd, sl);
2532 }
2533 }
2534
2535 if (wcd) {
2536 sl->sl_flags |= SL_WRITEBACK_CACHE_DISABLE |
2537 SL_SAVED_WRITE_CACHE_DISABLE;
2538 }
2539
2540 /* we're only loading the metadata */
2541 if (!no_register) {
2542 ret = sbd_populate_and_register_lu(sl, err_ret);
2543 if (ret) {
2544 goto sim_err_out;
2545 }
2546 atomic_add_32(&sbd_lu_count, 1);
2547 }
2548
2549 bcopy(sl->sl_device_id + 4, ilu->ilu_ret_guid, 16);
2550 sl->sl_trans_op = SL_OP_NONE;
2551
2552 if (sli) {
2553 kmem_free(sli, sli->sli_sms_header.sms_size);
2554 sli = NULL;
2555 }
2556 if (sli_buf_copy) {
2557 kmem_free(sli_buf_copy, sli_buf_sz + 1);
2558 sli_buf_copy = NULL;
2559 }
2560 if (no_register && !standby) {
2561 *slr = sl;
2562 }
2563
2564 /*
2565 * if this was imported from standby, set the access state
2566 * to active.
2932 return (EBUSY);
2933 }
2934
2935 ret = stmf_ctl(STMF_CMD_LU_OFFLINE, sl->sl_lu, ssi);
2936 if ((ret != STMF_SUCCESS) && (ret != STMF_ALREADY)) {
2937 return (EBUSY);
2938 }
2939
2940 for (i = 0; i < 500; i++) {
2941 if ((sl->sl_state == STMF_STATE_OFFLINE) &&
2942 !sl->sl_state_not_acked) {
2943 goto sdl_do_dereg;
2944 }
2945 delay(drv_usectohz(10000));
2946 }
2947 return (EBUSY);
2948
2949 sdl_do_dereg:;
2950 if (stmf_deregister_lu(sl->sl_lu) != STMF_SUCCESS)
2951 return (EBUSY);
2952 atomic_add_32(&sbd_lu_count, -1);
2953
2954 return (sbd_close_delete_lu(sl, 0));
2955 }
2956
2957 int
2958 sbd_delete_lu(sbd_delete_lu_t *dlu, int struct_sz, uint32_t *err_ret)
2959 {
2960 sbd_lu_t *sl;
2961 sbd_status_t sret;
2962 stmf_state_change_info_t ssi;
2963 int ret;
2964
2965 if (dlu->dlu_by_meta_name) {
2966 ((char *)dlu)[struct_sz - 1] = 0;
2967 sret = sbd_find_and_lock_lu(NULL, dlu->dlu_meta_name,
2968 SL_OP_DELETE_LU, &sl);
2969 } else {
2970 sret = sbd_find_and_lock_lu(dlu->dlu_guid, NULL,
2971 SL_OP_DELETE_LU, &sl);
2972 }
|
1993 }
1994
1995 /*
1996 * Update the zvol separately as this need only be called upon
1997 * completion of the metadata initialization.
1998 */
1999 if (sl->sl_flags & SL_ZFS_META) {
2000 if (sbd_update_zfs_prop(sl) != SBD_SUCCESS) {
2001 *err_ret = SBD_RET_META_CREATION_FAILED;
2002 ret = EIO;
2003 goto scm_err_out;
2004 }
2005 }
2006
2007 ret = sbd_populate_and_register_lu(sl, err_ret);
2008 if (ret) {
2009 goto scm_err_out;
2010 }
2011
2012 sl->sl_trans_op = SL_OP_NONE;
2013 atomic_inc_32(&sbd_lu_count);
2014 return (0);
2015
2016 scm_err_out:
2017 return (sbd_close_delete_lu(sl, ret));
2018 }
2019
2020 stmf_status_t
2021 sbd_proxy_msg(uint8_t *luid, void *proxy_arg, uint32_t proxy_arg_len,
2022 uint32_t type)
2023 {
2024 switch (type) {
2025 case STMF_MSG_LU_ACTIVE:
2026 return (sbd_proxy_reg_lu(luid, proxy_arg,
2027 proxy_arg_len));
2028 case STMF_MSG_LU_REGISTER:
2029 return (sbd_proxy_reg_lu(luid, proxy_arg,
2030 proxy_arg_len));
2031 case STMF_MSG_LU_DEREGISTER:
2032 return (sbd_proxy_dereg_lu(luid, proxy_arg,
2033 proxy_arg_len));
2167
2168 rw_init(&sl->sl_pgr->pgr_lock, NULL, RW_DRIVER, NULL);
2169 mutex_init(&sl->sl_lock, NULL, MUTEX_DRIVER, NULL);
2170 mutex_init(&sl->sl_metadata_lock, NULL, MUTEX_DRIVER, NULL);
2171 rw_init(&sl->sl_access_state_lock, NULL, RW_DRIVER, NULL);
2172
2173 sl->sl_trans_op = SL_OP_CREATE_REGISTER_LU;
2174
2175 if (sbd_link_lu(sl) != SBD_SUCCESS) {
2176 *err_ret = SBD_RET_FILE_ALREADY_REGISTERED;
2177 ret = EALREADY;
2178 goto scs_err_out;
2179 }
2180
2181 ret = sbd_populate_and_register_lu(sl, err_ret);
2182 if (ret) {
2183 goto scs_err_out;
2184 }
2185
2186 sl->sl_trans_op = SL_OP_NONE;
2187 atomic_inc_32(&sbd_lu_count);
2188 return (0);
2189
2190 scs_err_out:
2191 return (sbd_close_delete_lu(sl, ret));
2192 }
2193
2194 int
2195 sbd_load_sli_1_0(sbd_lu_t *sl, uint32_t *err_ret)
2196 {
2197 sbd_lu_info_1_0_t *sli = NULL;
2198 sbd_status_t sret;
2199
2200 sret = sbd_read_meta_section(sl, (sm_section_hdr_t **)&sli,
2201 SMS_ID_LU_INFO_1_0);
2202
2203 if (sret != SBD_SUCCESS) {
2204 *err_ret = SBD_RET_NO_META;
2205 return (EIO);
2206 }
2207 if (sli->sli_data_order != SMS_DATA_ORDER) {
2526 * get the current setting and use that
2527 */
2528 } else {
2529 sret = sbd_wcd_set(0, sl);
2530 if (sret != SBD_SUCCESS) {
2531 sbd_wcd_get(&wcd, sl);
2532 }
2533 }
2534
2535 if (wcd) {
2536 sl->sl_flags |= SL_WRITEBACK_CACHE_DISABLE |
2537 SL_SAVED_WRITE_CACHE_DISABLE;
2538 }
2539
2540 /* we're only loading the metadata */
2541 if (!no_register) {
2542 ret = sbd_populate_and_register_lu(sl, err_ret);
2543 if (ret) {
2544 goto sim_err_out;
2545 }
2546 atomic_inc_32(&sbd_lu_count);
2547 }
2548
2549 bcopy(sl->sl_device_id + 4, ilu->ilu_ret_guid, 16);
2550 sl->sl_trans_op = SL_OP_NONE;
2551
2552 if (sli) {
2553 kmem_free(sli, sli->sli_sms_header.sms_size);
2554 sli = NULL;
2555 }
2556 if (sli_buf_copy) {
2557 kmem_free(sli_buf_copy, sli_buf_sz + 1);
2558 sli_buf_copy = NULL;
2559 }
2560 if (no_register && !standby) {
2561 *slr = sl;
2562 }
2563
2564 /*
2565 * if this was imported from standby, set the access state
2566 * to active.
2932 return (EBUSY);
2933 }
2934
2935 ret = stmf_ctl(STMF_CMD_LU_OFFLINE, sl->sl_lu, ssi);
2936 if ((ret != STMF_SUCCESS) && (ret != STMF_ALREADY)) {
2937 return (EBUSY);
2938 }
2939
2940 for (i = 0; i < 500; i++) {
2941 if ((sl->sl_state == STMF_STATE_OFFLINE) &&
2942 !sl->sl_state_not_acked) {
2943 goto sdl_do_dereg;
2944 }
2945 delay(drv_usectohz(10000));
2946 }
2947 return (EBUSY);
2948
2949 sdl_do_dereg:;
2950 if (stmf_deregister_lu(sl->sl_lu) != STMF_SUCCESS)
2951 return (EBUSY);
2952 atomic_dec_32(&sbd_lu_count);
2953
2954 return (sbd_close_delete_lu(sl, 0));
2955 }
2956
2957 int
2958 sbd_delete_lu(sbd_delete_lu_t *dlu, int struct_sz, uint32_t *err_ret)
2959 {
2960 sbd_lu_t *sl;
2961 sbd_status_t sret;
2962 stmf_state_change_info_t ssi;
2963 int ret;
2964
2965 if (dlu->dlu_by_meta_name) {
2966 ((char *)dlu)[struct_sz - 1] = 0;
2967 sret = sbd_find_and_lock_lu(NULL, dlu->dlu_meta_name,
2968 SL_OP_DELETE_LU, &sl);
2969 } else {
2970 sret = sbd_find_and_lock_lu(dlu->dlu_guid, NULL,
2971 SL_OP_DELETE_LU, &sl);
2972 }
|