Lines Matching refs:cmd

258 static inline int superblock_read_lock(struct dm_clone_metadata *cmd,  in superblock_read_lock()  argument
261 return dm_bm_read_lock(cmd->bm, SUPERBLOCK_LOCATION, &sb_validator, sblock); in superblock_read_lock()
264 static inline int superblock_write_lock(struct dm_clone_metadata *cmd, in superblock_write_lock() argument
267 return dm_bm_write_lock(cmd->bm, SUPERBLOCK_LOCATION, &sb_validator, sblock); in superblock_write_lock()
270 static inline int superblock_write_lock_zero(struct dm_clone_metadata *cmd, in superblock_write_lock_zero() argument
273 return dm_bm_write_lock_zero(cmd->bm, SUPERBLOCK_LOCATION, &sb_validator, sblock); in superblock_write_lock_zero()
276 static int __copy_sm_root(struct dm_clone_metadata *cmd) in __copy_sm_root() argument
281 r = dm_sm_root_size(cmd->sm, &root_size); in __copy_sm_root()
285 return dm_sm_copy_root(cmd->sm, &cmd->metadata_space_map_root, root_size); in __copy_sm_root()
289 static void __prepare_superblock(struct dm_clone_metadata *cmd, in __prepare_superblock() argument
301 memcpy(&sb->metadata_space_map_root, &cmd->metadata_space_map_root, in __prepare_superblock()
302 sizeof(cmd->metadata_space_map_root)); in __prepare_superblock()
304 sb->region_size = cpu_to_le64(cmd->region_size); in __prepare_superblock()
305 sb->target_size = cpu_to_le64(cmd->target_size); in __prepare_superblock()
306 sb->bitset_root = cpu_to_le64(cmd->bitset_root); in __prepare_superblock()
309 static int __open_metadata(struct dm_clone_metadata *cmd) in __open_metadata() argument
315 r = superblock_read_lock(cmd, &sblock); in __open_metadata()
325 if (cmd->region_size != le64_to_cpu(sb->region_size) || in __open_metadata()
326 cmd->target_size != le64_to_cpu(sb->target_size)) { in __open_metadata()
332 r = dm_tm_open_with_sm(cmd->bm, SUPERBLOCK_LOCATION, in __open_metadata()
335 &cmd->tm, &cmd->sm); in __open_metadata()
342 dm_disk_bitset_init(cmd->tm, &cmd->bitset_info); in __open_metadata()
343 cmd->bitset_root = le64_to_cpu(sb->bitset_root); in __open_metadata()
351 static int __format_metadata(struct dm_clone_metadata *cmd) in __format_metadata() argument
357 r = dm_tm_create_with_sm(cmd->bm, SUPERBLOCK_LOCATION, &cmd->tm, &cmd->sm); in __format_metadata()
363 dm_disk_bitset_init(cmd->tm, &cmd->bitset_info); in __format_metadata()
365 r = dm_bitset_empty(&cmd->bitset_info, &cmd->bitset_root); in __format_metadata()
371 r = dm_bitset_resize(&cmd->bitset_info, cmd->bitset_root, 0, in __format_metadata()
372 cmd->nr_regions, false, &cmd->bitset_root); in __format_metadata()
374 DMERR("Failed to resize on-disk bitset to %lu entries", cmd->nr_regions); in __format_metadata()
379 r = dm_tm_pre_commit(cmd->tm); in __format_metadata()
385 r = __copy_sm_root(cmd); in __format_metadata()
391 r = superblock_write_lock_zero(cmd, &sblock); in __format_metadata()
398 __prepare_superblock(cmd, sb); in __format_metadata()
399 r = dm_tm_commit(cmd->tm, sblock); in __format_metadata()
408 dm_sm_destroy(cmd->sm); in __format_metadata()
409 dm_tm_destroy(cmd->tm); in __format_metadata()
414 static int __open_or_format_metadata(struct dm_clone_metadata *cmd, bool may_format_device) in __open_or_format_metadata() argument
419 r = __superblock_all_zeroes(cmd->bm, &formatted); in __open_or_format_metadata()
424 return may_format_device ? __format_metadata(cmd) : -EPERM; in __open_or_format_metadata()
426 return __open_metadata(cmd); in __open_or_format_metadata()
429 static int __create_persistent_data_structures(struct dm_clone_metadata *cmd, in __create_persistent_data_structures() argument
435 cmd->bm = dm_block_manager_create(cmd->bdev, in __create_persistent_data_structures()
438 if (IS_ERR(cmd->bm)) { in __create_persistent_data_structures()
440 return PTR_ERR(cmd->bm); in __create_persistent_data_structures()
443 r = __open_or_format_metadata(cmd, may_format_device); in __create_persistent_data_structures()
445 dm_block_manager_destroy(cmd->bm); in __create_persistent_data_structures()
450 static void __destroy_persistent_data_structures(struct dm_clone_metadata *cmd) in __destroy_persistent_data_structures() argument
452 dm_sm_destroy(cmd->sm); in __destroy_persistent_data_structures()
453 dm_tm_destroy(cmd->tm); in __destroy_persistent_data_structures()
454 dm_block_manager_destroy(cmd->bm); in __destroy_persistent_data_structures()
464 static int dirty_map_init(struct dm_clone_metadata *cmd) in dirty_map_init() argument
466 cmd->dmap[0].changed = 0; in dirty_map_init()
467 cmd->dmap[0].dirty_words = kvzalloc(bitmap_size(cmd->nr_words), GFP_KERNEL); in dirty_map_init()
469 if (!cmd->dmap[0].dirty_words) { in dirty_map_init()
474 cmd->dmap[1].changed = 0; in dirty_map_init()
475 cmd->dmap[1].dirty_words = kvzalloc(bitmap_size(cmd->nr_words), GFP_KERNEL); in dirty_map_init()
477 if (!cmd->dmap[1].dirty_words) { in dirty_map_init()
479 kvfree(cmd->dmap[0].dirty_words); in dirty_map_init()
483 cmd->current_dmap = &cmd->dmap[0]; in dirty_map_init()
488 static void dirty_map_exit(struct dm_clone_metadata *cmd) in dirty_map_exit() argument
490 kvfree(cmd->dmap[0].dirty_words); in dirty_map_exit()
491 kvfree(cmd->dmap[1].dirty_words); in dirty_map_exit()
494 static int __load_bitset_in_core(struct dm_clone_metadata *cmd) in __load_bitset_in_core() argument
501 r = dm_bitset_flush(&cmd->bitset_info, cmd->bitset_root, &cmd->bitset_root); in __load_bitset_in_core()
505 r = dm_bitset_cursor_begin(&cmd->bitset_info, cmd->bitset_root, cmd->nr_regions, &c); in __load_bitset_in_core()
511 __set_bit(i, cmd->region_map); in __load_bitset_in_core()
513 __clear_bit(i, cmd->region_map); in __load_bitset_in_core()
515 if (i >= (cmd->nr_regions - 1)) in __load_bitset_in_core()
534 struct dm_clone_metadata *cmd; in dm_clone_metadata_open() local
536 cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); in dm_clone_metadata_open()
537 if (!cmd) { in dm_clone_metadata_open()
542 cmd->bdev = bdev; in dm_clone_metadata_open()
543 cmd->target_size = target_size; in dm_clone_metadata_open()
544 cmd->region_size = region_size; in dm_clone_metadata_open()
545 cmd->nr_regions = dm_sector_div_up(cmd->target_size, cmd->region_size); in dm_clone_metadata_open()
546 cmd->nr_words = BITS_TO_LONGS(cmd->nr_regions); in dm_clone_metadata_open()
548 init_rwsem(&cmd->lock); in dm_clone_metadata_open()
549 spin_lock_init(&cmd->bitmap_lock); in dm_clone_metadata_open()
550 cmd->read_only = 0; in dm_clone_metadata_open()
551 cmd->fail_io = false; in dm_clone_metadata_open()
552 cmd->hydration_done = false; in dm_clone_metadata_open()
554 cmd->region_map = kvmalloc(bitmap_size(cmd->nr_regions), GFP_KERNEL); in dm_clone_metadata_open()
555 if (!cmd->region_map) { in dm_clone_metadata_open()
561 r = __create_persistent_data_structures(cmd, true); in dm_clone_metadata_open()
565 r = __load_bitset_in_core(cmd); in dm_clone_metadata_open()
571 r = dirty_map_init(cmd); in dm_clone_metadata_open()
575 if (bitmap_full(cmd->region_map, cmd->nr_regions)) in dm_clone_metadata_open()
576 cmd->hydration_done = true; in dm_clone_metadata_open()
578 return cmd; in dm_clone_metadata_open()
581 __destroy_persistent_data_structures(cmd); in dm_clone_metadata_open()
584 kvfree(cmd->region_map); in dm_clone_metadata_open()
587 kfree(cmd); in dm_clone_metadata_open()
592 void dm_clone_metadata_close(struct dm_clone_metadata *cmd) in dm_clone_metadata_close() argument
594 if (!cmd->fail_io) in dm_clone_metadata_close()
595 __destroy_persistent_data_structures(cmd); in dm_clone_metadata_close()
597 dirty_map_exit(cmd); in dm_clone_metadata_close()
598 kvfree(cmd->region_map); in dm_clone_metadata_close()
599 kfree(cmd); in dm_clone_metadata_close()
602 bool dm_clone_is_hydration_done(struct dm_clone_metadata *cmd) in dm_clone_is_hydration_done() argument
604 return cmd->hydration_done; in dm_clone_is_hydration_done()
607 bool dm_clone_is_region_hydrated(struct dm_clone_metadata *cmd, unsigned long region_nr) in dm_clone_is_region_hydrated() argument
609 return dm_clone_is_hydration_done(cmd) || test_bit(region_nr, cmd->region_map); in dm_clone_is_region_hydrated()
612 bool dm_clone_is_range_hydrated(struct dm_clone_metadata *cmd, in dm_clone_is_range_hydrated() argument
617 if (dm_clone_is_hydration_done(cmd)) in dm_clone_is_range_hydrated()
620 bit = find_next_zero_bit(cmd->region_map, cmd->nr_regions, start); in dm_clone_is_range_hydrated()
625 unsigned long dm_clone_nr_of_hydrated_regions(struct dm_clone_metadata *cmd) in dm_clone_nr_of_hydrated_regions() argument
627 return bitmap_weight(cmd->region_map, cmd->nr_regions); in dm_clone_nr_of_hydrated_regions()
630 unsigned long dm_clone_find_next_unhydrated_region(struct dm_clone_metadata *cmd, in dm_clone_find_next_unhydrated_region() argument
633 return find_next_zero_bit(cmd->region_map, cmd->nr_regions, start); in dm_clone_find_next_unhydrated_region()
636 static int __update_metadata_word(struct dm_clone_metadata *cmd, unsigned long word) in __update_metadata_word() argument
640 unsigned long max_index = min(cmd->nr_regions, (word + 1) * BITS_PER_LONG); in __update_metadata_word()
643 if (test_bit(index, cmd->region_map)) { in __update_metadata_word()
644 r = dm_bitset_set_bit(&cmd->bitset_info, cmd->bitset_root, in __update_metadata_word()
645 index, &cmd->bitset_root); in __update_metadata_word()
658 static int __metadata_commit(struct dm_clone_metadata *cmd) in __metadata_commit() argument
665 r = dm_bitset_flush(&cmd->bitset_info, cmd->bitset_root, &cmd->bitset_root); in __metadata_commit()
672 r = dm_tm_pre_commit(cmd->tm); in __metadata_commit()
679 r = __copy_sm_root(cmd); in __metadata_commit()
686 r = superblock_write_lock_zero(cmd, &sblock); in __metadata_commit()
694 __prepare_superblock(cmd, sb); in __metadata_commit()
697 r = dm_tm_commit(cmd->tm, sblock); in __metadata_commit()
706 if (bitmap_full(cmd->region_map, cmd->nr_regions)) in __metadata_commit()
707 cmd->hydration_done = true; in __metadata_commit()
712 static int __flush_dmap(struct dm_clone_metadata *cmd, struct dirty_map *dmap) in __flush_dmap() argument
719 word = find_next_bit(dmap->dirty_words, cmd->nr_words, word); in __flush_dmap()
721 if (word == cmd->nr_words) in __flush_dmap()
724 r = __update_metadata_word(cmd, word); in __flush_dmap()
731 } while (word < cmd->nr_words); in __flush_dmap()
733 r = __metadata_commit(cmd); in __flush_dmap()
739 spin_lock_irqsave(&cmd->bitmap_lock, flags); in __flush_dmap()
741 spin_unlock_irqrestore(&cmd->bitmap_lock, flags); in __flush_dmap()
746 int dm_clone_metadata_commit(struct dm_clone_metadata *cmd) in dm_clone_metadata_commit() argument
752 down_write(&cmd->lock); in dm_clone_metadata_commit()
754 if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) in dm_clone_metadata_commit()
758 dmap = cmd->current_dmap; in dm_clone_metadata_commit()
761 next_dmap = (dmap == &cmd->dmap[0]) ? &cmd->dmap[1] : &cmd->dmap[0]; in dm_clone_metadata_commit()
773 spin_lock_irqsave(&cmd->bitmap_lock, flags); in dm_clone_metadata_commit()
774 cmd->current_dmap = next_dmap; in dm_clone_metadata_commit()
775 spin_unlock_irqrestore(&cmd->bitmap_lock, flags); in dm_clone_metadata_commit()
781 r = __flush_dmap(cmd, dmap); in dm_clone_metadata_commit()
783 up_write(&cmd->lock); in dm_clone_metadata_commit()
788 int dm_clone_set_region_hydrated(struct dm_clone_metadata *cmd, unsigned long region_nr) in dm_clone_set_region_hydrated() argument
796 spin_lock_irqsave(&cmd->bitmap_lock, flags); in dm_clone_set_region_hydrated()
798 if (cmd->read_only) { in dm_clone_set_region_hydrated()
803 dmap = cmd->current_dmap; in dm_clone_set_region_hydrated()
806 __set_bit(region_nr, cmd->region_map); in dm_clone_set_region_hydrated()
810 spin_unlock_irqrestore(&cmd->bitmap_lock, flags); in dm_clone_set_region_hydrated()
815 int dm_clone_cond_set_range(struct dm_clone_metadata *cmd, unsigned long start, in dm_clone_cond_set_range() argument
822 spin_lock_irqsave(&cmd->bitmap_lock, flags); in dm_clone_cond_set_range()
824 if (cmd->read_only) { in dm_clone_cond_set_range()
829 dmap = cmd->current_dmap; in dm_clone_cond_set_range()
831 if (!test_bit(region_nr, cmd->region_map)) { in dm_clone_cond_set_range()
834 __set_bit(region_nr, cmd->region_map); in dm_clone_cond_set_range()
839 spin_unlock_irqrestore(&cmd->bitmap_lock, flags); in dm_clone_cond_set_range()
854 int dm_clone_reload_in_core_bitset(struct dm_clone_metadata *cmd) in dm_clone_reload_in_core_bitset() argument
858 down_write(&cmd->lock); in dm_clone_reload_in_core_bitset()
860 if (cmd->fail_io) in dm_clone_reload_in_core_bitset()
863 r = __load_bitset_in_core(cmd); in dm_clone_reload_in_core_bitset()
865 up_write(&cmd->lock); in dm_clone_reload_in_core_bitset()
870 bool dm_clone_changed_this_transaction(struct dm_clone_metadata *cmd) in dm_clone_changed_this_transaction() argument
875 spin_lock_irqsave(&cmd->bitmap_lock, flags); in dm_clone_changed_this_transaction()
876 r = cmd->dmap[0].changed || cmd->dmap[1].changed; in dm_clone_changed_this_transaction()
877 spin_unlock_irqrestore(&cmd->bitmap_lock, flags); in dm_clone_changed_this_transaction()
882 int dm_clone_metadata_abort(struct dm_clone_metadata *cmd) in dm_clone_metadata_abort() argument
886 down_write(&cmd->lock); in dm_clone_metadata_abort()
888 if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) in dm_clone_metadata_abort()
891 __destroy_persistent_data_structures(cmd); in dm_clone_metadata_abort()
893 r = __create_persistent_data_structures(cmd, false); in dm_clone_metadata_abort()
896 cmd->fail_io = true; in dm_clone_metadata_abort()
899 up_write(&cmd->lock); in dm_clone_metadata_abort()
904 void dm_clone_metadata_set_read_only(struct dm_clone_metadata *cmd) in dm_clone_metadata_set_read_only() argument
908 down_write(&cmd->lock); in dm_clone_metadata_set_read_only()
910 spin_lock_irqsave(&cmd->bitmap_lock, flags); in dm_clone_metadata_set_read_only()
911 cmd->read_only = 1; in dm_clone_metadata_set_read_only()
912 spin_unlock_irqrestore(&cmd->bitmap_lock, flags); in dm_clone_metadata_set_read_only()
914 if (!cmd->fail_io) in dm_clone_metadata_set_read_only()
915 dm_bm_set_read_only(cmd->bm); in dm_clone_metadata_set_read_only()
917 up_write(&cmd->lock); in dm_clone_metadata_set_read_only()
920 void dm_clone_metadata_set_read_write(struct dm_clone_metadata *cmd) in dm_clone_metadata_set_read_write() argument
924 down_write(&cmd->lock); in dm_clone_metadata_set_read_write()
926 spin_lock_irqsave(&cmd->bitmap_lock, flags); in dm_clone_metadata_set_read_write()
927 cmd->read_only = 0; in dm_clone_metadata_set_read_write()
928 spin_unlock_irqrestore(&cmd->bitmap_lock, flags); in dm_clone_metadata_set_read_write()
930 if (!cmd->fail_io) in dm_clone_metadata_set_read_write()
931 dm_bm_set_read_write(cmd->bm); in dm_clone_metadata_set_read_write()
933 up_write(&cmd->lock); in dm_clone_metadata_set_read_write()
936 int dm_clone_get_free_metadata_block_count(struct dm_clone_metadata *cmd, in dm_clone_get_free_metadata_block_count() argument
941 down_read(&cmd->lock); in dm_clone_get_free_metadata_block_count()
943 if (!cmd->fail_io) in dm_clone_get_free_metadata_block_count()
944 r = dm_sm_get_nr_free(cmd->sm, result); in dm_clone_get_free_metadata_block_count()
946 up_read(&cmd->lock); in dm_clone_get_free_metadata_block_count()
951 int dm_clone_get_metadata_dev_size(struct dm_clone_metadata *cmd, in dm_clone_get_metadata_dev_size() argument
956 down_read(&cmd->lock); in dm_clone_get_metadata_dev_size()
958 if (!cmd->fail_io) in dm_clone_get_metadata_dev_size()
959 r = dm_sm_get_nr_blocks(cmd->sm, result); in dm_clone_get_metadata_dev_size()
961 up_read(&cmd->lock); in dm_clone_get_metadata_dev_size()