[Devel] [PATCH RH8 33/61] ploop: Convert track_bio()

Kirill Tkhai ktkhai at virtuozzo.com
Fri May 14 18:57:33 MSK 2021


Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/md/dm-ploop-map.c |   16 +++++++++-------
 drivers/md/dm-ploop.h     |    6 +++---
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 26480c713cd6..ef3e2a571de4 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -149,6 +149,9 @@ void track_dst_cluster(struct ploop *ploop, u32 dst_cluster)
 {
 	unsigned long flags;
 
+	if (!ploop->tracking_bitmap)
+		return;
+
 	read_lock_irqsave(&ploop->bat_rwlock, flags);
 	if (ploop->tracking_bitmap && !WARN_ON(dst_cluster >= ploop->tb_nr))
 		set_bit(dst_cluster, ploop->tracking_bitmap);
@@ -163,15 +166,13 @@ void track_dst_cluster(struct ploop *ploop, u32 dst_cluster)
  * Thus, userspace mustn't do maintaince operations in parallel
  * with tracking.
  */
-void __track_bio(struct ploop *ploop, struct bio *bio)
+void __track_pio(struct ploop *ploop, struct pio *pio)
 {
-	unsigned int dst_cluster = bio->bi_iter.bi_sector >> ploop->cluster_log;
+	unsigned int dst_cluster = pio->bi_iter.bi_sector >> ploop->cluster_log;
 
-	if (!op_is_write(bio->bi_opf) || !bio_sectors(bio))
+	if (!op_is_write(pio->bi_opf) || !bvec_iter_sectors((pio)->bi_iter))
 		return;
 
-	WARN_ON_ONCE(bio->bi_disk != ploop->origin_dev->bdev->bd_disk);
-
 	track_dst_cluster(ploop, dst_cluster);
 }
 
@@ -970,9 +971,10 @@ static void ploop_cow_endio(struct bio *cluster_bio)
 {
 	struct ploop_cow *cow = cluster_bio->bi_private;
 	struct ploop *ploop = cow->ploop;
+	unsigned int dst_cluster = cluster_bio->bi_iter.bi_sector >> ploop->cluster_log;
 	unsigned long flags;
 
-	track_bio(ploop, cluster_bio);
+	track_dst_cluster(ploop, dst_cluster);
 
 	spin_lock_irqsave(&ploop->deferred_lock, flags);
 	bio_list_add(&ploop->delta_cow_action_list, cluster_bio);
@@ -1667,7 +1669,7 @@ int ploop_endio(struct dm_target *ti, struct bio *bio, blk_status_t *err)
 		 * and for data bios. Check for ref_index to not
 		 * track @bio twice.
 		 */
-		track_bio(ploop, bio);
+		track_pio(ploop, pio);
 	}
 	/*
 	 * This function is called from the very beginning
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 581ebc999c8b..a35770437dc6 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -477,13 +477,13 @@ static inline void init_bat_entries_iter(struct ploop *ploop, unsigned int page_
 		*end = ((ploop->nr_bat_entries + PLOOP_MAP_OFFSET) % count) - 1;
 }
 
-extern void __track_bio(struct ploop *ploop, struct bio *bio);
+extern void __track_pio(struct ploop *ploop, struct pio *pio);
 
-static inline void track_bio(struct ploop *ploop, struct bio *bio)
+static inline void track_pio(struct ploop *ploop, struct pio *pio)
 {
 	/* See comment in process_tracking_start() about visibility */
 	if (unlikely(ploop->tracking_bitmap))
-		__track_bio(ploop, bio);
+		__track_pio(ploop, pio);
 }
 
 extern struct pio *find_endio_hook_range(struct ploop *ploop, struct rb_root *root,




More information about the Devel mailing list