Skip to content

Commit

Permalink
[PATCH] s390: cmm guest sender id
Browse files Browse the repository at this point in the history
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: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Martin Schwidefsky authored and Linus Torvalds committed May 1, 2005
1 parent 0b642ed commit 15439d7
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 8 deletions.
9 changes: 8 additions & 1 deletion arch/s390/mm/cmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
19 changes: 14 additions & 5 deletions drivers/s390/net/smsgiucv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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;

Expand All @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions drivers/s390/net/smsgiucv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *));

0 comments on commit 15439d7

Please sign in to comment.