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

Commit a93976ff authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "diag: Clearing the mask before switching logging mode"

parents ff493e5b 0304ac44
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -2042,14 +2042,6 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
			__func__, mask_info->ptr, mask_info->update_buf);
		return -EINVAL;
	}
	mutex_lock(&driver->diag_maskclear_mutex);
	if (driver->mask_clear) {
		DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
		"diag:%s: count = %zu\n", __func__, count);
		mutex_unlock(&driver->diag_maskclear_mutex);
		return -EIO;
	}
	mutex_unlock(&driver->diag_maskclear_mutex);
	mutex_lock(&mask_info->lock);
	mutex_lock(&driver->msg_mask_lock);

+0 −2
Original line number Diff line number Diff line
@@ -543,8 +543,6 @@ struct diagchar_dev {
	struct class *diagchar_class;
	struct device *diag_dev;
	int ref_count;
	int mask_clear;
	struct mutex diag_maskclear_mutex;
	struct mutex diag_notifier_mutex;
	struct mutex diagchar_mutex;
	struct mutex diag_file_mutex;
+48 −8
Original line number Diff line number Diff line
@@ -459,10 +459,6 @@ static void diag_close_logging_process(const int pid)
	if (diag_mask_clear_param)
		diag_clear_masks(pid);

	mutex_lock(&driver->diag_maskclear_mutex);
	driver->mask_clear = 1;
	mutex_unlock(&driver->diag_maskclear_mutex);

	mutex_lock(&driver->diagchar_mutex);
	p_mask =
	diag_translate_kernel_to_user_mask(session_mask);
@@ -559,9 +555,7 @@ static int diagchar_close(struct inode *inode, struct file *file)
	DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: process exit %s\n",
		current->comm);
	ret = diag_remove_client_entry(file);
	mutex_lock(&driver->diag_maskclear_mutex);
	driver->mask_clear = 0;
	mutex_unlock(&driver->diag_maskclear_mutex);

	return ret;
}

@@ -1673,6 +1667,51 @@ static uint32_t diag_translate_mask(uint32_t peripheral_mask)
	return ret;
}

static void diag_switch_logging_clear_mask(
		struct diag_logging_mode_param_t *param, int pid)
{
	int new_mode;
	struct diag_md_session_t *session_info = NULL;

	mutex_lock(&driver->md_session_lock);
	session_info = diag_md_session_get_pid(pid);
	if (!session_info) {
		DIAG_LOG(DIAG_DEBUG_USERSPACE, "Invalid pid: %d\n", pid);
		mutex_unlock(&driver->md_session_lock);
		return;
	}
	mutex_unlock(&driver->md_session_lock);

	if (!param)
		return;

	if (!param->peripheral_mask) {
		DIAG_LOG(DIAG_DEBUG_USERSPACE,
			"asking for mode switch with no peripheral mask set\n");
		return;
	}

	switch (param->req_mode) {
	case CALLBACK_MODE:
	case UART_MODE:
	case SOCKET_MODE:
	case MEMORY_DEVICE_MODE:
		new_mode = DIAG_MEMORY_DEVICE_MODE;
		break;
	case USB_MODE:
		new_mode = DIAG_USB_MODE;
		break;
	default:
		DIAG_LOG(DIAG_DEBUG_USERSPACE,
			"Request to switch to invalid mode: %d\n",
			param->req_mode);
		return;
	}
	if ((new_mode == DIAG_USB_MODE) && diag_mask_clear_param)
		diag_clear_masks(pid);

}

static int diag_switch_logging(struct diag_logging_mode_param_t *param)
{
	int new_mode, i = 0;
@@ -2500,6 +2539,7 @@ long diagchar_compat_ioctl(struct file *filp,
		if (copy_from_user((void *)&mode_param, (void __user *)ioarg,
				   sizeof(mode_param)))
			return -EFAULT;
		diag_switch_logging_clear_mask(&mode_param, current->tgid);
		mutex_lock(&driver->diagchar_mutex);
		result = diag_switch_logging(&mode_param);
		mutex_unlock(&driver->diagchar_mutex);
@@ -2631,6 +2671,7 @@ long diagchar_ioctl(struct file *filp,
		if (copy_from_user((void *)&mode_param, (void __user *)ioarg,
				   sizeof(mode_param)))
			return -EFAULT;
		diag_switch_logging_clear_mask(&mode_param, current->tgid);
		mutex_lock(&driver->diagchar_mutex);
		result = diag_switch_logging(&mode_param);
		mutex_unlock(&driver->diagchar_mutex);
@@ -3902,7 +3943,6 @@ static int __init diagchar_init(void)
	non_hdlc_data.len = 0;
	mutex_init(&driver->hdlc_disable_mutex);
	mutex_init(&driver->diagchar_mutex);
	mutex_init(&driver->diag_maskclear_mutex);
	mutex_init(&driver->diag_notifier_mutex);
	mutex_init(&driver->diag_file_mutex);
	mutex_init(&driver->delayed_rsp_mutex);