Skip to content

Commit 2afc916

Browse files
KAGA-KOKOmartinkpetersen
authored andcommitted
scsi: sysfs: Introduce sysfs_{un,}break_active_protection()
Introduce these two functions and export them such that the next patch can add calls to these functions from the SCSI core. Signed-off-by: Bart Van Assche <[email protected]> Acked-by: Tejun Heo <[email protected]> Acked-by: Greg Kroah-Hartman <[email protected]> Cc: <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 7fa8512 commit 2afc916

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

fs/sysfs/file.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,50 @@ int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr,
405405
}
406406
EXPORT_SYMBOL_GPL(sysfs_chmod_file);
407407

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+
408452
/**
409453
* sysfs_remove_file_ns - remove an object attribute with a custom ns tag
410454
* @kobj: object we're acting for

include/linux/sysfs.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ int __must_check sysfs_create_files(struct kobject *kobj,
237237
const struct attribute **attr);
238238
int __must_check sysfs_chmod_file(struct kobject *kobj,
239239
const struct attribute *attr, umode_t mode);
240+
struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
241+
const struct attribute *attr);
242+
void sysfs_unbreak_active_protection(struct kernfs_node *kn);
240243
void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
241244
const void *ns);
242245
bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
@@ -350,6 +353,17 @@ static inline int sysfs_chmod_file(struct kobject *kobj,
350353
return 0;
351354
}
352355

356+
static inline struct kernfs_node *
357+
sysfs_break_active_protection(struct kobject *kobj,
358+
const struct attribute *attr)
359+
{
360+
return NULL;
361+
}
362+
363+
static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
364+
{
365+
}
366+
353367
static inline void sysfs_remove_file_ns(struct kobject *kobj,
354368
const struct attribute *attr,
355369
const void *ns)

0 commit comments

Comments
 (0)