|
@@ -471,14 +471,17 @@ int chp_new(struct chp_id chpid)
|
|
|
{
|
|
|
struct channel_subsystem *css = css_by_id(chpid.cssid);
|
|
|
struct channel_path *chp;
|
|
|
- int ret;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
+ mutex_lock(&css->mutex);
|
|
|
if (chp_is_registered(chpid))
|
|
|
- return 0;
|
|
|
- chp = kzalloc(sizeof(struct channel_path), GFP_KERNEL);
|
|
|
- if (!chp)
|
|
|
- return -ENOMEM;
|
|
|
+ goto out;
|
|
|
|
|
|
+ chp = kzalloc(sizeof(struct channel_path), GFP_KERNEL);
|
|
|
+ if (!chp) {
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
/* fill in status, etc. */
|
|
|
chp->chpid = chpid;
|
|
|
chp->state = 1;
|
|
@@ -505,21 +508,20 @@ int chp_new(struct chp_id chpid)
|
|
|
put_device(&chp->dev);
|
|
|
goto out;
|
|
|
}
|
|
|
- mutex_lock(&css->mutex);
|
|
|
+
|
|
|
if (css->cm_enabled) {
|
|
|
ret = chp_add_cmg_attr(chp);
|
|
|
if (ret) {
|
|
|
device_unregister(&chp->dev);
|
|
|
- mutex_unlock(&css->mutex);
|
|
|
goto out;
|
|
|
}
|
|
|
}
|
|
|
css->chps[chpid.id] = chp;
|
|
|
- mutex_unlock(&css->mutex);
|
|
|
goto out;
|
|
|
out_free:
|
|
|
kfree(chp);
|
|
|
out:
|
|
|
+ mutex_unlock(&css->mutex);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -585,8 +587,7 @@ static void chp_process_crw(struct crw *crw0, struct crw *crw1,
|
|
|
switch (crw0->erc) {
|
|
|
case CRW_ERC_IPARM: /* Path has come. */
|
|
|
case CRW_ERC_INIT:
|
|
|
- if (!chp_is_registered(chpid))
|
|
|
- chp_new(chpid);
|
|
|
+ chp_new(chpid);
|
|
|
chsc_chp_online(chpid);
|
|
|
break;
|
|
|
case CRW_ERC_PERRI: /* Path has gone. */
|