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

Commit 15439d74 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Linus Torvalds
Browse files

[PATCH] s390: cmm guest sender id



An arbitrary guest must not be allowed to trigger cmm actions.  Only one
specific guest namely the one that serves as the resource monitor may send cmm
messages.  Add a parameter that allows to specify the guest that may send
messages.  z/VMs resource manager has the name 'VMRMSVM' which is the default.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0b642ede
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -20,6 +20,11 @@
#include <asm/pgalloc.h>
#include <asm/uaccess.h>

static char *sender = "VMRMSVM";
module_param(sender, charp, 0);
MODULE_PARM_DESC(sender,
		 "Guest name that may send SMSG messages (default VMRMSVM)");

#include "../../../drivers/s390/net/smsgiucv.h"

#define CMM_NR_PAGES ((PAGE_SIZE / sizeof(unsigned long)) - 2)
@@ -367,10 +372,12 @@ static struct ctl_table cmm_dir_table[] = {
#ifdef CONFIG_CMM_IUCV
#define SMSG_PREFIX "CMM"
static void
cmm_smsg_target(char *msg)
cmm_smsg_target(char *from, char *msg)
{
	long pages, seconds;

	if (strlen(sender) > 0 && strcmp(from, sender) != 0)
		return;
	if (!cmm_skip_blanks(msg + strlen(SMSG_PREFIX), &msg))
		return;
	if (strncmp(msg, "SHRINK", 6) == 0) {
+14 −5
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ struct smsg_callback {
	struct list_head list;
	char *prefix;
	int len;
	void (*callback)(char *str);
	void (*callback)(char *from, char *str);
};

MODULE_AUTHOR
@@ -55,8 +55,9 @@ smsg_message_pending(iucv_MessagePending *eib, void *pgm_data)
{
	struct smsg_callback *cb;
	unsigned char *msg;
	unsigned char sender[9];
	unsigned short len;
	int rc;
	int rc, i;

	len = eib->ln1msg2.ipbfln1f;
	msg = kmalloc(len + 1, GFP_ATOMIC|GFP_DMA);
@@ -69,10 +70,18 @@ smsg_message_pending(iucv_MessagePending *eib, void *pgm_data)
	if (rc == 0) {
		msg[len] = 0;
		EBCASC(msg, len);
		memcpy(sender, msg, 8);
		sender[8] = 0;
		/* Remove trailing whitespace from the sender name. */
		for (i = 7; i >= 0; i--) {
			if (sender[i] != ' ' && sender[i] != '\t')
				break;
			sender[i] = 0;
		}
		spin_lock(&smsg_list_lock);
		list_for_each_entry(cb, &smsg_list, list)
			if (strncmp(msg + 8, cb->prefix, cb->len) == 0) {
				cb->callback(msg + 8);
				cb->callback(sender, msg + 8);
				break;
			}
		spin_unlock(&smsg_list_lock);
@@ -91,7 +100,7 @@ static struct device_driver smsg_driver = {
};

int
smsg_register_callback(char *prefix, void (*callback)(char *str))
smsg_register_callback(char *prefix, void (*callback)(char *from, char *str))
{
	struct smsg_callback *cb;

@@ -108,7 +117,7 @@ smsg_register_callback(char *prefix, void (*callback)(char *str))
}

void
smsg_unregister_callback(char *prefix, void (*callback)(char *str))
smsg_unregister_callback(char *prefix, void (*callback)(char *from, char *str))
{
	struct smsg_callback *cb, *tmp;

+2 −2
Original line number Diff line number Diff line
@@ -5,6 +5,6 @@
 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
 */

int  smsg_register_callback(char *, void (*)(char *));
void smsg_unregister_callback(char *, void (*)(char *));
int  smsg_register_callback(char *, void (*)(char *, char *));
void smsg_unregister_callback(char *, void (*)(char *, char *));