Print this page
SUP-770 deadlock between thread acquiring iss->iss_lockp in stmf_task_free() and thread holding sl->sl_pgr->pgr_lock from sbd_pgr_remove_it_handle()
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>


  31 extern "C" {
  32 #endif
  33 
  34 typedef struct stmf_lun_map {
  35         uint32_t        lm_nluns;
  36         uint32_t        lm_nentries;
  37         void            **lm_plus; /* this can be lun or view entry */
  38 } stmf_lun_map_t;
  39 
  40 struct stmf_itl_data;
  41 
  42 typedef struct stmf_lun_map_ent {
  43         struct stmf_lu          *ent_lu;
  44         struct stmf_itl_data    *ent_itl_datap;
  45 } stmf_lun_map_ent_t;
  46 
  47 void stmf_view_init();
  48 void stmf_view_clear_config();
  49 stmf_status_t stmf_session_create_lun_map(stmf_i_local_port_t *ilport,
  50                 stmf_i_scsi_session_t *iss);
  51 stmf_status_t stmf_session_destroy_lun_map(stmf_i_local_port_t *ilport,
  52                 stmf_i_scsi_session_t *iss);
  53 stmf_xfer_data_t *stmf_session_prepare_report_lun_data(stmf_lun_map_t *sm);
  54 void stmf_add_lu_to_active_sessions(stmf_lu_t *lu);
  55 void stmf_session_lu_unmapall(stmf_lu_t *lu);
  56 void *stmf_get_ent_from_map(stmf_lun_map_t *sm, uint16_t lun_num);
  57 
  58 
  59 /*
  60  * Common struct used to maintain an Identifer's data. That Identifier
  61  * can be a Host group, Target group or LU GUID data. Note that a LU is
  62  * different from LU GUID data because either can be there without
  63  * its counterpart being present in the system.
  64  * id_impl_specific pointer to:
  65  * case LUID, a list of stmf_view_entry
  66  * case initiator group, a list of initiators
  67  * case target group, a list of targets
  68  * id_pt_to_object pointer to stmf_i_lu_t instance for LU.
  69  */
  70 typedef struct stmf_id_data {
  71         struct stmf_id_data             *id_next;
  72         struct stmf_id_data             *id_prev;




  31 extern "C" {
  32 #endif
  33 
  34 typedef struct stmf_lun_map {
  35         uint32_t        lm_nluns;
  36         uint32_t        lm_nentries;
  37         void            **lm_plus; /* this can be lun or view entry */
  38 } stmf_lun_map_t;
  39 
  40 struct stmf_itl_data;
  41 
  42 typedef struct stmf_lun_map_ent {
  43         struct stmf_lu          *ent_lu;
  44         struct stmf_itl_data    *ent_itl_datap;
  45 } stmf_lun_map_ent_t;
  46 
  47 void stmf_view_init();
  48 void stmf_view_clear_config();
  49 stmf_status_t stmf_session_create_lun_map(stmf_i_local_port_t *ilport,
  50                 stmf_i_scsi_session_t *iss);


  51 stmf_xfer_data_t *stmf_session_prepare_report_lun_data(stmf_lun_map_t *sm);
  52 void stmf_add_lu_to_active_sessions(stmf_lu_t *lu);
  53 void stmf_session_lu_unmapall(stmf_lu_t *lu);
  54 void *stmf_get_ent_from_map(stmf_lun_map_t *sm, uint16_t lun_num);
  55 
  56 
  57 /*
  58  * Common struct used to maintain an Identifer's data. That Identifier
  59  * can be a Host group, Target group or LU GUID data. Note that a LU is
  60  * different from LU GUID data because either can be there without
  61  * its counterpart being present in the system.
  62  * id_impl_specific pointer to:
  63  * case LUID, a list of stmf_view_entry
  64  * case initiator group, a list of initiators
  65  * case target group, a list of targets
  66  * id_pt_to_object pointer to stmf_i_lu_t instance for LU.
  67  */
  68 typedef struct stmf_id_data {
  69         struct stmf_id_data             *id_next;
  70         struct stmf_id_data             *id_prev;