Lines Matching refs:dev_info
126 struct dcssblk_dev_info *dev_info; in dcssblk_release_segment() local
129 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_release_segment()
130 list_for_each_entry_safe(entry, temp, &dev_info->seg_list, lh) { in dcssblk_release_segment()
134 kfree(dev_info); in dcssblk_release_segment()
145 dcssblk_assign_free_minor(struct dcssblk_dev_info *dev_info) in dcssblk_assign_free_minor() argument
150 if (dev_info == NULL) in dcssblk_assign_free_minor()
162 dev_info->gd->first_minor = minor; in dcssblk_assign_free_minor()
192 struct dcssblk_dev_info *dev_info; in dcssblk_get_segment_by_name() local
195 list_for_each_entry(dev_info, &dcssblk_devices, lh) { in dcssblk_get_segment_by_name()
196 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_get_segment_by_name()
208 dcssblk_find_highest_addr(struct dcssblk_dev_info *dev_info) in dcssblk_find_highest_addr() argument
214 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_find_highest_addr()
225 dcssblk_find_lowest_addr(struct dcssblk_dev_info *dev_info) in dcssblk_find_lowest_addr() argument
233 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_find_lowest_addr()
249 dcssblk_is_continuous(struct dcssblk_dev_info *dev_info) in dcssblk_is_continuous() argument
254 if (dev_info->num_of_segments <= 1) in dcssblk_is_continuous()
257 sort_list = kcalloc(dev_info->num_of_segments, in dcssblk_is_continuous()
263 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_is_continuous()
269 for (i = 0; i < dev_info->num_of_segments; i++) in dcssblk_is_continuous()
270 for (j = 0; j < dev_info->num_of_segments; j++) in dcssblk_is_continuous()
281 for (i = 0; i < dev_info->num_of_segments - 1; i++) { in dcssblk_is_continuous()
353 struct dcssblk_dev_info *dev_info; in dcssblk_shared_show() local
355 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_shared_show()
356 return sprintf(buf, dev_info->is_shared ? "1\n" : "0\n"); in dcssblk_shared_show()
362 struct dcssblk_dev_info *dev_info; in dcssblk_shared_store() local
369 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_shared_store()
370 if (atomic_read(&dev_info->use_count)) { in dcssblk_shared_store()
376 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_shared_store()
385 dev_info->is_shared = 1; in dcssblk_shared_store()
386 switch (dev_info->segment_type) { in dcssblk_shared_store()
390 set_disk_ro(dev_info->gd, 1); in dcssblk_shared_store()
394 if (dev_info->segment_type == SEG_TYPE_SC) { in dcssblk_shared_store()
397 dev_info->segment_name); in dcssblk_shared_store()
401 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_shared_store()
410 dev_info->is_shared = 0; in dcssblk_shared_store()
411 set_disk_ro(dev_info->gd, 0); in dcssblk_shared_store()
421 "change\n", dev_info->segment_name); in dcssblk_shared_store()
423 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_shared_store()
427 list_del(&dev_info->lh); in dcssblk_shared_store()
429 kill_dax(dev_info->dax_dev); in dcssblk_shared_store()
430 put_dax(dev_info->dax_dev); in dcssblk_shared_store()
431 del_gendisk(dev_info->gd); in dcssblk_shared_store()
432 blk_cleanup_queue(dev_info->dcssblk_queue); in dcssblk_shared_store()
433 dev_info->gd->queue = NULL; in dcssblk_shared_store()
434 put_disk(dev_info->gd); in dcssblk_shared_store()
459 struct dcssblk_dev_info *dev_info; in dcssblk_save_show() local
461 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_save_show()
462 return sprintf(buf, dev_info->save_pending ? "1\n" : "0\n"); in dcssblk_save_show()
468 struct dcssblk_dev_info *dev_info; in dcssblk_save_store() local
473 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_save_store()
477 if (atomic_read(&dev_info->use_count) == 0) { in dcssblk_save_store()
480 "saved\n", dev_info->segment_name); in dcssblk_save_store()
481 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_save_store()
495 dev_info->segment_name); in dcssblk_save_store()
496 dev_info->save_pending = 1; in dcssblk_save_store()
499 if (dev_info->save_pending) { in dcssblk_save_store()
502 dev_info->save_pending = 0; in dcssblk_save_store()
505 dev_info->segment_name); in dcssblk_save_store()
526 struct dcssblk_dev_info *dev_info; in dcssblk_seglist_show() local
530 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_seglist_show()
533 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_seglist_show()
565 struct dcssblk_dev_info *dev_info; in dcssblk_add_store() local
570 dev_info = NULL; in dcssblk_add_store()
611 dev_info = kzalloc(sizeof(struct dcssblk_dev_info), in dcssblk_add_store()
613 if (dev_info == NULL) { in dcssblk_add_store()
617 strcpy(dev_info->segment_name, local_buf); in dcssblk_add_store()
618 dev_info->segment_type = seg_info->segment_type; in dcssblk_add_store()
619 INIT_LIST_HEAD(&dev_info->seg_list); in dcssblk_add_store()
621 list_add_tail(&seg_info->lh, &dev_info->seg_list); in dcssblk_add_store()
635 dev_info->num_of_segments = num_of_segments; in dcssblk_add_store()
636 rc = dcssblk_is_continuous(dev_info); in dcssblk_add_store()
640 dev_info->start = dcssblk_find_lowest_addr(dev_info); in dcssblk_add_store()
641 dev_info->end = dcssblk_find_highest_addr(dev_info); in dcssblk_add_store()
643 dev_set_name(&dev_info->dev, "%s", dev_info->segment_name); in dcssblk_add_store()
644 dev_info->dev.release = dcssblk_release_segment; in dcssblk_add_store()
645 dev_info->dev.groups = dcssblk_dev_attr_groups; in dcssblk_add_store()
646 INIT_LIST_HEAD(&dev_info->lh); in dcssblk_add_store()
647 dev_info->gd = alloc_disk(DCSSBLK_MINORS_PER_DISK); in dcssblk_add_store()
648 if (dev_info->gd == NULL) { in dcssblk_add_store()
652 dev_info->gd->major = dcssblk_major; in dcssblk_add_store()
653 dev_info->gd->fops = &dcssblk_devops; in dcssblk_add_store()
654 dev_info->dcssblk_queue = blk_alloc_queue(NUMA_NO_NODE); in dcssblk_add_store()
655 dev_info->gd->queue = dev_info->dcssblk_queue; in dcssblk_add_store()
656 dev_info->gd->private_data = dev_info; in dcssblk_add_store()
657 blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096); in dcssblk_add_store()
658 blk_queue_flag_set(QUEUE_FLAG_DAX, dev_info->dcssblk_queue); in dcssblk_add_store()
660 seg_byte_size = (dev_info->end - dev_info->start + 1); in dcssblk_add_store()
661 set_capacity(dev_info->gd, seg_byte_size >> 9); // size in sectors in dcssblk_add_store()
665 dev_info->save_pending = 0; in dcssblk_add_store()
666 dev_info->is_shared = 1; in dcssblk_add_store()
667 dev_info->dev.parent = dcssblk_root_dev; in dcssblk_add_store()
677 rc = dcssblk_assign_free_minor(dev_info); in dcssblk_add_store()
680 sprintf(dev_info->gd->disk_name, "dcssblk%d", in dcssblk_add_store()
681 dev_info->gd->first_minor); in dcssblk_add_store()
682 list_add_tail(&dev_info->lh, &dcssblk_devices); in dcssblk_add_store()
691 rc = device_register(&dev_info->dev); in dcssblk_add_store()
695 dev_info->dax_dev = alloc_dax(dev_info, dev_info->gd->disk_name, in dcssblk_add_store()
697 if (IS_ERR(dev_info->dax_dev)) { in dcssblk_add_store()
698 rc = PTR_ERR(dev_info->dax_dev); in dcssblk_add_store()
699 dev_info->dax_dev = NULL; in dcssblk_add_store()
703 get_device(&dev_info->dev); in dcssblk_add_store()
704 device_add_disk(&dev_info->dev, dev_info->gd, NULL); in dcssblk_add_store()
706 switch (dev_info->segment_type) { in dcssblk_add_store()
710 set_disk_ro(dev_info->gd,1); in dcssblk_add_store()
713 set_disk_ro(dev_info->gd,0); in dcssblk_add_store()
721 list_del(&dev_info->lh); in dcssblk_add_store()
722 blk_cleanup_queue(dev_info->dcssblk_queue); in dcssblk_add_store()
723 dev_info->gd->queue = NULL; in dcssblk_add_store()
724 put_disk(dev_info->gd); in dcssblk_add_store()
725 list_for_each_entry(seg_info, &dev_info->seg_list, lh) { in dcssblk_add_store()
728 put_device(&dev_info->dev); in dcssblk_add_store()
732 list_del(&dev_info->lh); in dcssblk_add_store()
734 blk_cleanup_queue(dev_info->dcssblk_queue); in dcssblk_add_store()
735 dev_info->gd->queue = NULL; in dcssblk_add_store()
736 put_disk(dev_info->gd); in dcssblk_add_store()
739 if (dev_info == NULL) in dcssblk_add_store()
741 list_for_each_entry_safe(seg_info, temp, &dev_info->seg_list, lh) { in dcssblk_add_store()
746 kfree(dev_info); in dcssblk_add_store()
759 struct dcssblk_dev_info *dev_info; in dcssblk_remove_store() local
784 dev_info = dcssblk_get_device_by_name(local_buf); in dcssblk_remove_store()
785 if (dev_info == NULL) { in dcssblk_remove_store()
792 if (atomic_read(&dev_info->use_count) != 0) { in dcssblk_remove_store()
800 list_del(&dev_info->lh); in dcssblk_remove_store()
801 kill_dax(dev_info->dax_dev); in dcssblk_remove_store()
802 put_dax(dev_info->dax_dev); in dcssblk_remove_store()
803 del_gendisk(dev_info->gd); in dcssblk_remove_store()
804 blk_cleanup_queue(dev_info->dcssblk_queue); in dcssblk_remove_store()
805 dev_info->gd->queue = NULL; in dcssblk_remove_store()
806 put_disk(dev_info->gd); in dcssblk_remove_store()
809 list_for_each_entry(entry, &dev_info->seg_list, lh) in dcssblk_remove_store()
814 device_unregister(&dev_info->dev); in dcssblk_remove_store()
815 put_device(&dev_info->dev); in dcssblk_remove_store()
826 struct dcssblk_dev_info *dev_info; in dcssblk_open() local
829 dev_info = bdev->bd_disk->private_data; in dcssblk_open()
830 if (NULL == dev_info) { in dcssblk_open()
834 atomic_inc(&dev_info->use_count); in dcssblk_open()
843 struct dcssblk_dev_info *dev_info = disk->private_data; in dcssblk_release() local
846 if (!dev_info) { in dcssblk_release()
851 if (atomic_dec_and_test(&dev_info->use_count) in dcssblk_release()
852 && (dev_info->save_pending)) { in dcssblk_release()
854 "now\n", dev_info->segment_name); in dcssblk_release()
855 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_release()
863 dev_info->save_pending = 0; in dcssblk_release()
871 struct dcssblk_dev_info *dev_info; in dcssblk_submit_bio() local
882 dev_info = bio->bi_disk->private_data; in dcssblk_submit_bio()
883 if (dev_info == NULL) in dcssblk_submit_bio()
894 if (dev_info->is_shared) { in dcssblk_submit_bio()
895 switch (dev_info->segment_type) { in dcssblk_submit_bio()
902 dev_name(&dev_info->dev)); in dcssblk_submit_bio()
912 source_addr = dev_info->start + (index<<12) + bytes_done; in dcssblk_submit_bio()
933 __dcssblk_direct_access(struct dcssblk_dev_info *dev_info, pgoff_t pgoff, in __dcssblk_direct_access() argument
939 dev_sz = dev_info->end - dev_info->start + 1; in __dcssblk_direct_access()
941 *kaddr = (void *) dev_info->start + offset; in __dcssblk_direct_access()
943 *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), in __dcssblk_direct_access()
953 struct dcssblk_dev_info *dev_info = dax_get_private(dax_dev); in dcssblk_dax_direct_access() local
955 return __dcssblk_direct_access(dev_info, pgoff, nr_pages, kaddr, pfn); in dcssblk_dax_direct_access()
963 struct dcssblk_dev_info *dev_info; in dcssblk_check_params() local
982 dev_info = dcssblk_get_device_by_name(buf); in dcssblk_check_params()
984 if (dev_info) in dcssblk_check_params()
985 dcssblk_shared_store(&dev_info->dev, in dcssblk_check_params()
1005 struct dcssblk_dev_info *dev_info; in dcssblk_freeze() local
1008 list_for_each_entry(dev_info, &dcssblk_devices, lh) { in dcssblk_freeze()
1009 switch (dev_info->segment_type) { in dcssblk_freeze()
1013 if (!dev_info->is_shared) in dcssblk_freeze()
1026 dev_info->segment_name); in dcssblk_freeze()
1032 struct dcssblk_dev_info *dev_info; in dcssblk_restore() local
1037 list_for_each_entry(dev_info, &dcssblk_devices, lh) { in dcssblk_restore()
1038 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_restore()