[Devel] [PATCH RH8 54/61] ploop: Kill data bio endio
Kirill Tkhai
ktkhai at virtuozzo.com
Fri May 14 18:59:26 MSK 2021
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
drivers/md/dm-ploop-map.c | 27 +++++++++++++++------------
drivers/md/dm-ploop.h | 2 +-
2 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index ca4a3a154578..a0bbb4607923 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -91,6 +91,7 @@ static void init_pio(struct ploop *ploop, unsigned int bi_op, struct pio *pio)
pio->ploop = ploop;
pio->bi_op = bi_op;
pio->action = PLOOP_END_IO_NONE;
+ pio->is_data_alloc = false;
pio->ref_index = PLOOP_REF_INDEX_INVALID;
pio->bi_status = BLK_STS_OK;
pio->piwb = NULL;
@@ -863,13 +864,14 @@ static int ploop_alloc_cluster(struct ploop *ploop, struct ploop_index_wb *piwb,
return ret;
}
-
-static int ploop_data_pio_end(struct pio *pio)
+static bool ploop_data_pio_end(struct pio *pio)
{
struct ploop_index_wb *piwb = pio->piwb;
unsigned long flags;
bool completed;
+ dec_nr_inflight(piwb->ploop, pio);
+
spin_lock_irqsave(&piwb->lock, flags);
completed = piwb->completed;
if (!completed)
@@ -878,13 +880,9 @@ static int ploop_data_pio_end(struct pio *pio)
pio->bi_status = piwb->bi_status;
spin_unlock_irqrestore(&piwb->lock, flags);
- dec_nr_inflight(piwb->ploop, pio);
-
- if (!completed)
- return DM_ENDIO_INCOMPLETE;
-
put_piwb(piwb);
- return DM_ENDIO_DONE;
+
+ return completed;
}
static bool ploop_attach_end_action(struct pio *h, struct ploop_index_wb *piwb)
@@ -898,7 +896,7 @@ static bool ploop_attach_end_action(struct pio *h, struct ploop_index_wb *piwb)
if (!atomic_inc_not_zero(&piwb->count))
return false;
- h->action = PLOOP_END_IO_DATA_BIO;
+ h->is_data_alloc = true;
h->piwb = piwb;
return true;
@@ -926,9 +924,17 @@ static void ploop_read_aio_complete(struct kiocb *iocb, long ret, long ret2)
static void data_rw_complete(struct pio *pio)
{
+ bool completed;
+
if (pio->ret != pio->bi_iter.bi_size)
pio->bi_status = BLK_STS_IOERR;
+ if (pio->is_data_alloc) {
+ completed = ploop_data_pio_end(pio);
+ if (!completed)
+ return;
+ }
+
pio_endio(pio);
}
@@ -1761,9 +1767,6 @@ static int ploop_endio(struct ploop *ploop, struct pio *pio)
* processing, and that we are going to call bi_end_io
* directly later again.
*/
- if (pio->action == PLOOP_END_IO_DATA_BIO)
- ret = ploop_data_pio_end(pio);
-
if (pio->action == PLOOP_END_IO_DISCARD_INDEX_BIO)
ret = ploop_discard_index_pio_end(ploop, pio);
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 59f706ac8af5..0b28fa8b453e 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -257,9 +257,9 @@ struct pio {
unsigned int cluster;
#define PLOOP_END_IO_NONE 0
-#define PLOOP_END_IO_DATA_BIO 1
#define PLOOP_END_IO_DISCARD_INDEX_BIO 3
unsigned int action:2;
+ bool is_data_alloc:1;
/*
* 0 and 1 are related to inflight_bios_ref[],
* 2 means index is not assigned.
More information about the Devel
mailing list