static void __socket_close_channel(struct diag_socket_info *info) { if (!info || !info->hdl) return; if (!atomic_read(&info->opened)) return; memset(&info->remote_addr, 0, sizeof(struct sockaddr_msm_ipc)); diagfwd_channel_close(info->fwd_ctxt); atomic_set(&info->opened, 0); /* Don't close the server. Server should always remain open */ if (info->port_type != PORT_TYPE_SERVER) { write_lock_bh(&info->hdl->sk->sk_callback_lock); info->hdl->sk->sk_user_data = NULL; info->hdl->sk->sk_data_ready = NULL; write_unlock_bh(&info->hdl->sk->sk_callback_lock); sock_release(info->hdl); info->hdl = NULL; wake_up_interruptible(&info->read_wait_q); } DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s exiting\n", info->name); return; }
static void smd_close_work_fn(struct work_struct *work) { struct diag_smd_info *smd_info = container_of(work, struct diag_smd_info, close_work); if (!smd_info->inited) return; diagfwd_channel_close(smd_info->fwd_ctxt); wake_up_interruptible(&smd_info->read_wait_q); DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s exiting\n", smd_info->name); }