aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2016-03-17 21:23:09 -0400
committerDan Williams <dan.j.williams@intel.com>2016-04-22 13:59:54 -0400
commite32bc729a3a486e20443db3379ecf67240b20616 (patch)
tree1d4e0b6dd686eb88766581cce79b59ab04266284
parentbd032943b5b2b336994171dcebc11531a38b45ba (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.c2
-rw-r--r--drivers/nvdimm/btt.c17
-rw-r--r--drivers/nvdimm/btt_devs.c26
-rw-r--r--drivers/nvdimm/nd.h6
-rw-r--r--drivers/nvdimm/pmem.c2
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
276int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata) 276int 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
198u64 nd_sb_checksum(struct nd_gen_sb *sb); 198u64 nd_sb_checksum(struct nd_gen_sb *sb);
199#if IS_ENABLED(CONFIG_BTT) 199#if IS_ENABLED(CONFIG_BTT)
200int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata); 200int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns,
201 void *drvdata);
201bool is_nd_btt(struct device *dev); 202bool is_nd_btt(struct device *dev);
202struct device *nd_btt_create(struct nd_region *nd_region); 203struct device *nd_btt_create(struct nd_region *nd_region);
203#else 204#else
204static inline int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata) 205static 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