Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 3084

kernel-2.6.18-194.11.1.el5.src.rpm

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);