Lines Matching refs:pg

85 	struct alua_port_group __rcu *pg;  member
103 static bool alua_rtpg_queue(struct alua_port_group *pg,
110 struct alua_port_group *pg; in release_port_group() local
112 pg = container_of(kref, struct alua_port_group, kref); in release_port_group()
113 if (pg->rtpg_sdev) in release_port_group()
114 flush_delayed_work(&pg->rtpg_work); in release_port_group()
116 list_del(&pg->node); in release_port_group()
118 kfree_rcu(pg, rcu); in release_port_group()
181 struct alua_port_group *pg; in alua_find_get_pg() local
186 list_for_each_entry(pg, &port_group_list, node) { in alua_find_get_pg()
187 if (pg->group_id != group_id) in alua_find_get_pg()
189 if (!pg->device_id_len || pg->device_id_len != id_size) in alua_find_get_pg()
191 if (strncmp(pg->device_id_str, id_str, id_size)) in alua_find_get_pg()
193 if (!kref_get_unless_zero(&pg->kref)) in alua_find_get_pg()
195 return pg; in alua_find_get_pg()
213 struct alua_port_group *pg, *tmp_pg; in alua_alloc_pg() local
215 pg = kzalloc(sizeof(struct alua_port_group), GFP_KERNEL); in alua_alloc_pg()
216 if (!pg) in alua_alloc_pg()
219 pg->device_id_len = scsi_vpd_lun_id(sdev, pg->device_id_str, in alua_alloc_pg()
220 sizeof(pg->device_id_str)); in alua_alloc_pg()
221 if (pg->device_id_len <= 0) { in alua_alloc_pg()
229 pg->device_id_str[0] = '\0'; in alua_alloc_pg()
230 pg->device_id_len = 0; in alua_alloc_pg()
232 pg->group_id = group_id; in alua_alloc_pg()
233 pg->tpgs = tpgs; in alua_alloc_pg()
234 pg->state = SCSI_ACCESS_STATE_OPTIMAL; in alua_alloc_pg()
235 pg->valid_states = TPGS_SUPPORT_ALL; in alua_alloc_pg()
237 pg->flags |= ALUA_OPTIMIZE_STPG; in alua_alloc_pg()
238 kref_init(&pg->kref); in alua_alloc_pg()
239 INIT_DELAYED_WORK(&pg->rtpg_work, alua_rtpg_work); in alua_alloc_pg()
240 INIT_LIST_HEAD(&pg->rtpg_list); in alua_alloc_pg()
241 INIT_LIST_HEAD(&pg->node); in alua_alloc_pg()
242 INIT_LIST_HEAD(&pg->dh_list); in alua_alloc_pg()
243 spin_lock_init(&pg->lock); in alua_alloc_pg()
246 tmp_pg = alua_find_get_pg(pg->device_id_str, pg->device_id_len, in alua_alloc_pg()
250 kfree(pg); in alua_alloc_pg()
254 list_add(&pg->node, &port_group_list); in alua_alloc_pg()
257 return pg; in alua_alloc_pg()
323 struct alua_port_group *pg, *old_pg = NULL; in alua_check_vpd() local
340 pg = alua_alloc_pg(sdev, group_id, tpgs); in alua_check_vpd()
341 if (IS_ERR(pg)) { in alua_check_vpd()
342 if (PTR_ERR(pg) == -ENOMEM) in alua_check_vpd()
346 if (pg->device_id_len) in alua_check_vpd()
349 ALUA_DH_NAME, pg->device_id_str, in alua_check_vpd()
358 old_pg = rcu_dereference_protected(h->pg, lockdep_is_held(&h->pg_lock)); in alua_check_vpd()
359 if (old_pg != pg) { in alua_check_vpd()
361 if (h->pg) { in alua_check_vpd()
366 rcu_assign_pointer(h->pg, pg); in alua_check_vpd()
370 spin_lock_irqsave(&pg->lock, flags); in alua_check_vpd()
372 list_add_rcu(&h->node, &pg->dh_list); in alua_check_vpd()
373 spin_unlock_irqrestore(&pg->lock, flags); in alua_check_vpd()
375 alua_rtpg_queue(rcu_dereference_protected(h->pg, in alua_check_vpd()
505 static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg) in alua_rtpg() argument
517 if (!pg->expiry) { in alua_rtpg()
520 if (pg->transition_tmo) in alua_rtpg()
521 transition_tmo = pg->transition_tmo * HZ; in alua_rtpg()
523 pg->expiry = round_jiffies_up(jiffies + transition_tmo); in alua_rtpg()
532 retval = submit_rtpg(sdev, buff, bufflen, &sense_hdr, pg->flags); in alua_rtpg()
544 if ((pg->valid_states & ~TPGS_SUPPORT_OPTIMIZED) == 0) { in alua_rtpg()
569 if (!(pg->flags & ALUA_RTPG_EXT_HDR_UNSUPP) && in alua_rtpg()
572 pg->flags |= ALUA_RTPG_EXT_HDR_UNSUPP; in alua_rtpg()
591 pg->expiry != 0 && time_before(jiffies, pg->expiry)) { in alua_rtpg()
602 pg->expiry = 0; in alua_rtpg()
617 pg->expiry = 0; in alua_rtpg()
623 orig_transition_tmo = pg->transition_tmo; in alua_rtpg()
625 pg->transition_tmo = buff[5]; in alua_rtpg()
627 pg->transition_tmo = ALUA_FAILOVER_TIMEOUT; in alua_rtpg()
629 if (orig_transition_tmo != pg->transition_tmo) { in alua_rtpg()
632 ALUA_DH_NAME, pg->transition_tmo); in alua_rtpg()
633 pg->expiry = jiffies + pg->transition_tmo * HZ; in alua_rtpg()
647 tmp_pg = alua_find_get_pg(pg->device_id_str, pg->device_id_len, in alua_rtpg()
652 if ((tmp_pg == pg) || in alua_rtpg()
667 if (tmp_pg == pg) in alua_rtpg()
677 spin_lock_irqsave(&pg->lock, flags); in alua_rtpg()
679 pg->state = SCSI_ACCESS_STATE_TRANSITIONING; in alua_rtpg()
683 ALUA_DH_NAME, pg->group_id, print_alua_state(pg->state), in alua_rtpg()
684 pg->pref ? "preferred" : "non-preferred", in alua_rtpg()
685 pg->valid_states&TPGS_SUPPORT_TRANSITION?'T':'t', in alua_rtpg()
686 pg->valid_states&TPGS_SUPPORT_OFFLINE?'O':'o', in alua_rtpg()
687 pg->valid_states&TPGS_SUPPORT_LBA_DEPENDENT?'L':'l', in alua_rtpg()
688 pg->valid_states&TPGS_SUPPORT_UNAVAILABLE?'U':'u', in alua_rtpg()
689 pg->valid_states&TPGS_SUPPORT_STANDBY?'S':'s', in alua_rtpg()
690 pg->valid_states&TPGS_SUPPORT_NONOPTIMIZED?'N':'n', in alua_rtpg()
691 pg->valid_states&TPGS_SUPPORT_OPTIMIZED?'A':'a'); in alua_rtpg()
693 switch (pg->state) { in alua_rtpg()
695 if (time_before(jiffies, pg->expiry)) { in alua_rtpg()
697 pg->interval = ALUA_RTPG_RETRY_DELAY; in alua_rtpg()
704 pg->state = SCSI_ACCESS_STATE_STANDBY; in alua_rtpg()
705 pg->expiry = 0; in alua_rtpg()
707 list_for_each_entry_rcu(h, &pg->dh_list, node) { in alua_rtpg()
710 (pg->state & SCSI_ACCESS_STATE_MASK); in alua_rtpg()
711 if (pg->pref) in alua_rtpg()
721 pg->expiry = 0; in alua_rtpg()
726 pg->expiry = 0; in alua_rtpg()
729 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg()
742 static unsigned alua_stpg(struct scsi_device *sdev, struct alua_port_group *pg) in alua_stpg() argument
747 if (!(pg->tpgs & TPGS_MODE_EXPLICIT)) { in alua_stpg()
751 switch (pg->state) { in alua_stpg()
755 if ((pg->flags & ALUA_OPTIMIZE_STPG) && in alua_stpg()
756 !pg->pref && in alua_stpg()
757 (pg->tpgs & TPGS_MODE_IMPLICIT)) in alua_stpg()
770 ALUA_DH_NAME, pg->state); in alua_stpg()
773 retval = submit_stpg(sdev, pg->group_id, &sense_hdr); in alua_stpg()
794 struct alua_port_group *pg = in alua_rtpg_work() local
802 spin_lock_irqsave(&pg->lock, flags); in alua_rtpg_work()
803 sdev = pg->rtpg_sdev; in alua_rtpg_work()
805 WARN_ON(pg->flags & ALUA_PG_RUN_RTPG); in alua_rtpg_work()
806 WARN_ON(pg->flags & ALUA_PG_RUN_STPG); in alua_rtpg_work()
807 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
808 kref_put(&pg->kref, release_port_group); in alua_rtpg_work()
811 pg->flags |= ALUA_PG_RUNNING; in alua_rtpg_work()
812 if (pg->flags & ALUA_PG_RUN_RTPG) { in alua_rtpg_work()
813 int state = pg->state; in alua_rtpg_work()
815 pg->flags &= ~ALUA_PG_RUN_RTPG; in alua_rtpg_work()
816 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
819 spin_lock_irqsave(&pg->lock, flags); in alua_rtpg_work()
820 pg->flags &= ~ALUA_PG_RUNNING; in alua_rtpg_work()
821 pg->flags |= ALUA_PG_RUN_RTPG; in alua_rtpg_work()
822 if (!pg->interval) in alua_rtpg_work()
823 pg->interval = ALUA_RTPG_RETRY_DELAY; in alua_rtpg_work()
824 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
825 queue_delayed_work(kaluad_wq, &pg->rtpg_work, in alua_rtpg_work()
826 pg->interval * HZ); in alua_rtpg_work()
831 err = alua_rtpg(sdev, pg); in alua_rtpg_work()
832 spin_lock_irqsave(&pg->lock, flags); in alua_rtpg_work()
833 if (err == SCSI_DH_RETRY || pg->flags & ALUA_PG_RUN_RTPG) { in alua_rtpg_work()
834 pg->flags &= ~ALUA_PG_RUNNING; in alua_rtpg_work()
835 if (!pg->interval && !(pg->flags & ALUA_PG_RUN_RTPG)) in alua_rtpg_work()
836 pg->interval = ALUA_RTPG_RETRY_DELAY; in alua_rtpg_work()
837 pg->flags |= ALUA_PG_RUN_RTPG; in alua_rtpg_work()
838 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
839 queue_delayed_work(kaluad_wq, &pg->rtpg_work, in alua_rtpg_work()
840 pg->interval * HZ); in alua_rtpg_work()
844 pg->flags &= ~ALUA_PG_RUN_STPG; in alua_rtpg_work()
846 if (pg->flags & ALUA_PG_RUN_STPG) { in alua_rtpg_work()
847 pg->flags &= ~ALUA_PG_RUN_STPG; in alua_rtpg_work()
848 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
849 err = alua_stpg(sdev, pg); in alua_rtpg_work()
850 spin_lock_irqsave(&pg->lock, flags); in alua_rtpg_work()
851 if (err == SCSI_DH_RETRY || pg->flags & ALUA_PG_RUN_RTPG) { in alua_rtpg_work()
852 pg->flags |= ALUA_PG_RUN_RTPG; in alua_rtpg_work()
853 pg->interval = 0; in alua_rtpg_work()
854 pg->flags &= ~ALUA_PG_RUNNING; in alua_rtpg_work()
855 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
856 queue_delayed_work(kaluad_wq, &pg->rtpg_work, in alua_rtpg_work()
857 pg->interval * HZ); in alua_rtpg_work()
862 list_splice_init(&pg->rtpg_list, &qdata_list); in alua_rtpg_work()
863 pg->rtpg_sdev = NULL; in alua_rtpg_work()
864 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
872 spin_lock_irqsave(&pg->lock, flags); in alua_rtpg_work()
873 pg->flags &= ~ALUA_PG_RUNNING; in alua_rtpg_work()
874 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_work()
876 kref_put(&pg->kref, release_port_group); in alua_rtpg_work()
890 static bool alua_rtpg_queue(struct alua_port_group *pg, in alua_rtpg_queue() argument
896 if (WARN_ON_ONCE(!pg) || scsi_device_get(sdev)) in alua_rtpg_queue()
899 spin_lock_irqsave(&pg->lock, flags); in alua_rtpg_queue()
901 list_add_tail(&qdata->entry, &pg->rtpg_list); in alua_rtpg_queue()
902 pg->flags |= ALUA_PG_RUN_STPG; in alua_rtpg_queue()
905 if (pg->rtpg_sdev == NULL) { in alua_rtpg_queue()
906 pg->interval = 0; in alua_rtpg_queue()
907 pg->flags |= ALUA_PG_RUN_RTPG; in alua_rtpg_queue()
908 kref_get(&pg->kref); in alua_rtpg_queue()
909 pg->rtpg_sdev = sdev; in alua_rtpg_queue()
911 } else if (!(pg->flags & ALUA_PG_RUN_RTPG) && force) { in alua_rtpg_queue()
912 pg->flags |= ALUA_PG_RUN_RTPG; in alua_rtpg_queue()
914 if (!(pg->flags & ALUA_PG_RUNNING)) { in alua_rtpg_queue()
915 kref_get(&pg->kref); in alua_rtpg_queue()
920 spin_unlock_irqrestore(&pg->lock, flags); in alua_rtpg_queue()
923 if (queue_delayed_work(kaluad_wq, &pg->rtpg_work, in alua_rtpg_queue()
927 kref_put(&pg->kref, release_port_group); in alua_rtpg_queue()
966 struct alua_port_group *pg = NULL; in alua_set_params() local
981 pg = rcu_dereference(h->pg); in alua_set_params()
982 if (!pg) { in alua_set_params()
986 spin_lock_irqsave(&pg->lock, flags); in alua_set_params()
988 pg->flags |= ALUA_OPTIMIZE_STPG; in alua_set_params()
990 pg->flags &= ~ALUA_OPTIMIZE_STPG; in alua_set_params()
991 spin_unlock_irqrestore(&pg->lock, flags); in alua_set_params()
1013 struct alua_port_group *pg; in alua_activate() local
1025 pg = rcu_dereference(h->pg); in alua_activate()
1026 if (!pg || !kref_get_unless_zero(&pg->kref)) { in alua_activate()
1036 if (alua_rtpg_queue(pg, sdev, qdata, true)) in alua_activate()
1040 kref_put(&pg->kref, release_port_group); in alua_activate()
1056 struct alua_port_group *pg; in alua_check() local
1059 pg = rcu_dereference(h->pg); in alua_check()
1060 if (!pg || !kref_get_unless_zero(&pg->kref)) { in alua_check()
1066 alua_rtpg_queue(pg, sdev, NULL, force); in alua_check()
1067 kref_put(&pg->kref, release_port_group); in alua_check()
1079 struct alua_port_group *pg; in alua_prep_fn() local
1083 pg = rcu_dereference(h->pg); in alua_prep_fn()
1084 if (pg) in alua_prep_fn()
1085 state = pg->state; in alua_prep_fn()
1121 rcu_assign_pointer(h->pg, NULL); in alua_bus_attach()
1145 struct alua_port_group *pg; in alua_bus_detach() local
1148 pg = rcu_dereference_protected(h->pg, lockdep_is_held(&h->pg_lock)); in alua_bus_detach()
1149 rcu_assign_pointer(h->pg, NULL); in alua_bus_detach()
1152 if (pg) { in alua_bus_detach()
1153 spin_lock_irq(&pg->lock); in alua_bus_detach()
1155 spin_unlock_irq(&pg->lock); in alua_bus_detach()
1156 kref_put(&pg->kref, release_port_group); in alua_bus_detach()