Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 362ce84f authored by Stefan Haberland's avatar Stefan Haberland Committed by Martin Schwidefsky
Browse files

s390/dasd: fix infinite loop during format



Error recovery requests may not be cleaned up correctly so that other
needed erp requests can not be build because of insufficient memory.
This would lead to an infinite loop trying to build erp requests.

Signed-off-by: default avatarStefan Haberland <stefan.haberland@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent cfb0b241
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -2261,8 +2261,8 @@ static inline int _wait_for_wakeup_queue(struct list_head *ccw_queue)
static int _dasd_sleep_on_queue(struct list_head *ccw_queue, int interruptible)
{
	struct dasd_device *device;
	int rc;
	struct dasd_ccw_req *cqr, *n;
	int rc;

retry:
	list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) {
@@ -2310,21 +2310,26 @@ static int _dasd_sleep_on_queue(struct list_head *ccw_queue, int interruptible)
		/*
		 * for alias devices simplify error recovery and
		 * return to upper layer
		 * do not skip ERP requests
		 */
		if (cqr->startdev != cqr->basedev &&
		if (cqr->startdev != cqr->basedev && !cqr->refers &&
		    (cqr->status == DASD_CQR_TERMINATED ||
		     cqr->status == DASD_CQR_NEED_ERP))
			return -EAGAIN;
		else {

		/* normal recovery for basedev IO */
		if (__dasd_sleep_on_erp(cqr)) {
				if (!cqr->status == DASD_CQR_TERMINATED &&
				    !cqr->status == DASD_CQR_NEED_ERP)
					break;
			goto retry;
			/* remember that ERP was needed */
			rc = 1;
			/* skip processing for active cqr */
			if (cqr->status != DASD_CQR_TERMINATED &&
			    cqr->status != DASD_CQR_NEED_ERP)
				break;
		}
	}
	}

	/* start ERP requests in upper loop */
	if (rc)
		goto retry;