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

[PATCH] Fix oops in sysfs_hash_and_remove_file()

The problem arises if an entity in sysfs is created and removed without
ever having been made completely visible. In SCSI this is triggered by
removing a device while it's initialising.

The problem appears to be that because it was never made visible in sysfs,
the sysfs dentry has a null d_inode which oopses when a reference is made
to it. The solution is simply to check d_inode and assume the object was
never made visible (and thus doesn't need deleting) if it's NULL.

(akpm: possibly a stopgap for 2.6.13 scsi problems. May not be the
long-term fix)

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

James Bottomley and committed by
Linus Torvalds
36676bcb 657390d2

+4
+4
fs/sysfs/inode.c
··· 228 228 struct sysfs_dirent * sd; 229 229 struct sysfs_dirent * parent_sd = dir->d_fsdata; 230 230 231 + if (dir->d_inode == NULL) 232 + /* no inode means this hasn't been made visible yet */ 233 + return; 234 + 231 235 down(&dir->d_inode->i_sem); 232 236 list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { 233 237 if (!sd->s_element)