diff options
-rw-r--r-- | drivers/dax/dax.c | 16 | ||||
-rw-r--r-- | drivers/dax/dax.h | 5 | ||||
-rw-r--r-- | drivers/dax/pmem.c | 5 |
3 files changed, 16 insertions, 10 deletions
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c index 03bb54f7f58f..e7d8a3902437 100644 --- a/drivers/dax/dax.c +++ b/drivers/dax/dax.c | |||
@@ -558,8 +558,8 @@ static void unregister_dax_dev(void *dev) | |||
558 | device_unregister(dev); | 558 | device_unregister(dev); |
559 | } | 559 | } |
560 | 560 | ||
561 | int devm_create_dax_dev(struct dax_region *dax_region, struct resource *res, | 561 | struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, |
562 | int count) | 562 | struct resource *res, int count) |
563 | { | 563 | { |
564 | struct device *parent = dax_region->dev; | 564 | struct device *parent = dax_region->dev; |
565 | struct dax_dev *dax_dev; | 565 | struct dax_dev *dax_dev; |
@@ -570,7 +570,7 @@ int devm_create_dax_dev(struct dax_region *dax_region, struct resource *res, | |||
570 | 570 | ||
571 | dax_dev = kzalloc(sizeof(*dax_dev) + sizeof(*res) * count, GFP_KERNEL); | 571 | dax_dev = kzalloc(sizeof(*dax_dev) + sizeof(*res) * count, GFP_KERNEL); |
572 | if (!dax_dev) | 572 | if (!dax_dev) |
573 | return -ENOMEM; | 573 | return ERR_PTR(-ENOMEM); |
574 | 574 | ||
575 | for (i = 0; i < count; i++) { | 575 | for (i = 0; i < count; i++) { |
576 | if (!IS_ALIGNED(res[i].start, dax_region->align) | 576 | if (!IS_ALIGNED(res[i].start, dax_region->align) |
@@ -632,10 +632,14 @@ int devm_create_dax_dev(struct dax_region *dax_region, struct resource *res, | |||
632 | rc = device_add(dev); | 632 | rc = device_add(dev); |
633 | if (rc) { | 633 | if (rc) { |
634 | put_device(dev); | 634 | put_device(dev); |
635 | return rc; | 635 | return ERR_PTR(rc); |
636 | } | 636 | } |
637 | 637 | ||
638 | return devm_add_action_or_reset(dax_region->dev, unregister_dax_dev, dev); | 638 | rc = devm_add_action_or_reset(dax_region->dev, unregister_dax_dev, dev); |
639 | if (rc) | ||
640 | return ERR_PTR(rc); | ||
641 | |||
642 | return dax_dev; | ||
639 | 643 | ||
640 | err_cdev: | 644 | err_cdev: |
641 | iput(dax_dev->inode); | 645 | iput(dax_dev->inode); |
@@ -646,7 +650,7 @@ int devm_create_dax_dev(struct dax_region *dax_region, struct resource *res, | |||
646 | err_id: | 650 | err_id: |
647 | kfree(dax_dev); | 651 | kfree(dax_dev); |
648 | 652 | ||
649 | return rc; | 653 | return ERR_PTR(rc); |
650 | } | 654 | } |
651 | EXPORT_SYMBOL_GPL(devm_create_dax_dev); | 655 | EXPORT_SYMBOL_GPL(devm_create_dax_dev); |
652 | 656 | ||
diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h index d8b8f1f25054..ddd829ab58c0 100644 --- a/drivers/dax/dax.h +++ b/drivers/dax/dax.h | |||
@@ -13,12 +13,13 @@ | |||
13 | #ifndef __DAX_H__ | 13 | #ifndef __DAX_H__ |
14 | #define __DAX_H__ | 14 | #define __DAX_H__ |
15 | struct device; | 15 | struct device; |
16 | struct dax_dev; | ||
16 | struct resource; | 17 | struct resource; |
17 | struct dax_region; | 18 | struct dax_region; |
18 | void dax_region_put(struct dax_region *dax_region); | 19 | void dax_region_put(struct dax_region *dax_region); |
19 | struct dax_region *alloc_dax_region(struct device *parent, | 20 | struct dax_region *alloc_dax_region(struct device *parent, |
20 | int region_id, struct resource *res, unsigned int align, | 21 | int region_id, struct resource *res, unsigned int align, |
21 | void *addr, unsigned long flags); | 22 | void *addr, unsigned long flags); |
22 | int devm_create_dax_dev(struct dax_region *dax_region, struct resource *res, | 23 | struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, |
23 | int count); | 24 | struct resource *res, int count); |
24 | #endif /* __DAX_H__ */ | 25 | #endif /* __DAX_H__ */ |
diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c index 59b75c5972bb..c24d32ec9ce6 100644 --- a/drivers/dax/pmem.c +++ b/drivers/dax/pmem.c | |||
@@ -61,6 +61,7 @@ static int dax_pmem_probe(struct device *dev) | |||
61 | int rc; | 61 | int rc; |
62 | void *addr; | 62 | void *addr; |
63 | struct resource res; | 63 | struct resource res; |
64 | struct dax_dev *dax_dev; | ||
64 | struct nd_pfn_sb *pfn_sb; | 65 | struct nd_pfn_sb *pfn_sb; |
65 | struct dax_pmem *dax_pmem; | 66 | struct dax_pmem *dax_pmem; |
66 | struct nd_region *nd_region; | 67 | struct nd_region *nd_region; |
@@ -123,12 +124,12 @@ static int dax_pmem_probe(struct device *dev) | |||
123 | return -ENOMEM; | 124 | return -ENOMEM; |
124 | 125 | ||
125 | /* TODO: support for subdividing a dax region... */ | 126 | /* TODO: support for subdividing a dax region... */ |
126 | rc = devm_create_dax_dev(dax_region, &res, 1); | 127 | dax_dev = devm_create_dax_dev(dax_region, &res, 1); |
127 | 128 | ||
128 | /* child dax_dev instances now own the lifetime of the dax_region */ | 129 | /* child dax_dev instances now own the lifetime of the dax_region */ |
129 | dax_region_put(dax_region); | 130 | dax_region_put(dax_region); |
130 | 131 | ||
131 | return rc; | 132 | return PTR_ERR_OR_ZERO(dax_dev); |
132 | } | 133 | } |
133 | 134 | ||
134 | static struct nd_device_driver dax_pmem_driver = { | 135 | static struct nd_device_driver dax_pmem_driver = { |