Lines Matching full:member
201 static void deref_member(struct mcast_member *member) in deref_member() argument
203 if (atomic_dec_and_test(&member->refcount)) in deref_member()
204 complete(&member->comp); in deref_member()
207 static void queue_join(struct mcast_member *member) in queue_join() argument
209 struct mcast_group *group = member->group; in queue_join()
213 list_add_tail(&member->list, &group->pending_list); in queue_join()
223 * A multicast group has three types of members: full member, non member, and
224 * send only member. We need to keep track of the number of members of each
239 * the group is still a member with the SA, we need to leave that join state.
330 static int send_join(struct mcast_group *group, struct mcast_member *member) in send_join() argument
335 group->last_join = member; in send_join()
338 &member->multicast.rec, in send_join()
339 member->multicast.comp_mask, in send_join()
373 static void join_group(struct mcast_group *group, struct mcast_member *member, in join_group() argument
376 member->state = MCAST_MEMBER; in join_group()
379 member->multicast.rec = group->rec; in join_group()
380 member->multicast.rec.join_state = join_state; in join_group()
381 list_move(&member->list, &group->active_list); in join_group()
384 static int fail_join(struct mcast_group *group, struct mcast_member *member, in fail_join() argument
388 list_del_init(&member->list); in fail_join()
390 return member->multicast.callback(status, &member->multicast); in fail_join()
395 struct mcast_member *member; in process_group_error() local
410 member = list_entry(group->active_list.next, in process_group_error()
412 atomic_inc(&member->refcount); in process_group_error()
413 list_del_init(&member->list); in process_group_error()
414 adjust_membership(group, member->multicast.rec.join_state, -1); in process_group_error()
415 member->state = MCAST_ERROR; in process_group_error()
418 ret = member->multicast.callback(-ENETRESET, in process_group_error()
419 &member->multicast); in process_group_error()
420 deref_member(member); in process_group_error()
422 ib_sa_free_multicast(&member->multicast); in process_group_error()
435 struct mcast_member *member; in mcast_work_handler() local
452 member = list_entry(group->pending_list.next, in mcast_work_handler()
454 multicast = &member->multicast; in mcast_work_handler()
456 atomic_inc(&member->refcount); in mcast_work_handler()
462 join_group(group, member, join_state); in mcast_work_handler()
464 list_del_init(&member->list); in mcast_work_handler()
469 status = send_join(group, member); in mcast_work_handler()
471 deref_member(member); in mcast_work_handler()
474 ret = fail_join(group, member, status); in mcast_work_handler()
477 deref_member(member); in mcast_work_handler()
479 ib_sa_free_multicast(&member->multicast); in mcast_work_handler()
501 struct mcast_member *member; in process_join_error() local
505 member = list_entry(group->pending_list.next, in process_join_error()
507 if (group->last_join == member) { in process_join_error()
508 atomic_inc(&member->refcount); in process_join_error()
509 list_del_init(&member->list); in process_join_error()
511 ret = member->multicast.callback(status, &member->multicast); in process_join_error()
512 deref_member(member); in process_join_error()
514 ib_sa_free_multicast(&member->multicast); in process_join_error()
616 struct mcast_member *member; in ib_sa_join_multicast() local
624 member = kmalloc(sizeof *member, gfp_mask); in ib_sa_join_multicast()
625 if (!member) in ib_sa_join_multicast()
629 member->client = client; in ib_sa_join_multicast()
630 member->multicast.rec = *rec; in ib_sa_join_multicast()
631 member->multicast.comp_mask = comp_mask; in ib_sa_join_multicast()
632 member->multicast.callback = callback; in ib_sa_join_multicast()
633 member->multicast.context = context; in ib_sa_join_multicast()
634 init_completion(&member->comp); in ib_sa_join_multicast()
635 atomic_set(&member->refcount, 1); in ib_sa_join_multicast()
636 member->state = MCAST_JOINING; in ib_sa_join_multicast()
638 member->group = acquire_group(&dev->port[port_num - dev->start_port], in ib_sa_join_multicast()
640 if (!member->group) { in ib_sa_join_multicast()
651 multicast = &member->multicast; in ib_sa_join_multicast()
652 queue_join(member); in ib_sa_join_multicast()
657 kfree(member); in ib_sa_join_multicast()
664 struct mcast_member *member; in ib_sa_free_multicast() local
667 member = container_of(multicast, struct mcast_member, multicast); in ib_sa_free_multicast()
668 group = member->group; in ib_sa_free_multicast()
671 if (member->state == MCAST_MEMBER) in ib_sa_free_multicast()
674 list_del_init(&member->list); in ib_sa_free_multicast()
686 deref_member(member); in ib_sa_free_multicast()
687 wait_for_completion(&member->comp); in ib_sa_free_multicast()
688 ib_sa_client_put(member->client); in ib_sa_free_multicast()
689 kfree(member); in ib_sa_free_multicast()