Unverified Commit b22269b3 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!8639 s390/qeth: Fix kernel panic after setting hsuid

parents 8180e943 2f501a4f
Loading
Loading
Loading
Loading
+29 −37
Original line number Diff line number Diff line
@@ -384,6 +384,17 @@ static int qeth_cq_init(struct qeth_card *card)
	return rc;
}

static void qeth_free_cq(struct qeth_card *card)
{
	if (card->qdio.c_q) {
		--card->qdio.no_in_queues;
		qeth_free_qdio_queue(card->qdio.c_q);
		card->qdio.c_q = NULL;
	}
	kfree(card->qdio.out_bufstates);
	card->qdio.out_bufstates = NULL;
}

static int qeth_alloc_cq(struct qeth_card *card)
{
	int rc;
@@ -393,11 +404,13 @@ static int qeth_alloc_cq(struct qeth_card *card)
		struct qdio_outbuf_state *outbuf_states;

		QETH_CARD_TEXT(card, 2, "cqon");
		if (!card->qdio.c_q) {
			card->qdio.c_q = qeth_alloc_qdio_queue();
			if (!card->qdio.c_q) {
				rc = -1;
				goto kmsg_out;
			}
		}
		card->qdio.no_in_queues = 2;
		card->qdio.out_bufstates =
			kcalloc(card->qdio.no_out_queues *
@@ -415,7 +428,7 @@ static int qeth_alloc_cq(struct qeth_card *card)
		}
	} else {
		QETH_CARD_TEXT(card, 2, "nocq");
		card->qdio.c_q = NULL;
		qeth_free_cq(card);
		card->qdio.no_in_queues = 1;
	}
	QETH_CARD_TEXT_(card, 2, "iqc%d", card->qdio.no_in_queues);
@@ -430,17 +443,6 @@ static int qeth_alloc_cq(struct qeth_card *card)
	goto out;
}

static void qeth_free_cq(struct qeth_card *card)
{
	if (card->qdio.c_q) {
		--card->qdio.no_in_queues;
		qeth_free_qdio_queue(card->qdio.c_q);
		card->qdio.c_q = NULL;
	}
	kfree(card->qdio.out_bufstates);
	card->qdio.out_bufstates = NULL;
}

static enum iucv_tx_notify qeth_compute_cq_notification(int sbalf15,
							int delayed)
{
@@ -2657,6 +2659,10 @@ static int qeth_alloc_qdio_queues(struct qeth_card *card)

	QETH_CARD_TEXT(card, 2, "allcqdbf");

	/* completion */
	if (qeth_alloc_cq(card))
		goto out_err;

	if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED,
		QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED)
		return 0;
@@ -2690,10 +2696,6 @@ static int qeth_alloc_qdio_queues(struct qeth_card *card)
		queue->priority = QETH_QIB_PQUE_PRIO_DEFAULT;
	}

	/* completion */
	if (qeth_alloc_cq(card))
		goto out_freeoutq;

	return 0;

out_freeoutq:
@@ -2707,6 +2709,8 @@ static int qeth_alloc_qdio_queues(struct qeth_card *card)
	card->qdio.in_q = NULL;
out_nomem:
	atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
	qeth_free_cq(card);
out_err:
	return -ENOMEM;
}

@@ -2714,11 +2718,12 @@ static void qeth_free_qdio_queues(struct qeth_card *card)
{
	int i, j;

	qeth_free_cq(card);

	if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
		QETH_QDIO_UNINITIALIZED)
		return;

	qeth_free_cq(card);
	for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) {
		if (card->qdio.in_q->bufs[j].rx_skb)
			dev_kfree_skb_any(card->qdio.in_q->bufs[j].rx_skb);
@@ -3758,24 +3763,11 @@ static void qeth_qdio_poll(struct ccw_device *cdev, unsigned long card_ptr)

int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq)
{
	int rc;

	if (card->options.cq ==  QETH_CQ_NOTAVAILABLE) {
		rc = -1;
		goto out;
	} else {
		if (card->options.cq == cq) {
			rc = 0;
			goto out;
		}
	if (card->options.cq == QETH_CQ_NOTAVAILABLE)
		return -1;

		qeth_free_qdio_queues(card);
	card->options.cq = cq;
		rc = 0;
	}
out:
	return rc;

	return 0;
}
EXPORT_SYMBOL_GPL(qeth_configure_cq);