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

Commit 32e85a0d authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller
Browse files

s390/qeth: keep cmd alive after IO completion



Current code releases the cmd struct after its initial IO has completed.
Any reply processing is done independently, using a separate qeth_reply
struct.
In preparation for merging the cmd and reply structs together, take an
additional reference on the cmd object so that it stays around all the
way until qeth_send_control_data() returns.

Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7c5f8ffb
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1742,6 +1742,9 @@ static int qeth_send_control_data(struct qeth_card *card,

	qeth_enqueue_reply(card, reply);

	/* This pairs with iob->callback, and keeps the iob alive after IO: */
	qeth_get_cmd(iob);

	QETH_CARD_TEXT(card, 6, "noirqpnd");
	spin_lock_irq(get_ccwdev_lock(channel->ccwdev));
	rc = ccw_device_start_timeout(channel->ccwdev, __ccw_from_cmd(iob),
@@ -1752,11 +1755,10 @@ static int qeth_send_control_data(struct qeth_card *card,
				 CARD_DEVID(card), rc);
		QETH_CARD_TEXT_(card, 2, " err%d", rc);
		qeth_dequeue_reply(card, reply);
		qeth_put_reply(reply);
		qeth_put_cmd(iob);
		atomic_set(&channel->irq_pending, 0);
		wake_up(&card->wait_q);
		return rc;
		goto out;
	}

	timeout = wait_for_completion_interruptible_timeout(&reply->received,
@@ -1777,7 +1779,10 @@ static int qeth_send_control_data(struct qeth_card *card,

	if (!rc)
		rc = reply->rc;

out:
	qeth_put_reply(reply);
	qeth_put_cmd(iob);
	return rc;
}