Lines Matching full:pr
22 static inline struct nvmet_ns *nvmet_pr_to_ns(struct nvmet_pr *pr) in nvmet_pr_to_ns() argument
24 return container_of(pr, struct nvmet_ns, pr); in nvmet_pr_to_ns()
28 nvmet_pr_find_registrant(struct nvmet_pr *pr, uuid_t *hostid) in nvmet_pr_find_registrant() argument
32 list_for_each_entry_rcu(reg, &pr->registrant_list, entry) { in nvmet_pr_find_registrant()
56 if (!req->ns->pr.enable) in nvmet_set_feat_resv_notif_mask()
59 WRITE_ONCE(req->ns->pr.notify_mask, mask); in nvmet_set_feat_resv_notif_mask()
64 if (ns->pr.enable) in nvmet_set_feat_resv_notif_mask()
65 WRITE_ONCE(ns->pr.notify_mask, mask); in nvmet_set_feat_resv_notif_mask()
81 if (!req->ns->pr.enable) in nvmet_get_feat_resv_notif_mask()
84 nvmet_set_result(req, READ_ONCE(req->ns->pr.notify_mask)); in nvmet_get_feat_resv_notif_mask()
156 static void nvmet_pr_resv_released(struct nvmet_pr *pr, uuid_t *hostid) in nvmet_pr_resv_released() argument
158 struct nvmet_ns *ns = nvmet_pr_to_ns(pr); in nvmet_pr_resv_released()
162 if (test_bit(NVME_PR_NOTIFY_BIT_RESV_RELEASED, &pr->notify_mask)) in nvmet_pr_resv_released()
168 nvmet_pr_find_registrant(pr, &ctrl->hostid)) { in nvmet_pr_resv_released()
179 static void nvmet_pr_send_event_to_host(struct nvmet_pr *pr, uuid_t *hostid, in nvmet_pr_send_event_to_host() argument
182 struct nvmet_ns *ns = nvmet_pr_to_ns(pr); in nvmet_pr_send_event_to_host()
198 static void nvmet_pr_resv_preempted(struct nvmet_pr *pr, uuid_t *hostid) in nvmet_pr_resv_preempted() argument
200 if (test_bit(NVME_PR_NOTIFY_BIT_RESV_PREEMPTED, &pr->notify_mask)) in nvmet_pr_resv_preempted()
203 nvmet_pr_send_event_to_host(pr, hostid, in nvmet_pr_resv_preempted()
207 static void nvmet_pr_registration_preempted(struct nvmet_pr *pr, in nvmet_pr_registration_preempted() argument
210 if (test_bit(NVME_PR_NOTIFY_BIT_REG_PREEMPTED, &pr->notify_mask)) in nvmet_pr_registration_preempted()
213 nvmet_pr_send_event_to_host(pr, hostid, in nvmet_pr_registration_preempted()
217 static inline void nvmet_pr_set_new_holder(struct nvmet_pr *pr, u8 new_rtype, in nvmet_pr_set_new_holder() argument
221 rcu_assign_pointer(pr->holder, reg); in nvmet_pr_set_new_holder()
229 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_register() local
237 down(&pr->pr_sem); in nvmet_pr_register()
238 reg = nvmet_pr_find_registrant(pr, &ctrl->hostid); in nvmet_pr_register()
250 list_add_tail_rcu(&new->entry, &pr->registrant_list); in nvmet_pr_register()
253 up(&pr->pr_sem); in nvmet_pr_register()
257 static void nvmet_pr_unregister_one(struct nvmet_pr *pr, in nvmet_pr_unregister_one() argument
266 holder = rcu_dereference_protected(pr->holder, 1); in nvmet_pr_unregister_one()
273 first_reg = list_first_or_null_rcu(&pr->registrant_list, in nvmet_pr_unregister_one()
277 rcu_assign_pointer(pr->holder, first_reg); in nvmet_pr_unregister_one()
279 rcu_assign_pointer(pr->holder, NULL); in nvmet_pr_unregister_one()
283 nvmet_pr_resv_released(pr, ®->hostid); in nvmet_pr_unregister_one()
295 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_unregister() local
298 down(&pr->pr_sem); in nvmet_pr_unregister()
299 list_for_each_entry_rcu(reg, &pr->registrant_list, entry) { in nvmet_pr_unregister()
303 nvmet_pr_unregister_one(pr, reg); in nvmet_pr_unregister()
308 up(&pr->pr_sem); in nvmet_pr_unregister()
319 static u16 nvmet_pr_update_reg_attr(struct nvmet_pr *pr, in nvmet_pr_update_reg_attr() argument
328 holder = rcu_dereference_protected(pr->holder, 1); in nvmet_pr_update_reg_attr()
345 rcu_assign_pointer(pr->holder, new); in nvmet_pr_update_reg_attr()
357 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_replace() local
361 down(&pr->pr_sem); in nvmet_pr_replace()
362 list_for_each_entry_rcu(reg, &pr->registrant_list, entry) { in nvmet_pr_replace()
365 status = nvmet_pr_update_reg_attr(pr, reg, in nvmet_pr_replace()
371 up(&pr->pr_sem); in nvmet_pr_replace()
412 atomic_inc(&req->ns->pr.generation); in nvmet_execute_pr_register()
420 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_acquire() local
423 holder = rcu_dereference_protected(pr->holder, 1); in nvmet_pr_acquire()
432 nvmet_pr_set_new_holder(pr, rtype, reg); in nvmet_pr_acquire()
465 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_unreg_all_host_by_prkey() local
468 list_for_each_entry_safe(reg, tmp, &pr->registrant_list, entry) { in nvmet_pr_unreg_all_host_by_prkey()
474 nvmet_pr_unregister_one(pr, reg); in nvmet_pr_unreg_all_host_by_prkey()
476 nvmet_pr_registration_preempted(pr, &hostid); in nvmet_pr_unreg_all_host_by_prkey()
488 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_unreg_all_others_by_prkey() local
491 list_for_each_entry_safe(reg, tmp, &pr->registrant_list, entry) { in nvmet_pr_unreg_all_others_by_prkey()
497 nvmet_pr_unregister_one(pr, reg); in nvmet_pr_unreg_all_others_by_prkey()
498 nvmet_pr_registration_preempted(pr, &hostid); in nvmet_pr_unreg_all_others_by_prkey()
508 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_unreg_all_others() local
511 list_for_each_entry_safe(reg, tmp, &pr->registrant_list, entry) { in nvmet_pr_unreg_all_others()
516 nvmet_pr_unregister_one(pr, reg); in nvmet_pr_unreg_all_others()
517 nvmet_pr_registration_preempted(pr, &hostid); in nvmet_pr_unreg_all_others()
537 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_preempt() local
543 holder = rcu_dereference_protected(pr->holder, 1); in nvmet_pr_preempt()
557 nvmet_pr_set_new_holder(pr, rtype, reg); in nvmet_pr_preempt()
566 status = nvmet_pr_update_reg_attr(pr, holder, in nvmet_pr_preempt()
569 nvmet_pr_resv_released(pr, ®->hostid); in nvmet_pr_preempt()
577 nvmet_pr_set_new_holder(pr, rtype, reg); in nvmet_pr_preempt()
581 nvmet_pr_resv_released(pr, ®->hostid); in nvmet_pr_preempt()
610 up(&ns->pr.pr_sem); in nvmet_pr_do_abort()
639 atomic_inc(&req->ns->pr.generation); in __nvmet_execute_pr_acquire()
654 struct nvmet_pr *pr = &req->ns->pr; in nvmet_execute_pr_acquire() local
676 down(&pr->pr_sem); in nvmet_execute_pr_acquire()
677 list_for_each_entry_rcu(reg, &pr->registrant_list, entry) { in nvmet_execute_pr_acquire()
693 up(&pr->pr_sem); in nvmet_execute_pr_acquire()
705 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_release() local
709 holder = rcu_dereference_protected(pr->holder, 1); in nvmet_pr_release()
717 rcu_assign_pointer(pr->holder, NULL); in nvmet_pr_release()
721 nvmet_pr_resv_released(pr, ®->hostid); in nvmet_pr_release()
729 struct nvmet_pr *pr = &req->ns->pr; in nvmet_pr_clear() local
731 rcu_assign_pointer(pr->holder, NULL); in nvmet_pr_clear()
733 list_for_each_entry_safe(reg, tmp, &pr->registrant_list, entry) { in nvmet_pr_clear()
736 nvmet_pr_resv_preempted(pr, ®->hostid); in nvmet_pr_clear()
740 atomic_inc(&pr->generation); in nvmet_pr_clear()
766 struct nvmet_pr *pr = &req->ns->pr; in nvmet_execute_pr_release() local
787 down(&pr->pr_sem); in nvmet_execute_pr_release()
788 list_for_each_entry_rcu(reg, &pr->registrant_list, entry) { in nvmet_execute_pr_release()
796 up(&pr->pr_sem); in nvmet_execute_pr_release()
811 struct nvmet_pr *pr = &req->ns->pr; in nvmet_execute_pr_report() local
836 data->gen = cpu_to_le32(atomic_read(&pr->generation)); in nvmet_execute_pr_report()
841 holder = rcu_dereference(pr->holder); in nvmet_execute_pr_report()
845 list_for_each_entry_rcu(reg, &pr->registrant_list, entry) { in nvmet_execute_pr_report()
939 struct nvmet_pr *pr = &ns->pr; in nvmet_pr_check_cmd_access() local
943 holder = rcu_dereference(pr->holder); in nvmet_pr_check_cmd_access()
966 !nvmet_pr_find_registrant(pr, &ctrl->hostid)) in nvmet_pr_check_cmd_access()
973 !nvmet_pr_find_registrant(pr, &ctrl->hostid)) in nvmet_pr_check_cmd_access()
1057 * So just check ns->pr.enable. in nvmet_ctrl_init_pr()
1060 if (ns->pr.enable) { in nvmet_ctrl_init_pr()
1071 if (ns->pr.enable) { in nvmet_ctrl_init_pr()
1091 if (ns->pr.enable) { in nvmet_ctrl_destroy_pr()
1108 ns->pr.holder = NULL; in nvmet_pr_init_ns()
1109 atomic_set(&ns->pr.generation, 0); in nvmet_pr_init_ns()
1110 sema_init(&ns->pr.pr_sem, 1); in nvmet_pr_init_ns()
1111 INIT_LIST_HEAD(&ns->pr.registrant_list); in nvmet_pr_init_ns()
1112 ns->pr.notify_mask = 0; in nvmet_pr_init_ns()
1137 struct nvmet_pr *pr = &ns->pr; in nvmet_pr_exit_ns() local
1140 list_for_each_entry_safe(reg, tmp, &pr->registrant_list, entry) { in nvmet_pr_exit_ns()