• Frederic Weisbecker's avatar
    reiserfs: fix dependency inversion between inode and reiserfs mutexes · 3f259d09
    Frederic Weisbecker authored
    The reiserfs mutex already depends on the inode mutex, so we can't lock
    the inode mutex in reiserfs_unpack() without using the safe locking API,
    because reiserfs_unpack() is always called with the reiserfs mutex locked.
    
    This fixes:
    
      =======================================================
      [ INFO: possible circular locking dependency detected ]
      2.6.35c #13
      -------------------------------------------------------
      lilo/1606 is trying to acquire lock:
       (&sb->s_type->i_mutex_key#8){+.+.+.}, at: [<d0329450>] reiserfs_unpack+0x60/0x110 [reiserfs]
    
      but task is already holding lock:
       (&REISERFS_SB(s)->lock){+.+.+.}, at: [<d032a268>] reiserfs_write_lock+0x28/0x40 [reiserfs]
    
      which lock already depends on the new lock.
    
      the existing dependency chain (in reverse order) is:
    
      -> #1 (&REISERFS_SB(s)->lock){+.+.+.}:
             [<c1056347>] lock_acquire+0x67/0x80
             [<c12f083d>] __mutex_lock_common+0x4d/0x410
             [<c12f0c58>] mutex_lock_nested+0x18/0x20
             [<d032a268>] reiserfs_write_lock+0x28/0x40 [reiserfs]
             [<d0329e9a>] reiserfs_lookup_privroot+0x2a/0x90 [reiserfs]
             [<d0316b81>] reiserfs_fill_super+0x941/0xe60 [reiserfs]
             [<c10b7d17>] get_sb_bdev+0x117/0x170
             [<d0313e21>] get_super_block+0x21/0x30 [reiserfs]
             [<c10b74ba>] vfs_kern_mount+0x6a/0x1b0
             [<c10b7659>] do_kern_mount+0x39/0xe0
             [<c10cebe0>] do_mount+0x340/0x790
             [<c10cf0b4>] sys_mount+0x84/0xb0
             [<c12f25cd>] syscall_call+0x7/0xb
    
      -> #0 (&sb->s_type->i_mutex_key#8){+.+.+.}:
             [<c1056186>] __lock_acquire+0x1026/0x1180
             [<c1056347>] lock_acquire+0x67/0x80
             [<c12f083d>] __mutex_lock_common+0x4d/0x410
             [<c12f0c58>] mutex_lock_nested+0x18/0x20
             [<d0329450>] reiserfs_unpack+0x60/0x110 [reiserfs]
             [<d0329772>] reiserfs_ioctl+0x272/0x320 [reiserfs]
             [<c10c3228>] vfs_ioctl+0x28/0xa0
             [<c10c3c5d>] do_vfs_ioctl+0x32d/0x5c0
             [<c10c3f53>] sys_ioctl+0x63/0x70
             [<c12f25cd>] syscall_call+0x7/0xb
    
      other info that might help us debug this:
    
      1 lock held by lilo/1606:
       #0:  (&REISERFS_SB(s)->lock){+.+.+.}, at: [<d032a268>] reiserfs_write_lock+0x28/0x40 [reiserfs]
    
      stack backtrace:
      Pid: 1606, comm: lilo Not tainted 2.6.35c #13
      Call Trace:
       [<c1056186>] __lock_acquire+0x1026/0x1180
       [<c1056347>] lock_acquire+0x67/0x80
       [<c12f083d>] __mutex_lock_common+0x4d/0x410
       [<c12f0c58>] mutex_lock_nested+0x18/0x20
       [<d0329450>] reiserfs_unpack+0x60/0x110 [reiserfs]
       [<d0329772>] reiserfs_ioctl+0x272/0x320 [reiserfs]
       [<c10c3228>] vfs_ioctl+0x28/0xa0
       [<c10c3c5d>] do_vfs_ioctl+0x32d/0x5c0
       [<c10c3f53>] sys_ioctl+0x63/0x70
       [<c12f25cd>] syscall_call+0x7/0xb
    Reported-by: default avatarJarek Poplawski <jarkao2@gmail.com>
    Tested-by: default avatarJarek Poplawski <jarkao2@gmail.com>
    Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Jeff Mahoney <jeffm@suse.com>
    Cc: <stable@kernel.org>		[2.6.32 and later]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3f259d09
ioctl.c 5.5 KB