forked from mirrors/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>
This commit is contained in:
		
							parent
							
								
									7fa8512330
								
							
						
					
					
						commit
						2afc9166f7
					
				
					 2 changed files with 58 additions and 0 deletions
				
			
		| 
						 | 
					@ -405,6 +405,50 @@ int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(sysfs_chmod_file);
 | 
					EXPORT_SYMBOL_GPL(sysfs_chmod_file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * sysfs_break_active_protection - break "active" protection
 | 
				
			||||||
 | 
					 * @kobj: The kernel object @attr is associated with.
 | 
				
			||||||
 | 
					 * @attr: The attribute to break the "active" protection for.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * With sysfs, just like kernfs, deletion of an attribute is postponed until
 | 
				
			||||||
 | 
					 * all active .show() and .store() callbacks have finished unless this function
 | 
				
			||||||
 | 
					 * is called. Hence this function is useful in methods that implement self
 | 
				
			||||||
 | 
					 * deletion.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
 | 
				
			||||||
 | 
											  const struct attribute *attr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct kernfs_node *kn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						kobject_get(kobj);
 | 
				
			||||||
 | 
						kn = kernfs_find_and_get(kobj->sd, attr->name);
 | 
				
			||||||
 | 
						if (kn)
 | 
				
			||||||
 | 
							kernfs_break_active_protection(kn);
 | 
				
			||||||
 | 
						return kn;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(sysfs_break_active_protection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * sysfs_unbreak_active_protection - restore "active" protection
 | 
				
			||||||
 | 
					 * @kn: Pointer returned by sysfs_break_active_protection().
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Undo the effects of sysfs_break_active_protection(). Since this function
 | 
				
			||||||
 | 
					 * calls kernfs_put() on the kernfs node that corresponds to the 'attr'
 | 
				
			||||||
 | 
					 * argument passed to sysfs_break_active_protection() that attribute may have
 | 
				
			||||||
 | 
					 * been removed between the sysfs_break_active_protection() and
 | 
				
			||||||
 | 
					 * sysfs_unbreak_active_protection() calls, it is not safe to access @kn after
 | 
				
			||||||
 | 
					 * this function has returned.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void sysfs_unbreak_active_protection(struct kernfs_node *kn)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct kobject *kobj = kn->parent->priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						kernfs_unbreak_active_protection(kn);
 | 
				
			||||||
 | 
						kernfs_put(kn);
 | 
				
			||||||
 | 
						kobject_put(kobj);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(sysfs_unbreak_active_protection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * sysfs_remove_file_ns - remove an object attribute with a custom ns tag
 | 
					 * sysfs_remove_file_ns - remove an object attribute with a custom ns tag
 | 
				
			||||||
 * @kobj: object we're acting for
 | 
					 * @kobj: object we're acting for
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -237,6 +237,9 @@ int __must_check sysfs_create_files(struct kobject *kobj,
 | 
				
			||||||
				   const struct attribute **attr);
 | 
									   const struct attribute **attr);
 | 
				
			||||||
int __must_check sysfs_chmod_file(struct kobject *kobj,
 | 
					int __must_check sysfs_chmod_file(struct kobject *kobj,
 | 
				
			||||||
				  const struct attribute *attr, umode_t mode);
 | 
									  const struct attribute *attr, umode_t mode);
 | 
				
			||||||
 | 
					struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
 | 
				
			||||||
 | 
											  const struct attribute *attr);
 | 
				
			||||||
 | 
					void sysfs_unbreak_active_protection(struct kernfs_node *kn);
 | 
				
			||||||
void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
 | 
					void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
 | 
				
			||||||
			  const void *ns);
 | 
								  const void *ns);
 | 
				
			||||||
bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
 | 
					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,
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline struct kernfs_node *
 | 
				
			||||||
 | 
					sysfs_break_active_protection(struct kobject *kobj,
 | 
				
			||||||
 | 
								      const struct attribute *attr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void sysfs_remove_file_ns(struct kobject *kobj,
 | 
					static inline void sysfs_remove_file_ns(struct kobject *kobj,
 | 
				
			||||||
					const struct attribute *attr,
 | 
										const struct attribute *attr,
 | 
				
			||||||
					const void *ns)
 | 
										const void *ns)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue