Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <bart.vanassche@wdc.com>
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Bart Van Assche and committed by
Martin K. Petersen
2afc9166 7fa85123

+58
+44
fs/sysfs/file.c
··· 406 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 453 * sysfs_remove_file_ns - remove an object attribute with a custom ns tag 410 454 * @kobj: object we're acting for 411 455 * @attr: attribute descriptor
+14
include/linux/sysfs.h
··· 237 237 const struct attribute **attr); 238 238 int __must_check sysfs_chmod_file(struct kobject *kobj, 239 239 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); 240 243 void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr, 241 244 const void *ns); 242 245 bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr); ··· 351 348 const struct attribute *attr, umode_t mode) 352 349 { 353 350 return 0; 351 + } 352 + 353 + static inline struct kernfs_node * 354 + sysfs_break_active_protection(struct kobject *kobj, 355 + const struct attribute *attr) 356 + { 357 + return NULL; 358 + } 359 + 360 + static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn) 361 + { 354 362 } 355 363 356 364 static inline void sysfs_remove_file_ns(struct kobject *kobj,