Commit 59b60e97 authored by Ursula Braun's avatar Ursula Braun Committed by David S. Miller

smsgiucv: guarantee single iucv connect in thaw

If another smsgiucv_app device exists, suspend / resume fails with
iucv path list corruption, because the same iucv_path_connect is
called twice.
The patch introduces a flag to save connect status of the smsgiucv
path to make sure iucv_path_connect in smsg_pm_restore_thaw is
called only once.
Signed-off-by: default avatarUrsula Braun <ursula.braun@de.ibm.com>
Signed-off-by: default avatarFrank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4eaef482
...@@ -47,6 +47,7 @@ static struct device *smsg_dev; ...@@ -47,6 +47,7 @@ static struct device *smsg_dev;
static DEFINE_SPINLOCK(smsg_list_lock); static DEFINE_SPINLOCK(smsg_list_lock);
static LIST_HEAD(smsg_list); static LIST_HEAD(smsg_list);
static int iucv_path_connected;
static int smsg_path_pending(struct iucv_path *, u8 ipvmid[8], u8 ipuser[16]); static int smsg_path_pending(struct iucv_path *, u8 ipvmid[8], u8 ipuser[16]);
static void smsg_message_pending(struct iucv_path *, struct iucv_message *); static void smsg_message_pending(struct iucv_path *, struct iucv_message *);
...@@ -142,8 +143,10 @@ static int smsg_pm_freeze(struct device *dev) ...@@ -142,8 +143,10 @@ static int smsg_pm_freeze(struct device *dev)
#ifdef CONFIG_PM_DEBUG #ifdef CONFIG_PM_DEBUG
printk(KERN_WARNING "smsg_pm_freeze\n"); printk(KERN_WARNING "smsg_pm_freeze\n");
#endif #endif
if (smsg_path) if (smsg_path && iucv_path_connected) {
iucv_path_sever(smsg_path, NULL); iucv_path_sever(smsg_path, NULL);
iucv_path_connected = 0;
}
return 0; return 0;
} }
...@@ -154,7 +157,7 @@ static int smsg_pm_restore_thaw(struct device *dev) ...@@ -154,7 +157,7 @@ static int smsg_pm_restore_thaw(struct device *dev)
#ifdef CONFIG_PM_DEBUG #ifdef CONFIG_PM_DEBUG
printk(KERN_WARNING "smsg_pm_restore_thaw\n"); printk(KERN_WARNING "smsg_pm_restore_thaw\n");
#endif #endif
if (smsg_path) { if (smsg_path && iucv_path_connected) {
memset(smsg_path, 0, sizeof(*smsg_path)); memset(smsg_path, 0, sizeof(*smsg_path));
smsg_path->msglim = 255; smsg_path->msglim = 255;
smsg_path->flags = 0; smsg_path->flags = 0;
...@@ -165,6 +168,8 @@ static int smsg_pm_restore_thaw(struct device *dev) ...@@ -165,6 +168,8 @@ static int smsg_pm_restore_thaw(struct device *dev)
printk(KERN_ERR printk(KERN_ERR
"iucv_path_connect returned with rc %i\n", rc); "iucv_path_connect returned with rc %i\n", rc);
#endif #endif
if (!rc)
iucv_path_connected = 1;
cpcmd("SET SMSG IUCV", NULL, 0, NULL); cpcmd("SET SMSG IUCV", NULL, 0, NULL);
} }
return 0; return 0;
...@@ -214,6 +219,8 @@ static int __init smsg_init(void) ...@@ -214,6 +219,8 @@ static int __init smsg_init(void)
NULL, NULL, NULL); NULL, NULL, NULL);
if (rc) if (rc)
goto out_free_path; goto out_free_path;
else
iucv_path_connected = 1;
smsg_dev = kzalloc(sizeof(struct device), GFP_KERNEL); smsg_dev = kzalloc(sizeof(struct device), GFP_KERNEL);
if (!smsg_dev) { if (!smsg_dev) {
rc = -ENOMEM; rc = -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment