[Devel] [PATCH rh7 5/5] cbt: add blk_cbt_map_copy_once() helper
Dmitry Monakhov
dmonakhov at openvz.org
Mon Apr 11 02:27:11 PDT 2016
Maxim Patlasov <mpatlasov at virtuozzo.com> writes:
> Ploop will use the helper to make private "snapshot" copy of CBT mask.
>
> Signed-off-by: Maxim Patlasov <mpatlasov at virtuozzo.com>
ACK
> ---
> block/blk-cbt.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
> include/linux/blkdev.h | 2 ++
> 2 files changed, 61 insertions(+)
>
> diff --git a/block/blk-cbt.c b/block/blk-cbt.c
> index 4bf9666..850fd7e 100644
> --- a/block/blk-cbt.c
> +++ b/block/blk-cbt.c
> @@ -278,6 +278,65 @@ err_cbt:
> return ERR_PTR(-ENOMEM);
> }
>
> +int blk_cbt_map_copy_once(struct request_queue *q, struct page ***map_ptr,
> + blkcnt_t *block_max, blkcnt_t *block_bits)
> +{
> + struct cbt_info *cbt;
> + struct page **map;
> + unsigned long npages;
> + unsigned long i;
> +
> + mutex_lock(&cbt_mutex);
> + cbt = q->cbt;
> +
> + BUG_ON(!cbt);
> + BUG_ON(!cbt->map);
> + BUG_ON(!cbt->block_max);
> +
> + cbt_flush_cache(cbt);
> +
> + npages = NR_PAGES(cbt->block_max);
> + map = vmalloc(npages * sizeof(void*));
> + if (!map)
> + goto fail;
> +
> + memset(map, 0, npages * sizeof(void*));
> +
> + for (i = 0; i < npages; i++) {
> + struct page *page = cbt->map[i];
> +
> + BUG_ON(page == CBT_PAGE_MISSED);
> +
> + if (page) {
> + map[i] = alloc_page(GFP_KERNEL|__GFP_ZERO);
> + if (!map[i])
> + goto fail_pages;
> +
> + spin_lock_page(page);
> + memcpy(page_address(map[i]), page_address(page),
> + PAGE_SIZE);
> + memset(page_address(page), 0, PAGE_SIZE);
> + unlock_page(page);
> + }
> + }
> + mutex_unlock(&cbt_mutex);
> +
> + *map_ptr = map;
> + *block_max = cbt->block_max;
> + *block_bits = cbt->block_bits;
> + return 0;
> +
> +fail_pages:
> + while (--i >= 0) {
> + if (map[i])
> + __free_page(map[i]);
> + }
> +fail:
> + vfree(map);
> + mutex_unlock(&cbt_mutex);
> + return -ENOMEM;
> +}
> +EXPORT_SYMBOL(blk_cbt_map_copy_once);
>
> void blk_cbt_update_size(struct block_device *bdev)
> {
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 9dc69cb..7ae962a 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -1651,6 +1651,8 @@ extern void blk_cbt_update_size(struct block_device *bdev);
> extern void blk_cbt_release(struct request_queue *q);
> extern void blk_cbt_bio_queue(struct request_queue *q, struct bio *bio);
> extern int blk_cbt_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg);
> +extern int blk_cbt_map_copy_once(struct request_queue *q, struct page ***map_ptr,
> + blkcnt_t *block_max, blkcnt_t *block_bits);
> #else /* CONFIG_BLK_DEV_CBT */
> static inline void blk_cbt_update_size(struct block_device *bdev)
> {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 472 bytes
Desc: not available
URL: <http://lists.openvz.org/pipermail/devel/attachments/20160411/8094e7fb/attachment.sig>
More information about the Devel
mailing list