diff options
Diffstat (limited to 'fs/sysfs/file.c')
-rw-r--r-- | fs/sysfs/file.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 5c13f29bfcdb..118fa197a35f 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
@@ -406,6 +406,50 @@ int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr, | |||
406 | EXPORT_SYMBOL_GPL(sysfs_chmod_file); | 406 | EXPORT_SYMBOL_GPL(sysfs_chmod_file); |
407 | 407 | ||
408 | /** | 408 | /** |
409 | * sysfs_break_active_protection - break "active" protection | ||
410 | * @kobj: The kernel object @attr is associated with. | ||
411 | * @attr: The attribute to break the "active" protection for. | ||
412 | * | ||
413 | * With sysfs, just like kernfs, deletion of an attribute is postponed until | ||
414 | * all active .show() and .store() callbacks have finished unless this function | ||
415 | * is called. Hence this function is useful in methods that implement self | ||
416 | * deletion. | ||
417 | */ | ||
418 | struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj, | ||
419 | const struct attribute *attr) | ||
420 | { | ||
421 | struct kernfs_node *kn; | ||
422 | |||
423 | kobject_get(kobj); | ||
424 | kn = kernfs_find_and_get(kobj->sd, attr->name); | ||
425 | if (kn) | ||
426 | kernfs_break_active_protection(kn); | ||
427 | return kn; | ||
428 | } | ||
429 | EXPORT_SYMBOL_GPL(sysfs_break_active_protection); | ||
430 | |||
431 | /** | ||
432 | * sysfs_unbreak_active_protection - restore "active" protection | ||
433 | * @kn: Pointer returned by sysfs_break_active_protection(). | ||
434 | * | ||
435 | * Undo the effects of sysfs_break_active_protection(). Since this function | ||
436 | * calls kernfs_put() on the kernfs node that corresponds to the 'attr' | ||
437 | * argument passed to sysfs_break_active_protection() that attribute may have | ||
438 | * been removed between the sysfs_break_active_protection() and | ||
439 | * sysfs_unbreak_active_protection() calls, it is not safe to access @kn after | ||
440 | * this function has returned. | ||
441 | */ | ||
442 | void sysfs_unbreak_active_protection(struct kernfs_node *kn) | ||
443 | { | ||
444 | struct kobject *kobj = kn->parent->priv; | ||
445 | |||
446 | kernfs_unbreak_active_protection(kn); | ||
447 | kernfs_put(kn); | ||
448 | kobject_put(kobj); | ||
449 | } | ||
450 | EXPORT_SYMBOL_GPL(sysfs_unbreak_active_protection); | ||
451 | |||
452 | /** | ||
409 | * sysfs_remove_file_ns - remove an object attribute with a custom ns tag | 453 | * sysfs_remove_file_ns - remove an object attribute with a custom ns tag |
410 | * @kobj: object we're acting for | 454 | * @kobj: object we're acting for |
411 | * @attr: attribute descriptor | 455 | * @attr: attribute descriptor |