diff options
Diffstat (limited to 'include/linux/sysfs.h')
| -rw-r--r-- | include/linux/sysfs.h | 87 | 
1 files changed, 84 insertions, 3 deletions
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index cfa83083a2d..f2694eb4dd3 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h @@ -15,10 +15,12 @@  #include <linux/compiler.h>  #include <linux/errno.h>  #include <linux/list.h> +#include <linux/lockdep.h>  #include <asm/atomic.h>  struct kobject;  struct module; +enum kobj_ns_type;  /* FIXME   * The *owner field is no longer used. @@ -29,8 +31,33 @@ struct attribute {  	const char		*name;  	struct module		*owner;  	mode_t			mode; +#ifdef CONFIG_DEBUG_LOCK_ALLOC +	struct lock_class_key	*key; +	struct lock_class_key	skey; +#endif  }; +/** + *	sysfs_attr_init - initialize a dynamically allocated sysfs attribute + *	@attr: struct attribute to initialize + * + *	Initialize a dynamically allocated struct attribute so we can + *	make lockdep happy.  This is a new requirement for attributes + *	and initially this is only needed when lockdep is enabled. + *	Lockdep gives a nice error when your attribute is added to + *	sysfs if you don't have this. + */ +#ifdef CONFIG_DEBUG_LOCK_ALLOC +#define sysfs_attr_init(attr)				\ +do {							\ +	static struct lock_class_key __key;		\ +							\ +	(attr)->key = &__key;				\ +} while(0) +#else +#define sysfs_attr_init(attr) do {} while(0) +#endif +  struct attribute_group {  	const char		*name;  	mode_t			(*is_visible)(struct kobject *, @@ -60,20 +87,33 @@ struct attribute_group {  #define attr_name(_attr) (_attr).attr.name +struct file;  struct vm_area_struct;  struct bin_attribute {  	struct attribute	attr;  	size_t			size;  	void			*private; -	ssize_t (*read)(struct kobject *, struct bin_attribute *, +	ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,  			char *, loff_t, size_t); -	ssize_t (*write)(struct kobject *, struct bin_attribute *, +	ssize_t (*write)(struct file *,struct kobject *, struct bin_attribute *,  			 char *, loff_t, size_t); -	int (*mmap)(struct kobject *, struct bin_attribute *attr, +	int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,  		    struct vm_area_struct *vma);  }; +/** + *	sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute + *	@attr: struct bin_attribute to initialize + * + *	Initialize a dynamically allocated struct bin_attribute so we + *	can make lockdep happy.  This is a new requirement for + *	attributes and initially this is only needed when lockdep is + *	enabled.  Lockdep gives a nice error when your attribute is + *	added to sysfs if you don't have this. + */ +#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) +  struct sysfs_ops {  	ssize_t	(*show)(struct kobject *, struct attribute *,char *);  	ssize_t	(*store)(struct kobject *,struct attribute *,const char *, size_t); @@ -94,9 +134,12 @@ int __must_check sysfs_move_dir(struct kobject *kobj,  int __must_check sysfs_create_file(struct kobject *kobj,  				   const struct attribute *attr); +int __must_check sysfs_create_files(struct kobject *kobj, +				   const struct attribute **attr);  int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr,  				  mode_t mode);  void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); +void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr);  int __must_check sysfs_create_bin_file(struct kobject *kobj,  				       const struct bin_attribute *attr); @@ -110,6 +153,12 @@ int __must_check sysfs_create_link_nowarn(struct kobject *kobj,  					  const char *name);  void sysfs_remove_link(struct kobject *kobj, const char *name); +int sysfs_rename_link(struct kobject *kobj, struct kobject *target, +			const char *old_name, const char *new_name); + +void sysfs_delete_link(struct kobject *dir, struct kobject *targ, +			const char *name); +  int __must_check sysfs_create_group(struct kobject *kobj,  				    const struct attribute_group *grp);  int sysfs_update_group(struct kobject *kobj, @@ -124,10 +173,15 @@ void sysfs_remove_file_from_group(struct kobject *kobj,  void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);  void sysfs_notify_dirent(struct sysfs_dirent *sd);  struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, +				      const void *ns,  				      const unsigned char *name);  struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd);  void sysfs_put(struct sysfs_dirent *sd);  void sysfs_printk_last_file(void); + +/* Called to clear a ns tag when it is no longer valid */ +void sysfs_exit_ns(enum kobj_ns_type type, const void *tag); +  int __must_check sysfs_init(void);  #else /* CONFIG_SYSFS */ @@ -164,6 +218,12 @@ static inline int sysfs_create_file(struct kobject *kobj,  	return 0;  } +static inline int sysfs_create_files(struct kobject *kobj, +				    const struct attribute **attr) +{ +	return 0; +} +  static inline int sysfs_chmod_file(struct kobject *kobj,  				   struct attribute *attr, mode_t mode)  { @@ -175,6 +235,11 @@ static inline void sysfs_remove_file(struct kobject *kobj,  {  } +static inline void sysfs_remove_files(struct kobject *kobj, +				     const struct attribute **attr) +{ +} +  static inline int sysfs_create_bin_file(struct kobject *kobj,  					const struct bin_attribute *attr)  { @@ -203,6 +268,17 @@ static inline void sysfs_remove_link(struct kobject *kobj, const char *name)  {  } +static inline int sysfs_rename_link(struct kobject *k, struct kobject *t, +				    const char *old_name, const char *new_name) +{ +	return 0; +} + +static inline void sysfs_delete_link(struct kobject *k, struct kobject *t, +				     const char *name) +{ +} +  static inline int sysfs_create_group(struct kobject *kobj,  				     const struct attribute_group *grp)  { @@ -240,6 +316,7 @@ static inline void sysfs_notify_dirent(struct sysfs_dirent *sd)  }  static inline  struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, +				      const void *ns,  				      const unsigned char *name)  {  	return NULL; @@ -252,6 +329,10 @@ static inline void sysfs_put(struct sysfs_dirent *sd)  {  } +static inline void sysfs_exit_ns(int type, const void *tag) +{ +} +  static inline int __must_check sysfs_init(void)  {  	return 0;  |