Skip to content

Commit 0020839

Browse files
davejiangweiny2
authored andcommitted
nvdimm: Introduce guard() for nvdimm_bus_lock
Converting nvdimm_bus_lock/unlock to guard() to clean up usage of gotos for error handling and avoid future mistakes of missed unlock on error paths. Link: https://lore.kernel.org/linux-cxl/20250917163623.00004a3c@huawei.com/ Suggested-by: Jonathan Cameron <jonathan.cameron@huawei.com> Signed-off-by: Dave Jiang <dave.jiang@intel.com> Acked-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Ira Weiny <ira.weiny@intel.com>
1 parent d1a599a commit 0020839

File tree

14 files changed

+192
-249
lines changed

14 files changed

+192
-249
lines changed

drivers/nvdimm/badrange.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,7 @@ void nvdimm_badblocks_populate(struct nd_region *nd_region,
278278
}
279279
nvdimm_bus = walk_to_nvdimm_bus(&nd_region->dev);
280280

281-
nvdimm_bus_lock(&nvdimm_bus->dev);
281+
guard(nvdimm_bus)(&nvdimm_bus->dev);
282282
badblocks_populate(&nvdimm_bus->badrange, bb, range);
283-
nvdimm_bus_unlock(&nvdimm_bus->dev);
284283
}
285284
EXPORT_SYMBOL_GPL(nvdimm_badblocks_populate);

drivers/nvdimm/btt_devs.c

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,12 @@ static ssize_t sector_size_store(struct device *dev,
5050
struct nd_btt *nd_btt = to_nd_btt(dev);
5151
ssize_t rc;
5252

53-
device_lock(dev);
54-
nvdimm_bus_lock(dev);
53+
guard(device)(dev);
54+
guard(nvdimm_bus)(dev);
5555
rc = nd_size_select_store(dev, buf, &nd_btt->lbasize,
5656
btt_lbasize_supported);
5757
dev_dbg(dev, "result: %zd wrote: %s%s", rc, buf,
5858
buf[len - 1] == '\n' ? "" : "\n");
59-
nvdimm_bus_unlock(dev);
60-
device_unlock(dev);
6159

6260
return rc ? rc : len;
6361
}
@@ -93,13 +91,10 @@ static ssize_t namespace_show(struct device *dev,
9391
struct device_attribute *attr, char *buf)
9492
{
9593
struct nd_btt *nd_btt = to_nd_btt(dev);
96-
ssize_t rc;
9794

98-
nvdimm_bus_lock(dev);
99-
rc = sprintf(buf, "%s\n", nd_btt->ndns
95+
guard(nvdimm_bus)(dev);
96+
return sprintf(buf, "%s\n", nd_btt->ndns
10097
? dev_name(&nd_btt->ndns->dev) : "");
101-
nvdimm_bus_unlock(dev);
102-
return rc;
10398
}
10499

105100
static ssize_t namespace_store(struct device *dev,
@@ -108,13 +103,11 @@ static ssize_t namespace_store(struct device *dev,
108103
struct nd_btt *nd_btt = to_nd_btt(dev);
109104
ssize_t rc;
110105

111-
device_lock(dev);
112-
nvdimm_bus_lock(dev);
106+
guard(device)(dev);
107+
guard(nvdimm_bus)(dev);
113108
rc = nd_namespace_store(dev, &nd_btt->ndns, buf, len);
114109
dev_dbg(dev, "result: %zd wrote: %s%s", rc, buf,
115110
buf[len - 1] == '\n' ? "" : "\n");
116-
nvdimm_bus_unlock(dev);
117-
device_unlock(dev);
118111

119112
return rc;
120113
}
@@ -351,9 +344,8 @@ int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns)
351344
return -ENODEV;
352345
}
353346

354-
nvdimm_bus_lock(&ndns->dev);
355-
btt_dev = __nd_btt_create(nd_region, 0, NULL, ndns);
356-
nvdimm_bus_unlock(&ndns->dev);
347+
scoped_guard(nvdimm_bus, &ndns->dev)
348+
btt_dev = __nd_btt_create(nd_region, 0, NULL, ndns);
357349
if (!btt_dev)
358350
return -ENOMEM;
359351
btt_sb = devm_kzalloc(dev, sizeof(*btt_sb), GFP_KERNEL);

drivers/nvdimm/bus.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,15 @@ static struct module *to_bus_provider(struct device *dev)
6464

6565
static void nvdimm_bus_probe_start(struct nvdimm_bus *nvdimm_bus)
6666
{
67-
nvdimm_bus_lock(&nvdimm_bus->dev);
67+
guard(nvdimm_bus)(&nvdimm_bus->dev);
6868
nvdimm_bus->probe_active++;
69-
nvdimm_bus_unlock(&nvdimm_bus->dev);
7069
}
7170

7271
static void nvdimm_bus_probe_end(struct nvdimm_bus *nvdimm_bus)
7372
{
74-
nvdimm_bus_lock(&nvdimm_bus->dev);
73+
guard(nvdimm_bus)(&nvdimm_bus->dev);
7574
if (--nvdimm_bus->probe_active == 0)
7675
wake_up(&nvdimm_bus->wait);
77-
nvdimm_bus_unlock(&nvdimm_bus->dev);
7876
}
7977

8078
static int nvdimm_bus_probe(struct device *dev)

drivers/nvdimm/claim.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,10 @@ void nd_detach_ndns(struct device *dev,
3434

3535
if (!ndns)
3636
return;
37-
get_device(&ndns->dev);
38-
nvdimm_bus_lock(&ndns->dev);
37+
38+
struct device *ndev __free(put_device) = get_device(&ndns->dev);
39+
guard(nvdimm_bus)(ndev);
3940
__nd_detach_ndns(dev, _ndns);
40-
nvdimm_bus_unlock(&ndns->dev);
41-
put_device(&ndns->dev);
4241
}
4342

4443
bool __nd_attach_ndns(struct device *dev, struct nd_namespace_common *attach,

drivers/nvdimm/core.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,8 @@ static void nvdimm_map_put(void *data)
141141
struct nvdimm_map *nvdimm_map = data;
142142
struct nvdimm_bus *nvdimm_bus = nvdimm_map->nvdimm_bus;
143143

144-
nvdimm_bus_lock(&nvdimm_bus->dev);
144+
guard(nvdimm_bus)(&nvdimm_bus->dev);
145145
kref_put(&nvdimm_map->kref, nvdimm_map_release);
146-
nvdimm_bus_unlock(&nvdimm_bus->dev);
147146
}
148147

149148
/**
@@ -158,13 +157,13 @@ void *devm_nvdimm_memremap(struct device *dev, resource_size_t offset,
158157
{
159158
struct nvdimm_map *nvdimm_map;
160159

161-
nvdimm_bus_lock(dev);
162-
nvdimm_map = find_nvdimm_map(dev, offset);
163-
if (!nvdimm_map)
164-
nvdimm_map = alloc_nvdimm_map(dev, offset, size, flags);
165-
else
166-
kref_get(&nvdimm_map->kref);
167-
nvdimm_bus_unlock(dev);
160+
scoped_guard(nvdimm_bus, dev) {
161+
nvdimm_map = find_nvdimm_map(dev, offset);
162+
if (!nvdimm_map)
163+
nvdimm_map = alloc_nvdimm_map(dev, offset, size, flags);
164+
else
165+
kref_get(&nvdimm_map->kref);
166+
}
168167

169168
if (!nvdimm_map)
170169
return NULL;

drivers/nvdimm/dax_devs.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,12 @@ int nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns)
104104
return -ENODEV;
105105
}
106106

107-
nvdimm_bus_lock(&ndns->dev);
108-
nd_dax = nd_dax_alloc(nd_region);
109-
dax_dev = nd_dax_devinit(nd_dax, ndns);
110-
nvdimm_bus_unlock(&ndns->dev);
111-
if (!dax_dev)
112-
return -ENOMEM;
107+
scoped_guard(nvdimm_bus, &ndns->dev) {
108+
nd_dax = nd_dax_alloc(nd_region);
109+
dax_dev = nd_dax_devinit(nd_dax, ndns);
110+
if (!dax_dev)
111+
return -ENOMEM;
112+
}
113113
pfn_sb = devm_kmalloc(dev, sizeof(*pfn_sb), GFP_KERNEL);
114114
nd_pfn = &nd_dax->nd_pfn;
115115
nd_pfn->pfn_sb = pfn_sb;

drivers/nvdimm/dimm.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,8 @@ static void nvdimm_remove(struct device *dev)
117117
{
118118
struct nvdimm_drvdata *ndd = dev_get_drvdata(dev);
119119

120-
nvdimm_bus_lock(dev);
121-
dev_set_drvdata(dev, NULL);
122-
nvdimm_bus_unlock(dev);
120+
scoped_guard(nvdimm_bus, dev)
121+
dev_set_drvdata(dev, NULL);
123122
put_ndd(ndd);
124123
}
125124

drivers/nvdimm/dimm_devs.c

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,10 @@ void nvdimm_drvdata_release(struct kref *kref)
226226
struct resource *res, *_r;
227227

228228
dev_dbg(dev, "trace\n");
229-
nvdimm_bus_lock(dev);
230-
for_each_dpa_resource_safe(ndd, res, _r)
231-
nvdimm_free_dpa(ndd, res);
232-
nvdimm_bus_unlock(dev);
229+
scoped_guard(nvdimm_bus, dev) {
230+
for_each_dpa_resource_safe(ndd, res, _r)
231+
nvdimm_free_dpa(ndd, res);
232+
}
233233

234234
kvfree(ndd->data);
235235
kfree(ndd);
@@ -319,23 +319,20 @@ static DEVICE_ATTR_RO(state);
319319
static ssize_t __available_slots_show(struct nvdimm_drvdata *ndd, char *buf)
320320
{
321321
struct device *dev;
322-
ssize_t rc;
323322
u32 nfree;
324323

325324
if (!ndd)
326325
return -ENXIO;
327326

328327
dev = ndd->dev;
329-
nvdimm_bus_lock(dev);
328+
guard(nvdimm_bus)(dev);
330329
nfree = nd_label_nfree(ndd);
331330
if (nfree - 1 > nfree) {
332331
dev_WARN_ONCE(dev, 1, "we ate our last label?\n");
333332
nfree = 0;
334333
} else
335334
nfree--;
336-
rc = sprintf(buf, "%d\n", nfree);
337-
nvdimm_bus_unlock(dev);
338-
return rc;
335+
return sprintf(buf, "%d\n", nfree);
339336
}
340337

341338
static ssize_t available_slots_show(struct device *dev,
@@ -388,21 +385,15 @@ static ssize_t security_store(struct device *dev,
388385
struct device_attribute *attr, const char *buf, size_t len)
389386

390387
{
391-
ssize_t rc;
392-
393388
/*
394389
* Require all userspace triggered security management to be
395390
* done while probing is idle and the DIMM is not in active use
396391
* in any region.
397392
*/
398-
device_lock(dev);
399-
nvdimm_bus_lock(dev);
393+
guard(device)(dev);
394+
guard(nvdimm_bus)(dev);
400395
wait_nvdimm_bus_probe_idle(dev);
401-
rc = nvdimm_security_store(dev, buf, len);
402-
nvdimm_bus_unlock(dev);
403-
device_unlock(dev);
404-
405-
return rc;
396+
return nvdimm_security_store(dev, buf, len);
406397
}
407398
static DEVICE_ATTR_RW(security);
408399

@@ -454,9 +445,8 @@ static ssize_t result_show(struct device *dev, struct device_attribute *attr, ch
454445
if (!nvdimm->fw_ops)
455446
return -EOPNOTSUPP;
456447

457-
nvdimm_bus_lock(dev);
448+
guard(nvdimm_bus)(dev);
458449
result = nvdimm->fw_ops->activate_result(nvdimm);
459-
nvdimm_bus_unlock(dev);
460450

461451
switch (result) {
462452
case NVDIMM_FWA_RESULT_NONE:
@@ -483,9 +473,8 @@ static ssize_t activate_show(struct device *dev, struct device_attribute *attr,
483473
if (!nvdimm->fw_ops)
484474
return -EOPNOTSUPP;
485475

486-
nvdimm_bus_lock(dev);
476+
guard(nvdimm_bus)(dev);
487477
state = nvdimm->fw_ops->activate_state(nvdimm);
488-
nvdimm_bus_unlock(dev);
489478

490479
switch (state) {
491480
case NVDIMM_FWA_IDLE:
@@ -516,9 +505,8 @@ static ssize_t activate_store(struct device *dev, struct device_attribute *attr,
516505
else
517506
return -EINVAL;
518507

519-
nvdimm_bus_lock(dev);
508+
guard(nvdimm_bus)(dev);
520509
rc = nvdimm->fw_ops->arm(nvdimm, arg);
521-
nvdimm_bus_unlock(dev);
522510

523511
if (rc < 0)
524512
return rc;
@@ -545,9 +533,8 @@ static umode_t nvdimm_firmware_visible(struct kobject *kobj, struct attribute *a
545533
if (!nvdimm->fw_ops)
546534
return 0;
547535

548-
nvdimm_bus_lock(dev);
536+
guard(nvdimm_bus)(dev);
549537
cap = nd_desc->fw_ops->capability(nd_desc);
550-
nvdimm_bus_unlock(dev);
551538

552539
if (cap < NVDIMM_FWA_CAP_QUIESCE)
553540
return 0;
@@ -641,11 +628,10 @@ void nvdimm_delete(struct nvdimm *nvdimm)
641628
bool dev_put = false;
642629

643630
/* We are shutting down. Make state frozen artificially. */
644-
nvdimm_bus_lock(dev);
645-
set_bit(NVDIMM_SECURITY_FROZEN, &nvdimm->sec.flags);
646-
if (test_and_clear_bit(NDD_WORK_PENDING, &nvdimm->flags))
647-
dev_put = true;
648-
nvdimm_bus_unlock(dev);
631+
scoped_guard(nvdimm_bus, dev) {
632+
set_bit(NVDIMM_SECURITY_FROZEN, &nvdimm->sec.flags);
633+
dev_put = test_and_clear_bit(NDD_WORK_PENDING, &nvdimm->flags);
634+
}
649635
cancel_delayed_work_sync(&nvdimm->dwork);
650636
if (dev_put)
651637
put_device(dev);

0 commit comments

Comments
 (0)