From: "Randy.Dunlap" Make sysfs_remove_bin_file() void. If it detects an error, printk the file name and call dump_stack(). sysfs_hash_and_remove() now returns an error code indicating its success or failure so that sysfs_remove_bin_file() can know success/failure. Convert the only driver that checked the return value of sysfs_remove_bin_file(). Signed-off-by: Randy Dunlap Cc: Greg KH Signed-off-by: Andrew Morton --- drivers/pci/hotplug/acpiphp_ibm.c | 4 +--- fs/sysfs/bin.c | 13 ++++++++----- fs/sysfs/inode.c | 11 ++++++++--- fs/sysfs/sysfs.h | 2 +- include/linux/sysfs.h | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) diff -puN drivers/pci/hotplug/acpiphp_ibm.c~sysfs_remove_bin_file-no-return-value-dump_stack-on drivers/pci/hotplug/acpiphp_ibm.c --- a/drivers/pci/hotplug/acpiphp_ibm.c~sysfs_remove_bin_file-no-return-value-dump_stack-on +++ a/drivers/pci/hotplug/acpiphp_ibm.c @@ -487,9 +487,7 @@ static void __exit ibm_acpiphp_exit(void if (ACPI_FAILURE(status)) err("%s: Notification handler removal failed\n", __FUNCTION__); /* remove the /sys entries */ - if (sysfs_remove_bin_file(sysdir, &ibm_apci_table_attr)) - err("%s: removal of sysfs file apci_table failed\n", - __FUNCTION__); + sysfs_remove_bin_file(sysdir, &ibm_apci_table_attr); } module_init(ibm_acpiphp_init); diff -puN fs/sysfs/bin.c~sysfs_remove_bin_file-no-return-value-dump_stack-on fs/sysfs/bin.c --- a/fs/sysfs/bin.c~sysfs_remove_bin_file-no-return-value-dump_stack-on +++ a/fs/sysfs/bin.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -176,7 +177,6 @@ const struct file_operations bin_fops = * sysfs_create_bin_file - create binary file for object. * @kobj: object. * @attr: attribute descriptor. - * */ int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr) @@ -191,13 +191,16 @@ int sysfs_create_bin_file(struct kobject * sysfs_remove_bin_file - remove binary file for object. * @kobj: object. * @attr: attribute descriptor. - * */ -int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr) +void sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr) { - sysfs_hash_and_remove(kobj->dentry,attr->attr.name); - return 0; + if (sysfs_hash_and_remove(kobj->dentry, attr->attr.name) < 0) { + printk(KERN_ERR "%s: " + "bad dentry or inode or no such file: \"%s\"\n", + __FUNCTION__, attr->attr.name); + dump_stack(); + } } EXPORT_SYMBOL_GPL(sysfs_create_bin_file); diff -puN fs/sysfs/inode.c~sysfs_remove_bin_file-no-return-value-dump_stack-on fs/sysfs/inode.c --- a/fs/sysfs/inode.c~sysfs_remove_bin_file-no-return-value-dump_stack-on +++ a/fs/sysfs/inode.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "sysfs.h" extern struct super_block * sysfs_sb; @@ -234,17 +235,18 @@ void sysfs_drop_dentry(struct sysfs_dire } } -void sysfs_hash_and_remove(struct dentry * dir, const char * name) +int sysfs_hash_and_remove(struct dentry * dir, const char * name) { struct sysfs_dirent * sd; struct sysfs_dirent * parent_sd; + int found = 0; if (!dir) - return; + return -ENOENT; if (dir->d_inode == NULL) /* no inode means this hasn't been made visible yet */ - return; + return -ENOENT; parent_sd = dir->d_fsdata; mutex_lock(&dir->d_inode->i_mutex); @@ -255,8 +257,11 @@ void sysfs_hash_and_remove(struct dentry list_del_init(&sd->s_sibling); sysfs_drop_dentry(sd, dir); sysfs_put(sd); + found = 1; break; } } mutex_unlock(&dir->d_inode->i_mutex); + + return found ? 0 : -ENOENT; } diff -puN fs/sysfs/sysfs.h~sysfs_remove_bin_file-no-return-value-dump_stack-on fs/sysfs/sysfs.h --- a/fs/sysfs/sysfs.h~sysfs_remove_bin_file-no-return-value-dump_stack-on +++ a/fs/sysfs/sysfs.h @@ -10,7 +10,7 @@ extern int sysfs_make_dirent(struct sysf umode_t, int); extern int sysfs_add_file(struct dentry *, const struct attribute *, int); -extern void sysfs_hash_and_remove(struct dentry * dir, const char * name); +extern int sysfs_hash_and_remove(struct dentry * dir, const char * name); extern struct sysfs_dirent *sysfs_find(struct sysfs_dirent *dir, const char * name); extern int sysfs_create_subdir(struct kobject *, const char *, struct dentry **); diff -puN include/linux/sysfs.h~sysfs_remove_bin_file-no-return-value-dump_stack-on include/linux/sysfs.h --- a/include/linux/sysfs.h~sysfs_remove_bin_file-no-return-value-dump_stack-on +++ a/include/linux/sysfs.h @@ -116,7 +116,7 @@ sysfs_remove_link(struct kobject *, cons int __must_check sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr); -int __must_check sysfs_remove_bin_file(struct kobject * kobj, +void sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr); int __must_check sysfs_create_group(struct kobject *, _