We use generic driver instead. Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com> --- drivers/md/dm-ploop-cmd.c | 165 ------------------------------------------ drivers/md/dm-ploop-map.c | 38 ---------- drivers/md/dm-ploop-target.c | 3 - drivers/md/dm-ploop.h | 13 --- 4 files changed, 219 deletions(-)
diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c index 3ba866cb0ec0..ed46da98b8d7 100644 --- a/drivers/md/dm-ploop-cmd.c +++ b/drivers/md/dm-ploop-cmd.c @@ -249,7 +249,6 @@ static int ploop_write_cluster_sync(struct ploop *ploop, struct pio *pio, if (pio->bi_status) return blk_status_to_errno(pio->bi_status); - /* track_bio(ploop, bio); */ return vfs_fsync(file, 0); } @@ -982,166 +981,6 @@ static int ploop_set_falloc_new_clu(struct ploop *ploop, u64 val) return 0; } -static int process_tracking_start(struct ploop *ploop, void *tracking_bitmap, - u32 tb_nr) -{ - u32 i, nr_pages, end, *bat_entries, dst_clu, nr; - struct rb_node *node; - struct md_page *md; - int ret = 0; - - write_lock_irq(&ploop->bat_rwlock); - ploop->tracking_bitmap = tracking_bitmap; - ploop->tb_nr = tb_nr; - - for_each_clear_bit(i, ploop->holes_bitmap, ploop->hb_nr) - set_bit(i, tracking_bitmap); - nr_pages = bat_clu_to_page_nr(ploop->nr_bat_entries - 1) + 1; - nr = 0; - - ploop_for_each_md_page(ploop, md, node) { - ploop_init_be_iter(ploop, md->id, &i, &end); - bat_entries = kmap_atomic(md->page); - for (; i <= end; i++) { - dst_clu = bat_entries[i]; - if (dst_clu == BAT_ENTRY_NONE || - md->bat_levels[i] != top_level(ploop)) - continue; - if (WARN_ON(dst_clu >= tb_nr)) { - ret = -EIO; - break; - } - set_bit(dst_clu, tracking_bitmap); - } - kunmap_atomic(bat_entries); - if (ret) - break; - nr++; - } - write_unlock_irq(&ploop->bat_rwlock); - - BUG_ON(ret == 0 && nr != nr_pages); - return ret; -} - -static int tracking_get_next(struct ploop *ploop, char *result, - unsigned int maxlen) -{ - unsigned int i, sz = 0, tb_nr = ploop->tb_nr, prev = ploop->tb_cursor; - void *tracking_bitmap = ploop->tracking_bitmap; - int ret = -EAGAIN; - - if (WARN_ON_ONCE(prev > tb_nr - 1)) - prev = 0; - - write_lock_irq(&ploop->bat_rwlock); - i = find_next_bit(tracking_bitmap, tb_nr, prev + 1); - if (i < tb_nr) - goto found; - i = find_first_bit(tracking_bitmap, prev + 1); - if (i >= prev + 1) - goto unlock; -found: - ret = (DMEMIT("%u\n", i)) ? 1 : 0; - if (ret) - clear_bit(i, tracking_bitmap); -unlock: - write_unlock_irq(&ploop->bat_rwlock); - if (ret > 0) - ploop->tb_cursor = i; - return ret; -} - -static u32 max_dst_clu_in_top_delta(struct ploop *ploop) -{ - u32 i, nr_pages, nr = 0, end, *bat_entries, dst_clu = 0; - struct rb_node *node; - struct md_page *md; - - nr_pages = bat_clu_to_page_nr(ploop->nr_bat_entries - 1) + 1; - - read_lock_irq(&ploop->bat_rwlock); - ploop_for_each_md_page(ploop, md, node) { - ploop_init_be_iter(ploop, md->id, &i, &end); - bat_entries = kmap_atomic(md->page); - for (; i <= end; i++) { - if (dst_clu < bat_entries[i] && - md->bat_levels[i] == top_level(ploop)) - dst_clu = bat_entries[i]; - } - kunmap_atomic(bat_entries); - nr++; - } - read_unlock_irq(&ploop->bat_rwlock); - - BUG_ON(nr != nr_pages); - return dst_clu; -} - -static int ploop_tracking_cmd(struct ploop *ploop, const char *suffix, - char *result, unsigned int maxlen) -{ - void *tracking_bitmap = NULL; - unsigned int tb_nr, size; - int ret = 0; - - if (ploop_is_ro(ploop)) - return -EROFS; - - if (!strcmp(suffix, "get_next")) { - if (!ploop->tracking_bitmap) - return -ENOENT; - return tracking_get_next(ploop, result, maxlen); - } - - if (!strcmp(suffix, "start")) { - if (ploop->tracking_bitmap) - return -EEXIST; - if (ploop->maintaince) - return -EBUSY; - /* max_dst_clu_in_top_delta() may be above hb_nr */ - tb_nr = max_dst_clu_in_top_delta(ploop) + 1; - if (tb_nr < ploop->hb_nr) - tb_nr = ploop->hb_nr; - /* - * After max_dst_clu_in_top_delta() unlocks the lock, - * new entries above tb_nr can't occur, since we always - * alloc clusters from holes_bitmap (and they nr < hb_nr). - */ - size = DIV_ROUND_UP(tb_nr, 8 * sizeof(unsigned long)); - size *= sizeof(unsigned long); - tracking_bitmap = kvzalloc(size, GFP_KERNEL); - if (!tracking_bitmap) - return -ENOMEM; - ploop->tb_cursor = tb_nr - 1; - - ret = ploop_suspend_submitting_pios(ploop); - if (ret) - return ret; - - ploop->maintaince = true; - ret = process_tracking_start(ploop, tracking_bitmap, tb_nr); - - ploop_resume_submitting_pios(ploop); - - if (ret) - goto stop; - } else if (!strcmp(suffix, "stop")) { - if (!ploop->tracking_bitmap) - return -ENOENT; -stop: - write_lock_irq(&ploop->bat_rwlock); - kvfree(ploop->tracking_bitmap); - ploop->tracking_bitmap = NULL; - write_unlock_irq(&ploop->bat_rwlock); - ploop->maintaince = false; - } else { - return -EINVAL; - } - - return ret; -} - static int ploop_set_noresume(struct ploop *ploop, char *mode) { bool noresume; @@ -1315,10 +1154,6 @@ int ploop_message(struct dm_target *ti, unsigned int argc, char **argv, if (argc != 2 || kstrtou64(argv[1], 10, &val) < 0) goto unlock; ret = ploop_set_falloc_new_clu(ploop, val); - } else if (!strncmp(argv[0], "tracking_", 9)) { - if (argc != 1) - goto unlock; - ret = ploop_tracking_cmd(ploop, argv[0] + 9, result, maxlen); } else if (!strcmp(argv[0], "set_noresume")) { if (argc != 2) goto unlock; diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index a558445a1bec..8c356de05469 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -227,9 +227,6 @@ void pio_endio(struct pio *pio) { struct ploop *ploop = pio->ploop; - if (pio->ref_index != PLOOP_REF_INDEX_INVALID) - track_pio(ploop, pio); - handle_cleanup(ploop, pio); do_pio_endio(pio); @@ -385,37 +382,6 @@ static bool delay_if_md_busy(struct ploop *ploop, struct md_page *md, return busy; } -void track_dst_cluster(struct ploop *ploop, u32 dst_clu) -{ - unsigned long flags; - - if (!ploop->tracking_bitmap) - return; - - read_lock_irqsave(&ploop->bat_rwlock, flags); - if (ploop->tracking_bitmap && !WARN_ON(dst_clu >= ploop->tb_nr)) - set_bit(dst_clu, ploop->tracking_bitmap); - read_unlock_irqrestore(&ploop->bat_rwlock, flags); -} - -/* - * Userspace calls dm_suspend() to get changed blocks finally. - * dm_suspend() waits for dm's inflight bios, so this function - * must be called after @bio is written and before @bio is ended. - * The only possible exception is writes driven by "message" ioctl. - * Thus, userspace mustn't do maintaince operations in parallel - * with tracking. - */ -void __track_pio(struct ploop *ploop, struct pio *pio) -{ - u32 dst_clu = SEC_TO_CLU(ploop, pio->bi_iter.bi_sector); - - if (!op_is_write(pio->bi_op) || !bvec_iter_sectors((pio)->bi_iter)) - return; - - track_dst_cluster(ploop, dst_clu); -} - static void queue_discard_index_wb(struct ploop *ploop, struct pio *pio) { pio->queue_list_id = PLOOP_LIST_DISCARD; @@ -1574,10 +1540,6 @@ static void md_write_endio(struct pio *pio, void *piwb_ptr, blk_status_t bi_stat { struct ploop_index_wb *piwb = piwb_ptr; struct ploop *ploop = piwb->ploop; - u32 dst_clu; - - dst_clu = POS_TO_CLU(ploop, (u64)piwb->page_id << PAGE_SHIFT); - track_dst_cluster(ploop, dst_clu); if (bi_status) { md_fsync_endio(pio, piwb, bi_status); diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c index 0d693ccd387d..ad4207156e20 100644 --- a/drivers/md/dm-ploop-target.c +++ b/drivers/md/dm-ploop-target.c @@ -179,7 +179,6 @@ static void ploop_destroy(struct ploop *ploop) mempool_destroy(ploop->prq_pool); kfree(ploop->deltas); kvfree(ploop->holes_bitmap); - kvfree(ploop->tracking_bitmap); free_md_pages_tree(&ploop->bat_entries); kfree(ploop); } @@ -451,8 +450,6 @@ static void ploop_status(struct dm_target *ti, status_type_t type, down_read(&ploop->ctl_rwsem); if (ploop->falloc_new_clu) *p++ = 'f'; - if (ploop->tracking_bitmap) - *p++ = 't'; if (READ_ONCE(ploop->noresume)) *p++ = 'n'; if (READ_ONCE(ploop->event_enospc)) diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h index 0a4c6b78e20e..05824851ba92 100644 --- a/drivers/md/dm-ploop.h +++ b/drivers/md/dm-ploop.h @@ -165,10 +165,6 @@ struct ploop { struct list_head wb_batch_list; - void *tracking_bitmap; - unsigned int tb_nr; /* tracking_bitmap size in bits */ - unsigned int tb_cursor; - /* * Hash table to link non-exclusive submitted bios. * This is needed for discard to check, nobody uses @@ -486,15 +482,6 @@ static inline void ploop_init_be_iter(struct ploop *ploop, u32 page_id, init_be_iter(ploop->nr_bat_entries, page_id, start, end); } -extern void __track_pio(struct ploop *ploop, struct pio *pio); - -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_pio(ploop, pio); -} - extern struct pio *find_pio(struct hlist_head head[], u32 clu); extern int prealloc_md_pages(struct rb_root *root, u32 nr_bat_entries, _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel