cifs: we do not need a spinlock around the tree access during umount
authorRonnie Sahlberg <lsahlber@redhat.com>
Tue, 15 Mar 2022 03:44:04 +0000 (13:44 +1000)
committerSteve French <stfrench@microsoft.com>
Sat, 19 Mar 2022 04:10:34 +0000 (23:10 -0500)
Remove the spinlock around the tree traversal as we are calling possibly
sleeping functions.
We do not need a spinlock here as there will be no modifications to this
tree at this point.

This prevents warnings like this to occur in dmesg:
[  653.774996] BUG: sleeping function called from invalid context at kernel/loc\
king/mutex.c:280
[  653.775088] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1827, nam\
e: umount
[  653.775152] preempt_count: 1, expected: 0
[  653.775191] CPU: 0 PID: 1827 Comm: umount Tainted: G        W  OE     5.17.0\
-rc7-00006-g4eb628dd74df #135
[  653.775195] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.14.0-\
1.fc33 04/01/2014
[  653.775197] Call Trace:
[  653.775199]  <TASK>
[  653.775202]  dump_stack_lvl+0x34/0x44
[  653.775209]  __might_resched.cold+0x13f/0x172
[  653.775213]  mutex_lock+0x75/0xf0
[  653.775217]  ? __mutex_lock_slowpath+0x10/0x10
[  653.775220]  ? _raw_write_lock_irq+0xd0/0xd0
[  653.775224]  ? dput+0x6b/0x360
[  653.775228]  cifs_kill_sb+0xff/0x1d0 [cifs]
[  653.775285]  deactivate_locked_super+0x85/0x130
[  653.775289]  cleanup_mnt+0x32c/0x4d0
[  653.775292]  ? path_umount+0x228/0x380
[  653.775296]  task_work_run+0xd8/0x180
[  653.775301]  exit_to_user_mode_loop+0x152/0x160
[  653.775306]  exit_to_user_mode_prepare+0x89/0xd0
[  653.775315]  syscall_exit_to_user_mode+0x12/0x30
[  653.775322]  do_syscall_64+0x48/0x90
[  653.775326]  entry_SYSCALL_64_after_hwframe+0x44/0xae

Fixes: 187af6e98b44e5d8f25e1d41a92db138eb54416f ("cifs: fix handlecache and multiuser")
Reported-by: kernel test robot <oliver.sang@intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifsfs.c

index 677c02aa8731f5b40bf583c101e022d28b3e232b..6e5246122ee2cc46135d2da8e7319cf333cc4160 100644 (file)
@@ -269,7 +269,6 @@ static void cifs_kill_sb(struct super_block *sb)
                dput(cifs_sb->root);
                cifs_sb->root = NULL;
        }
-       spin_lock(&cifs_sb->tlink_tree_lock);
        node = rb_first(root);
        while (node != NULL) {
                tlink = rb_entry(node, struct tcon_link, tl_rbnode);
@@ -283,7 +282,6 @@ static void cifs_kill_sb(struct super_block *sb)
                mutex_unlock(&cfid->fid_mutex);
                node = rb_next(node);
        }
-       spin_unlock(&cifs_sb->tlink_tree_lock);
 
        kill_anon_super(sb);
        cifs_umount(cifs_sb);