diff mbox series

cifs: we do not need a spinlock around the tree access during umount

Message ID 20220315034404.623539-1-lsahlber@redhat.com
State New
Headers show
Series cifs: we do not need a spinlock around the tree access during umount | expand

Commit Message

Ronnie Sahlberg March 15, 2022, 3:44 a.m. UTC
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>
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
---
 fs/cifs/cifsfs.c | 2 --
 1 file changed, 2 deletions(-)

Comments

Steve French March 15, 2022, 3:49 a.m. UTC | #1
tentatively merged into cifs-2.6.git for-next pending testing

On Mon, Mar 14, 2022 at 10:44 PM Ronnie Sahlberg <lsahlber@redhat.com> wrote:
>
> 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>
> Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
> ---
>  fs/cifs/cifsfs.c | 2 --
>  1 file changed, 2 deletions(-)
>
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index 677c02aa8731..6e5246122ee2 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -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);
> --
> 2.30.2
>
diff mbox series

Patch

diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 677c02aa8731..6e5246122ee2 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -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);