Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06070a23 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "diag: Synchronize socket read_work_fn and close"

parents 5747863b 4cadc0e7
Loading
Loading
Loading
Loading
+29 −34
Original line number Diff line number Diff line
@@ -495,7 +495,7 @@ static void __socket_close_channel(struct diag_socket_info *info)
{
	unsigned long flags;

	if (!info || !info->hdl)
	if (!info)
		return;

	memset(&info->remote_addr, 0, sizeof(info->remote_addr));
@@ -506,12 +506,11 @@ static void __socket_close_channel(struct diag_socket_info *info)
	if (info->port_type == PORT_TYPE_SERVER)
		return;

	write_lock_bh(&info->hdl->sk->sk_callback_lock);
	info->hdl->sk->sk_user_data = NULL;
	info->hdl->sk->sk_data_ready = NULL;
	info->hdl->sk->sk_error_report = NULL;
	write_unlock_bh(&info->hdl->sk->sk_callback_lock);
	mutex_lock(&info->socket_info_mutex);
	if (!info->hdl) {
		mutex_unlock(&info->socket_info_mutex);
		return;
	}
	sock_release(info->hdl);
	info->hdl = NULL;
	mutex_unlock(&info->socket_info_mutex);
@@ -570,10 +569,16 @@ static void socket_read_work_fn(struct work_struct *work)
						     struct diag_socket_info,
						     read_work);

	if (!info || !info->hdl)
	if (!info)
		return;

	mutex_lock(&info->socket_info_mutex);
	if (!info->hdl || !info->hdl->sk) {
		mutex_unlock(&info->socket_info_mutex);
		return;
	}
	err = sock_error(info->hdl->sk);
	mutex_unlock(&info->socket_info_mutex);
	if (unlikely(err == -ENETRESET)) {
		socket_close_channel(info);
		if (info->port_type == PORT_TYPE_SERVER)
@@ -715,7 +720,6 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len)
		read_msg.msg_name = &src_addr;
		read_msg.msg_namelen = sizeof(src_addr);

		if (info->port_type != PORT_TYPE_SERVER) {
		mutex_lock(&info->socket_info_mutex);
		if (!info->hdl) {
			DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
@@ -724,18 +728,15 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len)
			mutex_unlock(&info->socket_info_mutex);
			goto fail;
		}
		}
		err =  info->hdl->ops->ioctl(info->hdl, TIOCINQ,
					(unsigned long)&pkt_len);
		if (err || pkt_len < 0) {
			if (info->port_type != PORT_TYPE_SERVER)
			mutex_unlock(&info->socket_info_mutex);
			break;
		}

		if (pkt_len > bytes_remaining) {
			buf_full = 1;
			if (info->port_type != PORT_TYPE_SERVER)
			mutex_unlock(&info->socket_info_mutex);
			break;
		}
@@ -746,7 +747,6 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len)

		read_len = kernel_recvmsg(info->hdl, &read_msg, &iov, 1,
					  pkt_len, MSG_DONTWAIT);
		if (info->port_type != PORT_TYPE_SERVER)
		mutex_unlock(&info->socket_info_mutex);
		if (unlikely(read_len == -ENETRESET)) {
			mutex_lock(channel_mutex);
@@ -855,15 +855,12 @@ static int diag_socket_write(void *ctxt, unsigned char *buf, int len)
	write_msg.msg_name = &info->remote_addr;
	write_msg.msg_namelen = sizeof(info->remote_addr);
	write_msg.msg_flags |= MSG_DONTWAIT;
	if (info->port_type != PORT_TYPE_SERVER) {
	mutex_lock(&info->socket_info_mutex);
	if (!info->hdl) {
		mutex_unlock(&info->socket_info_mutex);
		return -ENODEV;
	}
	}
	write_len = kernel_sendmsg(info->hdl, &write_msg, &iov, 1, len);
	if (info->port_type != PORT_TYPE_SERVER)
	mutex_unlock(&info->socket_info_mutex);
	if (write_len < 0) {
		err = write_len;
@@ -962,7 +959,6 @@ static void __diag_socket_init(struct diag_socket_info *info)
		break;
	}

	if (info->port_type == PORT_TYPE_CLIENT)
	mutex_init(&info->socket_info_mutex);
	info->svc_id = DIAG_SVC_ID;
	info->ins_id = ins_base + ins_offset;
@@ -1121,7 +1117,6 @@ static void __diag_socket_exit(struct diag_socket_info *info)
	if (info->hdl)
		sock_release(info->hdl);
	info->hdl = NULL;
	if (info->port_type == PORT_TYPE_CLIENT)
	mutex_destroy(&info->socket_info_mutex);
	if (info->wq)
		destroy_workqueue(info->wq);