Print this page
5045 use atomic_{inc,dec}_* instead of atomic_add_*


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         }