diff options
| -rw-r--r-- | drivers/acpi/nfit/core.c | 28 | ||||
| -rw-r--r-- | drivers/acpi/nfit/nfit.h | 24 | ||||
| -rw-r--r-- | drivers/base/core.c | 30 | ||||
| -rw-r--r-- | drivers/nvdimm/btt_devs.c | 16 | ||||
| -rw-r--r-- | drivers/nvdimm/bus.c | 210 | ||||
| -rw-r--r-- | drivers/nvdimm/core.c | 10 | ||||
| -rw-r--r-- | drivers/nvdimm/dimm_devs.c | 4 | ||||
| -rw-r--r-- | drivers/nvdimm/namespace_devs.c | 36 | ||||
| -rw-r--r-- | drivers/nvdimm/nd-core.h | 71 | ||||
| -rw-r--r-- | drivers/nvdimm/pfn_devs.c | 24 | ||||
| -rw-r--r-- | drivers/nvdimm/pmem.c | 4 | ||||
| -rw-r--r-- | drivers/nvdimm/region.c | 24 | ||||
| -rw-r--r-- | drivers/nvdimm/region_devs.c | 12 | ||||
| -rw-r--r-- | include/linux/device.h | 6 |
14 files changed, 343 insertions, 156 deletions
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index c02fa27dd3f3..1413324982f0 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c | |||
| @@ -1282,7 +1282,7 @@ static ssize_t hw_error_scrub_store(struct device *dev, | |||
| 1282 | if (rc) | 1282 | if (rc) |
| 1283 | return rc; | 1283 | return rc; |
| 1284 | 1284 | ||
| 1285 | device_lock(dev); | 1285 | nfit_device_lock(dev); |
| 1286 | nd_desc = dev_get_drvdata(dev); | 1286 | nd_desc = dev_get_drvdata(dev); |
| 1287 | if (nd_desc) { | 1287 | if (nd_desc) { |
| 1288 | struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); | 1288 | struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); |
| @@ -1299,7 +1299,7 @@ static ssize_t hw_error_scrub_store(struct device *dev, | |||
| 1299 | break; | 1299 | break; |
| 1300 | } | 1300 | } |
| 1301 | } | 1301 | } |
| 1302 | device_unlock(dev); | 1302 | nfit_device_unlock(dev); |
| 1303 | if (rc) | 1303 | if (rc) |
| 1304 | return rc; | 1304 | return rc; |
| 1305 | return size; | 1305 | return size; |
| @@ -1319,7 +1319,7 @@ static ssize_t scrub_show(struct device *dev, | |||
| 1319 | ssize_t rc = -ENXIO; | 1319 | ssize_t rc = -ENXIO; |
| 1320 | bool busy; | 1320 | bool busy; |
| 1321 | 1321 | ||
| 1322 | device_lock(dev); | 1322 | nfit_device_lock(dev); |
| 1323 | nd_desc = dev_get_drvdata(dev); | 1323 | nd_desc = dev_get_drvdata(dev); |
| 1324 | if (!nd_desc) { | 1324 | if (!nd_desc) { |
| 1325 | device_unlock(dev); | 1325 | device_unlock(dev); |
| @@ -1339,7 +1339,7 @@ static ssize_t scrub_show(struct device *dev, | |||
| 1339 | } | 1339 | } |
| 1340 | 1340 | ||
| 1341 | mutex_unlock(&acpi_desc->init_mutex); | 1341 | mutex_unlock(&acpi_desc->init_mutex); |
| 1342 | device_unlock(dev); | 1342 | nfit_device_unlock(dev); |
| 1343 | return rc; | 1343 | return rc; |
| 1344 | } | 1344 | } |
| 1345 | 1345 | ||
| @@ -1356,14 +1356,14 @@ static ssize_t scrub_store(struct device *dev, | |||
| 1356 | if (val != 1) | 1356 | if (val != 1) |
| 1357 | return -EINVAL; | 1357 | return -EINVAL; |
| 1358 | 1358 | ||
| 1359 | device_lock(dev); | 1359 | nfit_device_lock(dev); |
| 1360 | nd_desc = dev_get_drvdata(dev); | 1360 | nd_desc = dev_get_drvdata(dev); |
| 1361 | if (nd_desc) { | 1361 | if (nd_desc) { |
| 1362 | struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); | 1362 | struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); |
| 1363 | 1363 | ||
| 1364 | rc = acpi_nfit_ars_rescan(acpi_desc, ARS_REQ_LONG); | 1364 | rc = acpi_nfit_ars_rescan(acpi_desc, ARS_REQ_LONG); |
| 1365 | } | 1365 | } |
| 1366 | device_unlock(dev); | 1366 | nfit_device_unlock(dev); |
| 1367 | if (rc) | 1367 | if (rc) |
| 1368 | return rc; | 1368 | return rc; |
| 1369 | return size; | 1369 | return size; |
| @@ -1749,9 +1749,9 @@ static void acpi_nvdimm_notify(acpi_handle handle, u32 event, void *data) | |||
| 1749 | struct acpi_device *adev = data; | 1749 | struct acpi_device *adev = data; |
| 1750 | struct device *dev = &adev->dev; | 1750 | struct device *dev = &adev->dev; |
| 1751 | 1751 | ||
| 1752 | device_lock(dev->parent); | 1752 | nfit_device_lock(dev->parent); |
| 1753 | __acpi_nvdimm_notify(dev, event); | 1753 | __acpi_nvdimm_notify(dev, event); |
| 1754 | device_unlock(dev->parent); | 1754 | nfit_device_unlock(dev->parent); |
| 1755 | } | 1755 | } |
| 1756 | 1756 | ||
| 1757 | static bool acpi_nvdimm_has_method(struct acpi_device *adev, char *method) | 1757 | static bool acpi_nvdimm_has_method(struct acpi_device *adev, char *method) |
| @@ -3457,8 +3457,8 @@ static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc) | |||
| 3457 | struct device *dev = acpi_desc->dev; | 3457 | struct device *dev = acpi_desc->dev; |
| 3458 | 3458 | ||
| 3459 | /* Bounce the device lock to flush acpi_nfit_add / acpi_nfit_notify */ | 3459 | /* Bounce the device lock to flush acpi_nfit_add / acpi_nfit_notify */ |
| 3460 | device_lock(dev); | 3460 | nfit_device_lock(dev); |
| 3461 | device_unlock(dev); | 3461 | nfit_device_unlock(dev); |
| 3462 | 3462 | ||
| 3463 | /* Bounce the init_mutex to complete initial registration */ | 3463 | /* Bounce the init_mutex to complete initial registration */ |
| 3464 | mutex_lock(&acpi_desc->init_mutex); | 3464 | mutex_lock(&acpi_desc->init_mutex); |
| @@ -3602,8 +3602,8 @@ void acpi_nfit_shutdown(void *data) | |||
| 3602 | * acpi_nfit_ars_rescan() submissions have had a chance to | 3602 | * acpi_nfit_ars_rescan() submissions have had a chance to |
| 3603 | * either submit or see ->cancel set. | 3603 | * either submit or see ->cancel set. |
| 3604 | */ | 3604 | */ |
| 3605 | device_lock(bus_dev); | 3605 | nfit_device_lock(bus_dev); |
| 3606 | device_unlock(bus_dev); | 3606 | nfit_device_unlock(bus_dev); |
| 3607 | 3607 | ||
| 3608 | flush_workqueue(nfit_wq); | 3608 | flush_workqueue(nfit_wq); |
| 3609 | } | 3609 | } |
| @@ -3746,9 +3746,9 @@ EXPORT_SYMBOL_GPL(__acpi_nfit_notify); | |||
| 3746 | 3746 | ||
| 3747 | static void acpi_nfit_notify(struct acpi_device *adev, u32 event) | 3747 | static void acpi_nfit_notify(struct acpi_device *adev, u32 event) |
| 3748 | { | 3748 | { |
| 3749 | device_lock(&adev->dev); | 3749 | nfit_device_lock(&adev->dev); |
| 3750 | __acpi_nfit_notify(&adev->dev, adev->handle, event); | 3750 | __acpi_nfit_notify(&adev->dev, adev->handle, event); |
| 3751 | device_unlock(&adev->dev); | 3751 | nfit_device_unlock(&adev->dev); |
| 3752 | } | 3752 | } |
| 3753 | 3753 | ||
| 3754 | static const struct acpi_device_id acpi_nfit_ids[] = { | 3754 | static const struct acpi_device_id acpi_nfit_ids[] = { |
diff --git a/drivers/acpi/nfit/nfit.h b/drivers/acpi/nfit/nfit.h index 6ee2b02af73e..24241941181c 100644 --- a/drivers/acpi/nfit/nfit.h +++ b/drivers/acpi/nfit/nfit.h | |||
| @@ -312,6 +312,30 @@ static inline struct acpi_nfit_desc *to_acpi_desc( | |||
| 312 | return container_of(nd_desc, struct acpi_nfit_desc, nd_desc); | 312 | return container_of(nd_desc, struct acpi_nfit_desc, nd_desc); |
| 313 | } | 313 | } |
| 314 | 314 | ||
| 315 | #ifdef CONFIG_PROVE_LOCKING | ||
| 316 | static inline void nfit_device_lock(struct device *dev) | ||
| 317 | { | ||
| 318 | device_lock(dev); | ||
| 319 | mutex_lock(&dev->lockdep_mutex); | ||
| 320 | } | ||
| 321 | |||
| 322 | static inline void nfit_device_unlock(struct device *dev) | ||
| 323 | { | ||
| 324 | mutex_unlock(&dev->lockdep_mutex); | ||
| 325 | device_unlock(dev); | ||
| 326 | } | ||
| 327 | #else | ||
| 328 | static inline void nfit_device_lock(struct device *dev) | ||
| 329 | { | ||
| 330 | device_lock(dev); | ||
| 331 | } | ||
| 332 | |||
| 333 | static inline void nfit_device_unlock(struct device *dev) | ||
| 334 | { | ||
| 335 | device_unlock(dev); | ||
| 336 | } | ||
| 337 | #endif | ||
| 338 | |||
| 315 | const guid_t *to_nfit_uuid(enum nfit_uuids id); | 339 | const guid_t *to_nfit_uuid(enum nfit_uuids id); |
| 316 | int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *nfit, acpi_size sz); | 340 | int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *nfit, acpi_size sz); |
| 317 | void acpi_nfit_shutdown(void *data); | 341 | void acpi_nfit_shutdown(void *data); |
diff --git a/drivers/base/core.c b/drivers/base/core.c index da84a73f2ba6..636058bbf48a 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -1663,6 +1663,9 @@ void device_initialize(struct device *dev) | |||
| 1663 | kobject_init(&dev->kobj, &device_ktype); | 1663 | kobject_init(&dev->kobj, &device_ktype); |
| 1664 | INIT_LIST_HEAD(&dev->dma_pools); | 1664 | INIT_LIST_HEAD(&dev->dma_pools); |
| 1665 | mutex_init(&dev->mutex); | 1665 | mutex_init(&dev->mutex); |
| 1666 | #ifdef CONFIG_PROVE_LOCKING | ||
| 1667 | mutex_init(&dev->lockdep_mutex); | ||
| 1668 | #endif | ||
| 1666 | lockdep_set_novalidate_class(&dev->mutex); | 1669 | lockdep_set_novalidate_class(&dev->mutex); |
| 1667 | spin_lock_init(&dev->devres_lock); | 1670 | spin_lock_init(&dev->devres_lock); |
| 1668 | INIT_LIST_HEAD(&dev->devres_head); | 1671 | INIT_LIST_HEAD(&dev->devres_head); |
| @@ -2211,6 +2214,24 @@ void put_device(struct device *dev) | |||
| 2211 | } | 2214 | } |
| 2212 | EXPORT_SYMBOL_GPL(put_device); | 2215 | EXPORT_SYMBOL_GPL(put_device); |
| 2213 | 2216 | ||
| 2217 | bool kill_device(struct device *dev) | ||
| 2218 | { | ||
| 2219 | /* | ||
| 2220 | * Require the device lock and set the "dead" flag to guarantee that | ||
| 2221 | * the update behavior is consistent with the other bitfields near | ||
| 2222 | * it and that we cannot have an asynchronous probe routine trying | ||
| 2223 | * to run while we are tearing out the bus/class/sysfs from | ||
| 2224 | * underneath the device. | ||
| 2225 | */ | ||
| 2226 | lockdep_assert_held(&dev->mutex); | ||
| 2227 | |||
| 2228 | if (dev->p->dead) | ||
| 2229 | return false; | ||
| 2230 | dev->p->dead = true; | ||
| 2231 | return true; | ||
| 2232 | } | ||
| 2233 | EXPORT_SYMBOL_GPL(kill_device); | ||
| 2234 | |||
