[1/2] ploop: Do not forget to put io context

Submitted by Kirill Tkhai on March 21, 2019, 10:14 a.m.

Details

Message ID 155316327647.18087.4810034514905448150.stgit@localhost.localdomain
State New
Series "Series without cover letter"
Headers show

Commit Message

Kirill Tkhai March 21, 2019, 10:14 a.m.
We have to put saved_ioc before we return from
this ploop_req_state_process(). Otherwise, it
becomes leaked.

So, move discard check into ploop_entry_request(),
and then just go by generic way to bottom of
ploop_req_state_process().

This is not connected with recent discard changes,
and it should go to RK too (small adoptation is
required).

Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 drivers/block/ploop/dev.c |   48 ++++++++++++++++++++-------------------------
 1 file changed, 21 insertions(+), 27 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index 26745d9fc81f..f8b9b0bcba78 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -2181,6 +2181,21 @@  complete_unsupported_discard_req(struct ploop_request * preq)
 	ploop_complete_io_state(preq);
 }
 
+static bool ploop_can_issue_discard(struct ploop_device *plo,
+				    struct ploop_request *preq)
+{
+	if (test_bit(PLOOP_REQ_DISCARD, &preq->state))
+		return true;
+
+	if (test_bit(PLOOP_S_NO_FALLOC_DISCARD, &plo->state))
+		return false;
+
+	if (!list_is_singular(&plo->map.delta_list))
+		return false;
+
+	return whole_block(plo, preq);
+}
+
 static void
 ploop_entry_request(struct ploop_request * preq)
 {
@@ -2192,6 +2207,12 @@  ploop_entry_request(struct ploop_request * preq)
 	int err;
 	iblock_t iblk;
 
+	if ((preq->req_rw & REQ_DISCARD) &&
+	    !ploop_can_issue_discard(plo, preq)) {
+		complete_unsupported_discard_req(preq);
+		return;
+	}
+
 	if (!preq_is_special(preq)) {
 		/* Control request */
 		if (unlikely(preq->bl.head == NULL)) {
@@ -2539,21 +2560,6 @@  ploop_entry_request(struct ploop_request * preq)
 	PLOOP_REQ_FAIL_IMMEDIATE(preq, err);
 }
 
-static bool ploop_can_issue_discard(struct ploop_device *plo,
-				    struct ploop_request *preq)
-{
-	if (test_bit(PLOOP_REQ_DISCARD, &preq->state))
-		return true;
-
-	if (test_bit(PLOOP_S_NO_FALLOC_DISCARD, &plo->state))
-		return false;
-
-	if (!list_is_singular(&plo->map.delta_list))
-		return false;
-
-	return whole_block(plo, preq);
-}
-
 static void ploop_req_state_process(struct ploop_request * preq)
 {
 	struct ploop_device * plo = preq->plo;
@@ -2632,18 +2638,6 @@  static void ploop_req_state_process(struct ploop_request * preq)
 			break;
 		}
 
-		if ((preq->req_rw & REQ_DISCARD) &&
-		    !ploop_can_issue_discard(plo, preq)) {
-			complete_unsupported_discard_req(preq);
-#ifdef CONFIG_BEANCOUNTERS
-			if (saved_ub) {
-				saved_ub = set_exec_ub(saved_ub);
-				put_beancounter(saved_ub);
-			}
-#endif
-			return;
-		}
-
 		ploop_entry_request(preq);
 		break;