aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dax/dax.c18
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
678static void kill_dax_dev(struct dax_dev *dax_dev) 678static 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
695static void unregister_dax_dev(void *dev) 692static 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
705struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, 703struct 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: