[Devel] [PATCH RHEL7 COMMIT] ploop: Do not forget to put io context

Konstantin Khorenko khorenko at virtuozzo.com
Fri Mar 22 19:38:06 MSK 2019


The commit is pushed to "branch-rh7-3.10.0-957.10.1.vz7.85.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-957.10.1.vz7.85.2
------>
commit cf65c124b54899c62885cc2677c2bd3ad4fe309a
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date:   Fri Mar 22 19:37:57 2019 +0300

    ploop: Do not forget to put io context
    
    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 at virtuozzo.com>
    Acked-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
 drivers/block/ploop/dev.c | 48 +++++++++++++++++++++--------------------------
 1 file changed, 21 insertions(+), 27 deletions(-)

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;
 



More information about the Devel mailing list