Re: [PATCH] cifs: we do not need a spinlock around the tree access during umount

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



tentatively merged into cifs-2.6.git for-next pending testing

On Mon, Mar 14, 2022 at 10:44 PM Ronnie Sahlberg <lsahlber@xxxxxxxxxx> 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@xxxxxxxxx>
> Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx>
> ---
>  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
>


-- 
Thanks,

Steve



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux