From: Mark Lord Date: Tue, 6 Mar 2007 09:42:03 +0000 (-0800) Subject: [PATCH] Fix 2.6.21 rfcomm lockups X-Git-Tag: v2.6.21-rc3~47 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=0de1517e23c2e28d58a6344b97a120596ea200bb;p=linux-2.6-omap-h63xx.git [PATCH] Fix 2.6.21 rfcomm lockups Any attempt to open/use a bluetooth rfcomm device locks up scheduling completely on my machine. Interrupts (ping, alt-sysrq) seem to be alive, but nothing else. This was working fine in 2.6.20, broken now in 2.6.21-rc2-git* Reverting this change (below) fixes it: | author Marcel Holtmann | Sat, 17 Feb 2007 22:58:57 +0000 (23:58 +0100) | committer David S. Miller | Mon, 26 Feb 2007 19:42:41 +0000 (11:42 -0800) | commit c1a3313698895d8ad4760f98642007bf236af2e8 | tree 337a876f727061362b6a169f8759849c105b8f7a tree | snapshot | parent f5ffd4620aba9e55656483ae1ef5c79ba81f5403 commit | diff | | [Bluetooth] Make use of device_move() for RFCOMM TTY devices | | In the case of bound RFCOMM TTY devices the parent is not available | before its usage. So when opening a RFCOMM TTY device, move it to | the corresponding ACL device as a child. When closing the device, | move it back to the virtual device tree. | Signed-off-by: Marcel Holtmann The simplest fix for this bug is to prevent sysfs_move_dir() from self-deadlocking when (old_parent == new_parent). This patch prevents total system lockup when using rfcomm devices. Signed-off-by: Mark Lord Acked-by: Cornelia Huck Cc: Greg KH Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 8813990304f..85a668680f8 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -431,6 +431,8 @@ int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent) new_parent_dentry = new_parent ? new_parent->dentry : sysfs_mount->mnt_sb->s_root; + if (old_parent_dentry->d_inode == new_parent_dentry->d_inode) + return 0; /* nothing to move */ again: mutex_lock(&old_parent_dentry->d_inode->i_mutex); if (!mutex_trylock(&new_parent_dentry->d_inode->i_mutex)) {