From: Hans-Joachim Picht <hpicht@redhat.com> Date: Tue, 1 Jul 2008 15:12:06 +0200 Subject: [s390] cio: fix system hang with reserved DASD Message-id: 20080701131206.GA20922@redhat.com O-Subject: [RHEL5 U3 PATCH 1/6] s390 - cio: fix system hang with reserved DASD Bugzilla: 451222 RH-Acked-by: Pete Zaitcev <zaitcev@redhat.com> Description ============ Disconnecting and reconnecting the cable of a reserved DASD results in a system hang. The CCW_CMD_SET_PGID is unnecessariliy chained to a CCW_CMD_SUSPEND_RECONN. Removing CCW_CMD_SUSPEND_RECONN in front of CCW_CMD_SET_PGID fixes the problem. Bugzilla ========= BZ 451222 https://bugzilla.redhat.com/show_bug.cgi?id=451222 Upstream status of the patch: ============================= Patch is contained in linux-2.6 as git commit 32aff5732a11739e81994b3bcd7a9d0e8b1ea06e Test status: ============ The patch has been tested and fixes the problem. The fix has been verified by the IBM test department. Please ACK. With best regards, -Hans diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index 901ca16..341d6f6 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c @@ -237,16 +237,10 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) /* Setup sense path group id channel program. */ cdev->private->pgid[0].inf.fc = func; ccw = cdev->private->iccws; - if (!cdev->private->flags.pgid_single) { - cdev->private->pgid[0].inf.fc |= SPID_FUNC_MULTI_PATH; - ccw->cmd_code = CCW_CMD_SUSPEND_RECONN; - ccw->cda = 0; - ccw->count = 0; - ccw->flags = CCW_FLAG_SLI | CCW_FLAG_CC; - ccw++; - } else + if (cdev->private->flags.pgid_single) cdev->private->pgid[0].inf.fc |= SPID_FUNC_SINGLE_PATH; - + else + cdev->private->pgid[0].inf.fc |= SPID_FUNC_MULTI_PATH; ccw->cmd_code = CCW_CMD_SET_PGID; ccw->cda = (__u32) __pa (&cdev->private->pgid[0]); ccw->count = sizeof (struct pgid);