Commit 21a7bb5c authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'netconsole-configfs-store-callback-fixes'

Breno Leitao says:

====================
netconsole: configfs store callback fixes

There are still some changes I want to make, such as, having the dynamic
lock when reading from configfs (_show() callbacks), wich will solve
other issues, but I will keep it for later.
====================

Link: https://patch.msgid.link/20260427-netconsole_ai_fixes-v2-0-59965f29d9cc@debian.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 403e7e34 869cd649
Loading
Loading
Loading
Loading
+30 −19
Original line number Diff line number Diff line
@@ -752,7 +752,7 @@ static ssize_t enabled_store(struct config_item *item,
		unregister_netcons_consoles();
	}

	ret = strnlen(buf, count);
	ret = count;
	/* Deferred cleanup */
	netconsole_process_cleanups();
out_unlock:
@@ -781,7 +781,7 @@ static ssize_t release_store(struct config_item *item, const char *buf,

	nt->release = release;

	ret = strnlen(buf, count);
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
	return ret;
@@ -807,7 +807,7 @@ static ssize_t extended_store(struct config_item *item, const char *buf,
		goto out_unlock;

	nt->extended = extended;
	ret = strnlen(buf, count);
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
	return ret;
@@ -817,6 +817,13 @@ static ssize_t dev_name_store(struct config_item *item, const char *buf,
		size_t count)
{
	struct netconsole_target *nt = to_target(item);
	size_t len = count;

	/* Account for a trailing newline appended by tools like echo */
	if (len && buf[len - 1] == '\n')
		len--;
	if (len >= IFNAMSIZ)
		return -ENAMETOOLONG;

	dynamic_netconsole_mutex_lock();
	if (nt->state == STATE_ENABLED) {
@@ -830,7 +837,7 @@ static ssize_t dev_name_store(struct config_item *item, const char *buf,
	trim_newline(nt->np.dev_name, IFNAMSIZ);

	dynamic_netconsole_mutex_unlock();
	return strnlen(buf, count);
	return count;
}

static ssize_t local_port_store(struct config_item *item, const char *buf,
@@ -849,7 +856,7 @@ static ssize_t local_port_store(struct config_item *item, const char *buf,
	ret = kstrtou16(buf, 10, &nt->np.local_port);
	if (ret < 0)
		goto out_unlock;
	ret = strnlen(buf, count);
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
	return ret;
@@ -871,7 +878,7 @@ static ssize_t remote_port_store(struct config_item *item,
	ret = kstrtou16(buf, 10, &nt->np.remote_port);
	if (ret < 0)
		goto out_unlock;
	ret = strnlen(buf, count);
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
	return ret;
@@ -896,7 +903,7 @@ static ssize_t local_ip_store(struct config_item *item, const char *buf,
		goto out_unlock;
	nt->np.ipv6 = !!ipv6;

	ret = strnlen(buf, count);
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
	return ret;
@@ -921,7 +928,7 @@ static ssize_t remote_ip_store(struct config_item *item, const char *buf,
		goto out_unlock;
	nt->np.ipv6 = !!ipv6;

	ret = strnlen(buf, count);
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
	return ret;
@@ -957,7 +964,7 @@ static ssize_t remote_mac_store(struct config_item *item, const char *buf,
		goto out_unlock;
	memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN);

	ret = strnlen(buf, count);
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
	return ret;
@@ -1072,26 +1079,30 @@ static ssize_t userdatum_value_store(struct config_item *item, const char *buf,
				     size_t count)
{
	struct userdatum *udm = to_userdatum(item);
	char old_value[MAX_EXTRADATA_VALUE_LEN];
	struct netconsole_target *nt;
	struct userdata *ud;
	ssize_t ret;

	if (count > MAX_EXTRADATA_VALUE_LEN)
	if (count >= MAX_EXTRADATA_VALUE_LEN)
		return -EMSGSIZE;

	mutex_lock(&netconsole_subsys.su_mutex);
	dynamic_netconsole_mutex_lock();

	ret = strscpy(udm->value, buf, sizeof(udm->value));
	if (ret < 0)
		goto out_unlock;
	/* Snapshot for rollback if update_userdata() fails below */
	strscpy(old_value, udm->value, sizeof(old_value));
	/* count is bounded above, so strscpy() cannot truncate here */
	strscpy(udm->value, buf, sizeof(udm->value));
	trim_newline(udm->value, sizeof(udm->value));

	ud = to_userdata(item->ci_parent);
	nt = userdata_to_target(ud);
	ret = update_userdata(nt);
	if (ret < 0)
	if (ret < 0) {
		/* Restore the previous value so it matches the live payload */
		strscpy(udm->value, old_value, sizeof(udm->value));
		goto out_unlock;
	}
	ret = count;
out_unlock:
	dynamic_netconsole_mutex_unlock();
@@ -1133,7 +1144,7 @@ static ssize_t sysdata_msgid_enabled_store(struct config_item *item,
		disable_sysdata_feature(nt, SYSDATA_MSGID);

unlock_ok:
	ret = strnlen(buf, count);
	ret = count;
	dynamic_netconsole_mutex_unlock();
	mutex_unlock(&netconsole_subsys.su_mutex);
	return ret;
@@ -1162,7 +1173,7 @@ static ssize_t sysdata_release_enabled_store(struct config_item *item,
		disable_sysdata_feature(nt, SYSDATA_RELEASE);

unlock_ok:
	ret = strnlen(buf, count);
	ret = count;
	dynamic_netconsole_mutex_unlock();
	mutex_unlock(&netconsole_subsys.su_mutex);
	return ret;
@@ -1191,7 +1202,7 @@ static ssize_t sysdata_taskname_enabled_store(struct config_item *item,
		disable_sysdata_feature(nt, SYSDATA_TASKNAME);

unlock_ok:
	ret = strnlen(buf, count);
	ret = count;
	dynamic_netconsole_mutex_unlock();
	mutex_unlock(&netconsole_subsys.su_mutex);
	return ret;
@@ -1225,7 +1236,7 @@ static ssize_t sysdata_cpu_nr_enabled_store(struct config_item *item,
		disable_sysdata_feature(nt, SYSDATA_CPU_NR);

unlock_ok:
	ret = strnlen(buf, count);
	ret = count;
	dynamic_netconsole_mutex_unlock();
	mutex_unlock(&netconsole_subsys.su_mutex);
	return ret;