diff options
author | Dan Williams <dan.j.williams@intel.com> | 2016-03-17 21:23:09 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2016-04-22 13:59:54 -0400 |
commit | e32bc729a3a486e20443db3379ecf67240b20616 (patch) | |
tree | 1d4e0b6dd686eb88766581cce79b59ab04266284 | |
parent | bd032943b5b2b336994171dcebc11531a38b45ba (diff) |
libnvdimm, btt, convert nd_btt_probe() to devm
Pass the device performing the probe so we can use a devm allocation for
the btt superblock.
Cc: Vishal Verma <vishal.l.verma@intel.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | drivers/nvdimm/blk.c | 2 | ||||
-rw-r--r-- | drivers/nvdimm/btt.c | 17 | ||||
-rw-r--r-- | drivers/nvdimm/btt_devs.c | 26 | ||||
-rw-r--r-- | drivers/nvdimm/nd.h | 6 | ||||
-rw-r--r-- | drivers/nvdimm/pmem.c | 2 |
5 files changed, 25 insertions, 28 deletions
diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c index 24649396b638..c8215dc356cc 100644 --- a/drivers/nvdimm/blk.c +++ b/drivers/nvdimm/blk.c | |||
@@ -314,7 +314,7 @@ static int nd_blk_probe(struct device *dev) | |||
314 | ndns->rw_bytes = nd_blk_rw_bytes; | 314 | ndns->rw_bytes = nd_blk_rw_bytes; |
315 | if (is_nd_btt(dev)) | 315 | if (is_nd_btt(dev)) |
316 | rc = nvdimm_namespace_attach_btt(ndns); | 316 | rc = nvdimm_namespace_attach_btt(ndns); |
317 | else if (nd_btt_probe(ndns, blk_dev) == 0) { | 317 | else if (nd_btt_probe(dev, ndns, blk_dev) == 0) { |
318 | /* we'll come back as btt-blk */ | 318 | /* we'll come back as btt-blk */ |
319 | rc = -ENXIO; | 319 | rc = -ENXIO; |
320 | } else | 320 | } else |
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c index 676c31a8fb6d..cc9fafed9362 100644 --- a/drivers/nvdimm/btt.c +++ b/drivers/nvdimm/btt.c | |||
@@ -1306,7 +1306,7 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize, | |||
1306 | struct btt *btt; | 1306 | struct btt *btt; |
1307 | struct device *dev = &nd_btt->dev; | 1307 | struct device *dev = &nd_btt->dev; |
1308 | 1308 | ||
1309 | btt = kzalloc(sizeof(struct btt), GFP_KERNEL); | 1309 | btt = devm_kzalloc(dev, sizeof(struct btt), GFP_KERNEL); |
1310 | if (!btt) | 1310 | if (!btt) |
1311 | return NULL; | 1311 | return NULL; |
1312 | 1312 | ||
@@ -1321,13 +1321,13 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize, | |||
1321 | ret = discover_arenas(btt); | 1321 | ret = discover_arenas(btt); |
1322 | if (ret) { | 1322 | if (ret) { |
1323 | dev_err(dev, "init: error in arena_discover: %d\n", ret); | 1323 | dev_err(dev, "init: error in arena_discover: %d\n", ret); |
1324 | goto out_free; | 1324 | return NULL; |
1325 | } | 1325 | } |
1326 | 1326 | ||
1327 | if (btt->init_state != INIT_READY && nd_region->ro) { | 1327 | if (btt->init_state != INIT_READY && nd_region->ro) { |
1328 | dev_info(dev, "%s is read-only, unable to init btt metadata\n", | 1328 | dev_info(dev, "%s is read-only, unable to init btt metadata\n", |
1329 | dev_name(&nd_region->dev)); | 1329 | dev_name(&nd_region->dev)); |
1330 | goto out_free; | 1330 | return NULL; |
1331 | } else if (btt->init_state != INIT_READY) { | 1331 | } else if (btt->init_state != INIT_READY) { |
1332 | btt->num_arenas = (rawsize / ARENA_MAX_SIZE) + | 1332 | btt->num_arenas = (rawsize / ARENA_MAX_SIZE) + |
1333 | ((rawsize % ARENA_MAX_SIZE) ? 1 : 0); | 1333 | ((rawsize % ARENA_MAX_SIZE) ? 1 : 0); |
@@ -1337,29 +1337,25 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize, | |||
1337 | ret = create_arenas(btt); | 1337 | ret = create_arenas(btt); |
1338 | if (ret) { | 1338 | if (ret) { |
1339 | dev_info(dev, "init: create_arenas: %d\n", ret); | 1339 | dev_info(dev, "init: create_arenas: %d\n", ret); |
1340 | goto out_free; | 1340 | return NULL; |
1341 | } | 1341 | } |
1342 | 1342 | ||
1343 | ret = btt_meta_init(btt); | 1343 | ret = btt_meta_init(btt); |
1344 | if (ret) { | 1344 | if (ret) { |
1345 | dev_err(dev, "init: error in meta_init: %d\n", ret); | 1345 | dev_err(dev, "init: error in meta_init: %d\n", ret); |
1346 | goto out_free; | 1346 | return NULL; |
1347 | } | 1347 | } |
1348 | } | 1348 | } |
1349 | 1349 | ||
1350 | ret = btt_blk_init(btt); | 1350 | ret = btt_blk_init(btt); |
1351 | if (ret) { | 1351 | if (ret) { |
1352 | dev_err(dev, "init: error in blk_init: %d\n", ret); | 1352 | dev_err(dev, "init: error in blk_init: %d\n", ret); |
1353 | goto out_free; | 1353 | return NULL; |
1354 | } | 1354 | } |
1355 | 1355 | ||
1356 | btt_debugfs_init(btt); | 1356 | btt_debugfs_init(btt); |
1357 | 1357 | ||
1358 | return btt; | 1358 | return btt; |
1359 | |||
1360 | out_free: | ||
1361 | kfree(btt); | ||
1362 | return NULL; | ||
1363 | } | 1359 | } |
1364 | 1360 | ||
1365 | /** | 1361 | /** |
@@ -1377,7 +1373,6 @@ static void btt_fini(struct btt *btt) | |||
1377 | btt_blk_cleanup(btt); | 1373 | btt_blk_cleanup(btt); |
1378 | free_arenas(btt); | 1374 | free_arenas(btt); |
1379 | debugfs_remove_recursive(btt->debugfs_dir); | 1375 | debugfs_remove_recursive(btt->debugfs_dir); |
1380 | kfree(btt); | ||
1381 | } | 1376 | } |
1382 | } | 1377 | } |
1383 | 1378 | ||
diff --git a/drivers/nvdimm/btt_devs.c b/drivers/nvdimm/btt_devs.c index cb477518dd0e..1886171af80e 100644 --- a/drivers/nvdimm/btt_devs.c +++ b/drivers/nvdimm/btt_devs.c | |||
@@ -273,10 +273,11 @@ static int __nd_btt_probe(struct nd_btt *nd_btt, | |||
273 | return 0; | 273 | return 0; |
274 | } | 274 | } |
275 | 275 | ||
276 | int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata) | 276 | int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns, |
277 | void *drvdata) | ||
277 | { | 278 | { |
278 | int rc; | 279 | int rc; |
279 | struct device *dev; | 280 | struct device *btt_dev; |
280 | struct btt_sb *btt_sb; | 281 | struct btt_sb *btt_sb; |
281 | struct nd_region *nd_region = to_nd_region(ndns->dev.parent); | 282 | struct nd_region *nd_region = to_nd_region(ndns->dev.parent); |
282 | 283 | ||
@@ -284,21 +285,20 @@ int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata) | |||
284 | return -ENODEV; | 285 | return -ENODEV; |
285 | 286 | ||
286 | nvdimm_bus_lock(&ndns->dev); | 287 | nvdimm_bus_lock(&ndns->dev); |
287 | dev = __nd_btt_create(nd_region, 0, NULL, ndns); | 288 | btt_dev = __nd_btt_create(nd_region, 0, NULL, ndns); |
288 | nvdimm_bus_unlock(&ndns->dev); | 289 | nvdimm_bus_unlock(&ndns->dev); |
289 | if (!dev) | 290 | if (!btt_dev) |
290 | return -ENOMEM; | 291 | return -ENOMEM; |
291 | dev_set_drvdata(dev, drvdata); | 292 | dev_set_drvdata(btt_dev, drvdata); |
292 | btt_sb = kzalloc(sizeof(*btt_sb), GFP_KERNEL); | 293 | btt_sb = devm_kzalloc(dev, sizeof(*btt_sb), GFP_KERNEL); |
293 | rc = __nd_btt_probe(to_nd_btt(dev), ndns, btt_sb); | 294 | rc = __nd_btt_probe(to_nd_btt(btt_dev), ndns, btt_sb); |
294 | kfree(btt_sb); | 295 | dev_dbg(dev, "%s: btt: %s\n", __func__, |
295 | dev_dbg(&ndns->dev, "%s: btt: %s\n", __func__, | 296 | rc == 0 ? dev_name(btt_dev) : "<none>"); |
296 | rc == 0 ? dev_name(dev) : "<none>"); | ||
297 | if (rc < 0) { | 297 | if (rc < 0) { |
298 | struct nd_btt *nd_btt = to_nd_btt(dev); | 298 | struct nd_btt *nd_btt = to_nd_btt(btt_dev); |
299 | 299 | ||
300 | __nd_detach_ndns(dev, &nd_btt->ndns); | 300 | __nd_detach_ndns(btt_dev, &nd_btt->ndns); |
301 | put_device(dev); | 301 | put_device(btt_dev); |
302 | } | 302 | } |
303 | 303 | ||
304 | return rc; | 304 | return rc; |
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index c831caa3d60a..0fb14890ba26 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h | |||
@@ -197,11 +197,13 @@ struct nd_gen_sb { | |||
197 | 197 | ||
198 | u64 nd_sb_checksum(struct nd_gen_sb *sb); | 198 | u64 nd_sb_checksum(struct nd_gen_sb *sb); |
199 | #if IS_ENABLED(CONFIG_BTT) | 199 | #if IS_ENABLED(CONFIG_BTT) |
200 | int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata); | 200 | int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns, |
201 | void *drvdata); | ||
201 | bool is_nd_btt(struct device *dev); | 202 | bool is_nd_btt(struct device *dev); |
202 | struct device *nd_btt_create(struct nd_region *nd_region); | 203 | struct device *nd_btt_create(struct nd_region *nd_region); |
203 | #else | 204 | #else |
204 | static inline int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata) | 205 | static inline int nd_btt_probe(struct device *dev, |
206 | struct nd_namespace_common *ndns, void *drvdata) | ||
205 | { | 207 | { |
206 | return -ENODEV; | 208 | return -ENODEV; |
207 | } | 209 | } |
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 4d8f5c55aade..6fa39f55dbe3 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c | |||
@@ -574,7 +574,7 @@ static int nd_pmem_probe(struct device *dev) | |||
574 | if (is_nd_pfn(dev)) | 574 | if (is_nd_pfn(dev)) |
575 | return nvdimm_namespace_attach_pfn(ndns); | 575 | return nvdimm_namespace_attach_pfn(ndns); |
576 | 576 | ||
577 | if (nd_btt_probe(ndns, pmem) == 0 | 577 | if (nd_btt_probe(dev, ndns, pmem) == 0 |
578 | || nd_pfn_probe(dev, ndns, pmem) == 0) { | 578 | || nd_pfn_probe(dev, ndns, pmem) == 0) { |
579 | /* | 579 | /* |
580 | * We'll come back as either btt-pmem, or pfn-pmem, so | 580 | * We'll come back as either btt-pmem, or pfn-pmem, so |