Lines Matching refs:dev_info
112 struct dcssblk_dev_info *dev_info;
115 dev_info = container_of(dev, struct dcssblk_dev_info, dev);
116 list_for_each_entry_safe(entry, temp, &dev_info->seg_list, lh) {
120 kfree(dev_info);
131 dcssblk_assign_free_minor(struct dcssblk_dev_info *dev_info)
136 if (dev_info == NULL)
148 dev_info->gd->first_minor = minor;
178 struct dcssblk_dev_info *dev_info;
181 list_for_each_entry(dev_info, &dcssblk_devices, lh) {
182 list_for_each_entry(entry, &dev_info->seg_list, lh) {
194 dcssblk_find_highest_addr(struct dcssblk_dev_info *dev_info)
200 list_for_each_entry(entry, &dev_info->seg_list, lh) {
211 dcssblk_find_lowest_addr(struct dcssblk_dev_info *dev_info)
219 list_for_each_entry(entry, &dev_info->seg_list, lh) {
235 dcssblk_is_continuous(struct dcssblk_dev_info *dev_info)
240 if (dev_info->num_of_segments <= 1)
243 sort_list = kcalloc(dev_info->num_of_segments,
249 list_for_each_entry(entry, &dev_info->seg_list, lh) {
255 for (i = 0; i < dev_info->num_of_segments; i++)
256 for (j = 0; j < dev_info->num_of_segments; j++)
267 for (i = 0; i < dev_info->num_of_segments - 1; i++) {
339 struct dcssblk_dev_info *dev_info;
341 dev_info = container_of(dev, struct dcssblk_dev_info, dev);
342 return sprintf(buf, dev_info->is_shared ? "1\n" : "0\n");
348 struct dcssblk_dev_info *dev_info;
355 dev_info = container_of(dev, struct dcssblk_dev_info, dev);
356 if (atomic_read(&dev_info->use_count)) {
362 list_for_each_entry(entry, &dev_info->seg_list, lh) {
371 dev_info->is_shared = 1;
372 switch (dev_info->segment_type) {
376 set_disk_ro(dev_info->gd, 1);
380 if (dev_info->segment_type == SEG_TYPE_SC) {
383 dev_info->segment_name);
387 list_for_each_entry(entry, &dev_info->seg_list, lh) {
396 dev_info->is_shared = 0;
397 set_disk_ro(dev_info->gd, 0);
407 "change\n", dev_info->segment_name);
409 list_for_each_entry(entry, &dev_info->seg_list, lh) {
413 list_del(&dev_info->lh);
416 dax_remove_host(dev_info->gd);
417 kill_dax(dev_info->dax_dev);
418 put_dax(dev_info->dax_dev);
419 del_gendisk(dev_info->gd);
420 put_disk(dev_info->gd);
444 struct dcssblk_dev_info *dev_info;
446 dev_info = container_of(dev, struct dcssblk_dev_info, dev);
447 return sprintf(buf, dev_info->save_pending ? "1\n" : "0\n");
453 struct dcssblk_dev_info *dev_info;
458 dev_info = container_of(dev, struct dcssblk_dev_info, dev);
462 if (atomic_read(&dev_info->use_count) == 0) {
465 "saved\n", dev_info->segment_name);
466 list_for_each_entry(entry, &dev_info->seg_list, lh) {
480 dev_info->segment_name);
481 dev_info->save_pending = 1;
484 if (dev_info->save_pending) {
487 dev_info->save_pending = 0;
490 dev_info->segment_name);
511 struct dcssblk_dev_info *dev_info;
515 dev_info = container_of(dev, struct dcssblk_dev_info, dev);
518 list_for_each_entry(entry, &dev_info->seg_list, lh) {
550 struct dcssblk_dev_info *dev_info;
555 dev_info = NULL;
596 dev_info = kzalloc(sizeof(struct dcssblk_dev_info),
598 if (dev_info == NULL) {
602 strcpy(dev_info->segment_name, local_buf);
603 dev_info->segment_type = seg_info->segment_type;
604 INIT_LIST_HEAD(&dev_info->seg_list);
606 list_add_tail(&seg_info->lh, &dev_info->seg_list);
620 dev_info->num_of_segments = num_of_segments;
621 rc = dcssblk_is_continuous(dev_info);
625 dev_info->start = dcssblk_find_lowest_addr(dev_info);
626 dev_info->end = dcssblk_find_highest_addr(dev_info);
628 dev_set_name(&dev_info->dev, "%s", dev_info->segment_name);
629 dev_info->dev.release = dcssblk_release_segment;
630 dev_info->dev.groups = dcssblk_dev_attr_groups;
631 INIT_LIST_HEAD(&dev_info->lh);
632 dev_info->gd = blk_alloc_disk(NUMA_NO_NODE);
633 if (dev_info->gd == NULL) {
637 dev_info->gd->major = dcssblk_major;
638 dev_info->gd->minors = DCSSBLK_MINORS_PER_DISK;
639 dev_info->gd->fops = &dcssblk_devops;
640 dev_info->gd->private_data = dev_info;
641 dev_info->gd->flags |= GENHD_FL_NO_PART;
642 blk_queue_logical_block_size(dev_info->gd->queue, 4096);
643 blk_queue_flag_set(QUEUE_FLAG_DAX, dev_info->gd->queue);
645 seg_byte_size = (dev_info->end - dev_info->start + 1);
646 set_capacity(dev_info->gd, seg_byte_size >> 9); // size in sectors
650 dev_info->save_pending = 0;
651 dev_info->is_shared = 1;
652 dev_info->dev.parent = dcssblk_root_dev;
662 rc = dcssblk_assign_free_minor(dev_info);
665 sprintf(dev_info->gd->disk_name, "dcssblk%d",
666 dev_info->gd->first_minor);
667 list_add_tail(&dev_info->lh, &dcssblk_devices);
676 rc = device_register(&dev_info->dev);
680 dev_info->dax_dev = alloc_dax(dev_info, &dcssblk_dax_ops);
681 if (IS_ERR(dev_info->dax_dev)) {
682 rc = PTR_ERR(dev_info->dax_dev);
683 dev_info->dax_dev = NULL;
686 set_dax_synchronous(dev_info->dax_dev);
687 rc = dax_add_host(dev_info->dax_dev, dev_info->gd);
691 get_device(&dev_info->dev);
692 rc = device_add_disk(&dev_info->dev, dev_info->gd, NULL);
696 switch (dev_info->segment_type) {
700 set_disk_ro(dev_info->gd,1);
703 set_disk_ro(dev_info->gd,0);
711 put_device(&dev_info->dev);
712 dax_remove_host(dev_info->gd);
714 kill_dax(dev_info->dax_dev);
715 put_dax(dev_info->dax_dev);
717 list_del(&dev_info->lh);
718 put_disk(dev_info->gd);
719 list_for_each_entry(seg_info, &dev_info->seg_list, lh) {
722 put_device(&dev_info->dev);
726 list_del(&dev_info->lh);
728 put_disk(dev_info->gd);
731 if (dev_info == NULL)
733 list_for_each_entry_safe(seg_info, temp, &dev_info->seg_list, lh) {
738 kfree(dev_info);
751 struct dcssblk_dev_info *dev_info;
776 dev_info = dcssblk_get_device_by_name(local_buf);
777 if (dev_info == NULL) {
784 if (atomic_read(&dev_info->use_count) != 0) {
792 list_del(&dev_info->lh);
794 list_for_each_entry(entry, &dev_info->seg_list, lh)
798 dax_remove_host(dev_info->gd);
799 kill_dax(dev_info->dax_dev);
800 put_dax(dev_info->dax_dev);
801 del_gendisk(dev_info->gd);
802 put_disk(dev_info->gd);
804 device_unregister(&dev_info->dev);
805 put_device(&dev_info->dev);
816 struct dcssblk_dev_info *dev_info = disk->private_data;
819 if (NULL == dev_info) {
823 atomic_inc(&dev_info->use_count);
832 struct dcssblk_dev_info *dev_info = disk->private_data;
835 if (!dev_info) {
840 if (atomic_dec_and_test(&dev_info->use_count)
841 && (dev_info->save_pending)) {
843 "now\n", dev_info->segment_name);
844 list_for_each_entry(entry, &dev_info->seg_list, lh) {
852 dev_info->save_pending = 0;
860 struct dcssblk_dev_info *dev_info;
869 dev_info = bio->bi_bdev->bd_disk->private_data;
870 if (dev_info == NULL)
877 if (dev_info->is_shared) {
878 switch (dev_info->segment_type) {
885 dev_name(&dev_info->dev));
894 source_addr = dev_info->start + (index<<12) + bytes_done;
912 __dcssblk_direct_access(struct dcssblk_dev_info *dev_info, pgoff_t pgoff,
918 dev_sz = dev_info->end - dev_info->start + 1;
920 *kaddr = (void *) dev_info->start + offset;
922 *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset),
933 struct dcssblk_dev_info *dev_info = dax_get_private(dax_dev);
935 return __dcssblk_direct_access(dev_info, pgoff, nr_pages, kaddr, pfn);
943 struct dcssblk_dev_info *dev_info;
962 dev_info = dcssblk_get_device_by_name(buf);
964 if (dev_info)
965 dcssblk_shared_store(&dev_info->dev,