Lines Matching refs:dev_info

111 	struct dcssblk_dev_info *dev_info;  in dcssblk_release_segment()  local
114 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_release_segment()
115 list_for_each_entry_safe(entry, temp, &dev_info->seg_list, lh) { in dcssblk_release_segment()
119 kfree(dev_info); in dcssblk_release_segment()
130 dcssblk_assign_free_minor(struct dcssblk_dev_info *dev_info) in dcssblk_assign_free_minor() argument
135 if (dev_info == NULL) in dcssblk_assign_free_minor()
147 dev_info->gd->first_minor = minor; in dcssblk_assign_free_minor()
177 struct dcssblk_dev_info *dev_info; in dcssblk_get_segment_by_name() local
180 list_for_each_entry(dev_info, &dcssblk_devices, lh) { in dcssblk_get_segment_by_name()
181 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_get_segment_by_name()
193 dcssblk_find_highest_addr(struct dcssblk_dev_info *dev_info) in dcssblk_find_highest_addr() argument
199 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_find_highest_addr()
210 dcssblk_find_lowest_addr(struct dcssblk_dev_info *dev_info) in dcssblk_find_lowest_addr() argument
218 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_find_lowest_addr()
234 dcssblk_is_continuous(struct dcssblk_dev_info *dev_info) in dcssblk_is_continuous() argument
239 if (dev_info->num_of_segments <= 1) in dcssblk_is_continuous()
242 sort_list = kcalloc(dev_info->num_of_segments, in dcssblk_is_continuous()
248 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_is_continuous()
254 for (i = 0; i < dev_info->num_of_segments; i++) in dcssblk_is_continuous()
255 for (j = 0; j < dev_info->num_of_segments; j++) in dcssblk_is_continuous()
266 for (i = 0; i < dev_info->num_of_segments - 1; i++) { in dcssblk_is_continuous()
338 struct dcssblk_dev_info *dev_info; in dcssblk_shared_show() local
340 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_shared_show()
341 return sysfs_emit(buf, dev_info->is_shared ? "1\n" : "0\n"); in dcssblk_shared_show()
347 struct dcssblk_dev_info *dev_info; in dcssblk_shared_store() local
354 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_shared_store()
355 if (atomic_read(&dev_info->use_count)) { in dcssblk_shared_store()
361 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_shared_store()
370 dev_info->is_shared = 1; in dcssblk_shared_store()
371 switch (dev_info->segment_type) { in dcssblk_shared_store()
375 set_disk_ro(dev_info->gd, 1); in dcssblk_shared_store()
379 if (dev_info->segment_type == SEG_TYPE_SC) { in dcssblk_shared_store()
382 dev_info->segment_name); in dcssblk_shared_store()
386 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_shared_store()
395 dev_info->is_shared = 0; in dcssblk_shared_store()
396 set_disk_ro(dev_info->gd, 0); in dcssblk_shared_store()
406 "change\n", dev_info->segment_name); in dcssblk_shared_store()
408 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_shared_store()
412 list_del(&dev_info->lh); in dcssblk_shared_store()
415 dax_remove_host(dev_info->gd); in dcssblk_shared_store()
416 kill_dax(dev_info->dax_dev); in dcssblk_shared_store()
417 put_dax(dev_info->dax_dev); in dcssblk_shared_store()
418 del_gendisk(dev_info->gd); in dcssblk_shared_store()
419 put_disk(dev_info->gd); in dcssblk_shared_store()
443 struct dcssblk_dev_info *dev_info; in dcssblk_save_show() local
445 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_save_show()
446 return sysfs_emit(buf, dev_info->save_pending ? "1\n" : "0\n"); in dcssblk_save_show()
452 struct dcssblk_dev_info *dev_info; in dcssblk_save_store() local
457 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_save_store()
461 if (atomic_read(&dev_info->use_count) == 0) { in dcssblk_save_store()
464 "saved\n", dev_info->segment_name); in dcssblk_save_store()
465 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_save_store()
479 dev_info->segment_name); in dcssblk_save_store()
480 dev_info->save_pending = 1; in dcssblk_save_store()
483 if (dev_info->save_pending) { in dcssblk_save_store()
486 dev_info->save_pending = 0; in dcssblk_save_store()
489 dev_info->segment_name); in dcssblk_save_store()
508 struct dcssblk_dev_info *dev_info; in dcssblk_seglist_show() local
514 dev_info = container_of(dev, struct dcssblk_dev_info, dev); in dcssblk_seglist_show()
515 list_for_each_entry(entry, &dev_info->seg_list, lh) in dcssblk_seglist_show()
536 static int dcssblk_setup_dax(struct dcssblk_dev_info *dev_info) in dcssblk_setup_dax() argument
543 dax_dev = alloc_dax(dev_info, &dcssblk_dax_ops); in dcssblk_setup_dax()
547 dev_info->dax_dev = dax_dev; in dcssblk_setup_dax()
548 return dax_add_host(dev_info->dax_dev, dev_info->gd); in dcssblk_setup_dax()
562 struct dcssblk_dev_info *dev_info; in dcssblk_add_store() local
567 dev_info = NULL; in dcssblk_add_store()
608 dev_info = kzalloc(sizeof(struct dcssblk_dev_info), in dcssblk_add_store()
610 if (dev_info == NULL) { in dcssblk_add_store()
614 strscpy(dev_info->segment_name, local_buf); in dcssblk_add_store()
615 dev_info->segment_type = seg_info->segment_type; in dcssblk_add_store()
616 INIT_LIST_HEAD(&dev_info->seg_list); in dcssblk_add_store()
618 list_add_tail(&seg_info->lh, &dev_info->seg_list); in dcssblk_add_store()
632 dev_info->num_of_segments = num_of_segments; in dcssblk_add_store()
633 rc = dcssblk_is_continuous(dev_info); in dcssblk_add_store()
637 dev_info->start = dcssblk_find_lowest_addr(dev_info); in dcssblk_add_store()
638 dev_info->end = dcssblk_find_highest_addr(dev_info); in dcssblk_add_store()
640 dev_set_name(&dev_info->dev, "%s", dev_info->segment_name); in dcssblk_add_store()
641 dev_info->dev.release = dcssblk_release_segment; in dcssblk_add_store()
642 dev_info->dev.groups = dcssblk_dev_attr_groups; in dcssblk_add_store()
643 INIT_LIST_HEAD(&dev_info->lh); in dcssblk_add_store()
644 dev_info->gd = blk_alloc_disk(&lim, NUMA_NO_NODE); in dcssblk_add_store()
645 if (IS_ERR(dev_info->gd)) { in dcssblk_add_store()
646 rc = PTR_ERR(dev_info->gd); in dcssblk_add_store()
649 dev_info->gd->major = dcssblk_major; in dcssblk_add_store()
650 dev_info->gd->minors = DCSSBLK_MINORS_PER_DISK; in dcssblk_add_store()
651 dev_info->gd->fops = &dcssblk_devops; in dcssblk_add_store()
652 dev_info->gd->private_data = dev_info; in dcssblk_add_store()
653 dev_info->gd->flags |= GENHD_FL_NO_PART; in dcssblk_add_store()
655 seg_byte_size = (dev_info->end - dev_info->start + 1); in dcssblk_add_store()
656 set_capacity(dev_info->gd, seg_byte_size >> 9); // size in sectors in dcssblk_add_store()
660 dev_info->save_pending = 0; in dcssblk_add_store()
661 dev_info->is_shared = 1; in dcssblk_add_store()
662 dev_info->dev.parent = dcssblk_root_dev; in dcssblk_add_store()
672 rc = dcssblk_assign_free_minor(dev_info); in dcssblk_add_store()
675 sprintf(dev_info->gd->disk_name, "dcssblk%d", in dcssblk_add_store()
676 dev_info->gd->first_minor); in dcssblk_add_store()
677 list_add_tail(&dev_info->lh, &dcssblk_devices); in dcssblk_add_store()
686 rc = device_register(&dev_info->dev); in dcssblk_add_store()
690 rc = dcssblk_setup_dax(dev_info); in dcssblk_add_store()
694 get_device(&dev_info->dev); in dcssblk_add_store()
695 rc = device_add_disk(&dev_info->dev, dev_info->gd, NULL); in dcssblk_add_store()
699 switch (dev_info->segment_type) { in dcssblk_add_store()
703 set_disk_ro(dev_info->gd,1); in dcssblk_add_store()
706 set_disk_ro(dev_info->gd,0); in dcssblk_add_store()
714 put_device(&dev_info->dev); in dcssblk_add_store()
715 dax_remove_host(dev_info->gd); in dcssblk_add_store()
717 kill_dax(dev_info->dax_dev); in dcssblk_add_store()
718 put_dax(dev_info->dax_dev); in dcssblk_add_store()
720 list_del(&dev_info->lh); in dcssblk_add_store()
721 put_disk(dev_info->gd); in dcssblk_add_store()
722 list_for_each_entry(seg_info, &dev_info->seg_list, lh) { in dcssblk_add_store()
725 put_device(&dev_info->dev); in dcssblk_add_store()
729 list_del(&dev_info->lh); in dcssblk_add_store()
731 put_disk(dev_info->gd); in dcssblk_add_store()
734 if (dev_info == NULL) in dcssblk_add_store()
736 list_for_each_entry_safe(seg_info, temp, &dev_info->seg_list, lh) { in dcssblk_add_store()
741 kfree(dev_info); in dcssblk_add_store()
754 struct dcssblk_dev_info *dev_info; in dcssblk_remove_store() local
779 dev_info = dcssblk_get_device_by_name(local_buf); in dcssblk_remove_store()
780 if (dev_info == NULL) { in dcssblk_remove_store()
787 if (atomic_read(&dev_info->use_count) != 0) { in dcssblk_remove_store()
795 list_del(&dev_info->lh); in dcssblk_remove_store()
797 list_for_each_entry(entry, &dev_info->seg_list, lh) in dcssblk_remove_store()
801 dax_remove_host(dev_info->gd); in dcssblk_remove_store()
802 kill_dax(dev_info->dax_dev); in dcssblk_remove_store()
803 put_dax(dev_info->dax_dev); in dcssblk_remove_store()
804 del_gendisk(dev_info->gd); in dcssblk_remove_store()
805 put_disk(dev_info->gd); in dcssblk_remove_store()
807 device_unregister(&dev_info->dev); in dcssblk_remove_store()
808 put_device(&dev_info->dev); in dcssblk_remove_store()
819 struct dcssblk_dev_info *dev_info = disk->private_data; in dcssblk_open() local
822 if (NULL == dev_info) { in dcssblk_open()
826 atomic_inc(&dev_info->use_count); in dcssblk_open()
835 struct dcssblk_dev_info *dev_info = disk->private_data; in dcssblk_release() local
838 if (!dev_info) { in dcssblk_release()
843 if (atomic_dec_and_test(&dev_info->use_count) in dcssblk_release()
844 && (dev_info->save_pending)) { in dcssblk_release()
846 "now\n", dev_info->segment_name); in dcssblk_release()
847 list_for_each_entry(entry, &dev_info->seg_list, lh) { in dcssblk_release()
855 dev_info->save_pending = 0; in dcssblk_release()
863 struct dcssblk_dev_info *dev_info; in dcssblk_submit_bio() local
872 dev_info = bio->bi_bdev->bd_disk->private_data; in dcssblk_submit_bio()
873 if (dev_info == NULL) in dcssblk_submit_bio()
880 if (dev_info->is_shared) { in dcssblk_submit_bio()
881 switch (dev_info->segment_type) { in dcssblk_submit_bio()
888 dev_name(&dev_info->dev)); in dcssblk_submit_bio()
897 source_addr = dev_info->start + (index<<12) + bytes_done; in dcssblk_submit_bio()
915 __dcssblk_direct_access(struct dcssblk_dev_info *dev_info, pgoff_t pgoff, in __dcssblk_direct_access() argument
921 dev_sz = dev_info->end - dev_info->start + 1; in __dcssblk_direct_access()
923 *kaddr = __va(dev_info->start + offset); in __dcssblk_direct_access()
925 *pfn = PFN_DOWN(dev_info->start + offset); in __dcssblk_direct_access()
935 struct dcssblk_dev_info *dev_info = dax_get_private(dax_dev); in dcssblk_dax_direct_access() local
937 return __dcssblk_direct_access(dev_info, pgoff, nr_pages, kaddr, pfn); in dcssblk_dax_direct_access()
945 struct dcssblk_dev_info *dev_info; in dcssblk_check_params() local
964 dev_info = dcssblk_get_device_by_name(buf); in dcssblk_check_params()
966 if (dev_info) in dcssblk_check_params()
967 dcssblk_shared_store(&dev_info->dev, in dcssblk_check_params()