diff options
| author | Tejun Heo <tj@kernel.org> | 2014-01-10 08:57:31 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-04-16 14:56:33 -0400 |
| commit | 33ac1257ff0dee2e9c7f009b1c1914b7990217b2 (patch) | |
| tree | 772cb6e96bd964e8ec784a8e5cdc039318de7dce /fs/sysfs | |
| parent | 4afddd60a770560d370d6f85c5aef57c16bf7502 (diff) | |
sysfs, driver-core: remove unused {sysfs|device}_schedule_callback_owner()
All device_schedule_callback_owner() users are converted to use
device_remove_file_self(). Remove now unused
{sysfs|device}_schedule_callback_owner().
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/sysfs')
| -rw-r--r-- | fs/sysfs/file.c | 92 |
1 files changed, 0 insertions, 92 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 1b8b91b67fdb..28cc1acd5439 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
| @@ -453,95 +453,3 @@ void sysfs_remove_bin_file(struct kobject *kobj, | |||
| 453 | kernfs_remove_by_name(kobj->sd, attr->attr.name); | 453 | kernfs_remove_by_name(kobj->sd, attr->attr.name); |
| 454 | } | 454 | } |
| 455 | EXPORT_SYMBOL_GPL(sysfs_remove_bin_file); | 455 | EXPORT_SYMBOL_GPL(sysfs_remove_bin_file); |
| 456 | |||
| 457 | struct sysfs_schedule_callback_struct { | ||
| 458 | struct list_head workq_list; | ||
| 459 | struct kobject *kobj; | ||
| 460 | void (*func)(void *); | ||
| 461 | void *data; | ||
| 462 | struct module *owner; | ||
| 463 | struct work_struct work; | ||
| 464 | }; | ||
| 465 | |||
| 466 | static struct workqueue_struct *sysfs_workqueue; | ||
| 467 | static DEFINE_MUTEX(sysfs_workq_mutex); | ||
| 468 | static LIST_HEAD(sysfs_workq); | ||
| 469 | static void sysfs_schedule_callback_work(struct work_struct *work) | ||
| 470 | { | ||
| 471 | struct sysfs_schedule_callback_struct *ss = container_of(work, | ||
| 472 | struct sysfs_schedule_callback_struct, work); | ||
| 473 | |||
| 474 | (ss->func)(ss->data); | ||
| 475 | kobject_put(ss->kobj); | ||
| 476 | module_put(ss->owner); | ||
| 477 | mutex_lock(&sysfs_workq_mutex); | ||
| 478 | list_del(&ss->workq_list); | ||
| 479 | mutex_unlock(&sysfs_workq_mutex); | ||
| 480 | kfree(ss); | ||
| 481 | } | ||
| 482 | |||
| 483 | /** | ||
| 484 | * sysfs_schedule_callback - helper to schedule a callback for a kobject | ||
| 485 | * @kobj: object we're acting for. | ||
| 486 | * @func: callback function to invoke later. | ||
| 487 | * @data: argument to pass to @func. | ||
| 488 | * @owner: module owning the callback code | ||
| 489 | * | ||
| 490 | * sysfs attribute methods must not unregister themselves or their parent | ||
| 491 | * kobject (which would amount to the same thing). Attempts to do so will | ||
| 492 | * deadlock, since unregistration is mutually exclusive with driver | ||
| 493 | * callbacks. | ||
| 494 | * | ||
| 495 | * Instead methods can call this routine, which will attempt to allocate | ||
| 496 | * and schedule a workqueue request to call back @func with @data as its | ||
| 497 | * argument in the workqueue's process context. @kobj will be pinned | ||
| 498 | * until @func returns. | ||
| 499 | * | ||
| 500 | * Returns 0 if the request was submitted, -ENOMEM if storage could not | ||
| 501 | * be allocated, -ENODEV if a reference to @owner isn't available, | ||
| 502 | * -EAGAIN if a callback has already been scheduled for @kobj. | ||
| 503 | */ | ||
| 504 | int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), | ||
| 505 | void *data, struct module *owner) | ||
| 506 | { | ||
| 507 | struct sysfs_schedule_callback_struct *ss, *tmp; | ||
| 508 | |||
| 509 | if (!try_module_get(owner)) | ||
| 510 | return -ENODEV; | ||
| 511 | |||
| 512 | mutex_lock(&sysfs_workq_mutex); | ||
| 513 | list_for_each_entry_safe(ss, tmp, &sysfs_workq, workq_list) | ||
| 514 | if (ss->kobj == kobj) { | ||
| 515 | module_put(owner); | ||
| 516 | mutex_unlock(&sysfs_workq_mutex); | ||
| 517 | return -EAGAIN; | ||
| 518 | } | ||
| 519 | mutex_unlock(&sysfs_workq_mutex); | ||
| 520 | |||
| 521 | if (sysfs_workqueue == NULL) { | ||
| 522 | sysfs_workqueue = create_singlethread_workqueue("sysfsd"); | ||
| 523 | if (sysfs_workqueue == NULL) { | ||
| 524 | module_put(owner); | ||
| 525 | return -ENOMEM; | ||
| 526 | } | ||
| 527 | } | ||
| 528 | |||
| 529 | ss = kmalloc(sizeof(*ss), GFP_KERNEL); | ||
| 530 | if (!ss) { | ||
| 531 | module_put(owner); | ||
| 532 | return -ENOMEM; | ||
| 533 | } | ||
| 534 | kobject_get(kobj); | ||
| 535 | ss->kobj = kobj; | ||
| 536 | ss->func = func; | ||
| 537 | ss->data = data; | ||
| 538 | ss->owner = owner; | ||
| 539 | INIT_WORK(&ss->work, sysfs_schedule_callback_work); | ||
| 540 | INIT_LIST_HEAD(&ss->workq_list); | ||
| 541 | mutex_lock(&sysfs_workq_mutex); | ||
| 542 | list_add_tail(&ss->workq_list, &sysfs_workq); | ||
| 543 | mutex_unlock(&sysfs_workq_mutex); | ||
| 544 | queue_work(sysfs_workqueue, &ss->work); | ||
| 545 | return 0; | ||
| 546 | } | ||
| 547 | EXPORT_SYMBOL_GPL(sysfs_schedule_callback); | ||
