diff options
-rw-r--r-- | drivers/dax/dax.c | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c index a5ed59a5a968..e5f85550dc25 100644 --- a/drivers/dax/dax.c +++ b/drivers/dax/dax.c | |||
@@ -677,8 +677,6 @@ static void dax_dev_release(struct device *dev) | |||
677 | 677 | ||
678 | static void kill_dax_dev(struct dax_dev *dax_dev) | 678 | static void kill_dax_dev(struct dax_dev *dax_dev) |
679 | { | 679 | { |
680 | struct cdev *cdev = &dax_dev->cdev; | ||
681 | |||
682 | /* | 680 | /* |
683 | * Note, rcu is not protecting the liveness of dax_dev, rcu is | 681 | * Note, rcu is not protecting the liveness of dax_dev, rcu is |
684 | * ensuring that any fault handlers that might have seen | 682 | * ensuring that any fault handlers that might have seen |
@@ -689,7 +687,6 @@ static void kill_dax_dev(struct dax_dev *dax_dev) | |||
689 | dax_dev->alive = false; | 687 | dax_dev->alive = false; |
690 | synchronize_rcu(); | 688 | synchronize_rcu(); |
691 | unmap_mapping_range(dax_dev->inode->i_mapping, 0, 0, 1); | 689 | unmap_mapping_range(dax_dev->inode->i_mapping, 0, 0, 1); |
692 | cdev_del(cdev); | ||
693 | } | 690 | } |
694 | 691 | ||
695 | static void unregister_dax_dev(void *dev) | 692 | static void unregister_dax_dev(void *dev) |
@@ -699,7 +696,8 @@ static void unregister_dax_dev(void *dev) | |||
699 | dev_dbg(dev, "%s\n", __func__); | 696 | dev_dbg(dev, "%s\n", __func__); |
700 | 697 | ||
701 | kill_dax_dev(dax_dev); | 698 | kill_dax_dev(dax_dev); |
702 | device_unregister(dev); | 699 | cdev_device_del(&dax_dev->cdev, dev); |
700 | put_device(dev); | ||
703 | } | 701 | } |
704 | 702 | ||
705 | struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, | 703 | struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, |
@@ -750,18 +748,13 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, | |||
750 | goto err_inode; | 748 | goto err_inode; |
751 | } | 749 | } |
752 | 750 | ||
753 | /* device_initialize() so cdev can reference kobj parent */ | 751 | /* from here on we're committed to teardown via dax_dev_release() */ |
754 | device_initialize(dev); | 752 | device_initialize(dev); |
755 | 753 | ||
756 | cdev = &dax_dev->cdev; | 754 | cdev = &dax_dev->cdev; |
757 | cdev_init(cdev, &dax_fops); | 755 | cdev_init(cdev, &dax_fops); |
758 | cdev->owner = parent->driver->owner; | 756 | cdev->owner = parent->driver->owner; |
759 | cdev->kobj.parent = &dev->kobj; | ||
760 | rc = cdev_add(&dax_dev->cdev, dev_t, 1); | ||
761 | if (rc) | ||
762 | goto err_cdev; | ||
763 | 757 | ||
764 | /* from here on we're committed to teardown via dax_dev_release() */ | ||
765 | dax_dev->num_resources = count; | 758 | dax_dev->num_resources = count; |
766 | dax_dev->alive = true; | 759 | dax_dev->alive = true; |
767 | dax_dev->region = dax_region; | 760 | dax_dev->region = dax_region; |
@@ -773,7 +766,8 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, | |||
773 | dev->groups = dax_attribute_groups; | 766 | dev->groups = dax_attribute_groups; |
774 | dev->release = dax_dev_release; | 767 | dev->release = dax_dev_release; |
775 | dev_set_name(dev, "dax%d.%d", dax_region->id, dax_dev->id); | 768 | dev_set_name(dev, "dax%d.%d", dax_region->id, dax_dev->id); |
776 | rc = device_add(dev); | 769 | |
770 | rc = cdev_device_add(cdev, dev); | ||
777 | if (rc) { | 771 | if (rc) { |
778 | kill_dax_dev(dax_dev); | 772 | kill_dax_dev(dax_dev); |
779 | put_device(dev); | 773 | put_device(dev); |
@@ -786,8 +780,6 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, | |||
786 | 780 | ||
787 | return dax_dev; | 781 | return dax_dev; |
788 | 782 | ||
789 | err_cdev: | ||
790 | iput(dax_dev->inode); | ||
791 | err_inode: | 783 | err_inode: |
792 | ida_simple_remove(&dax_minor_ida, minor); | 784 | ida_simple_remove(&dax_minor_ida, minor); |
793 | err_minor: | 785 | err_minor: |