@@ -453,95 +453,3 @@ void sysfs_remove_bin_file(struct kobject *kobj,
453453 kernfs_remove_by_name (kobj -> sd , attr -> attr .name );
454454}
455455EXPORT_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 );
0 commit comments