s_inodes is superblock-specific resource, which should be protected by sb's specific lock s_inode_list_lock.
base-commit: 8436c4a57bd147b0bd2943ab499bb8368981b9e1 Signed-off-by: Dawei Li <[email protected]> --- fs/erofs/fscache.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c index 998cd26a1b3b..bbf5268440df 100644 --- a/fs/erofs/fscache.c +++ b/fs/erofs/fscache.c @@ -589,15 +589,18 @@ struct erofs_fscache *erofs_domain_register_cookie(struct super_block *sb, struct erofs_domain *domain = EROFS_SB(sb)->domain; struct super_block *psb = erofs_pseudo_mnt->mnt_sb; - mutex_lock(&erofs_domain_cookies_lock); + spin_lock(&psb->s_inode_list_lock); list_for_each_entry(inode, &psb->s_inodes, i_sb_list) { ctx = inode->i_private; if (!ctx || ctx->domain != domain || strcmp(ctx->name, name)) continue; igrab(inode); - mutex_unlock(&erofs_domain_cookies_lock); + spin_unlock(&psb->s_inode_list_lock); return ctx; } + spin_unlock(&psb->s_inode_list_lock); + + mutex_lock(&erofs_domain_cookies_lock); ctx = erofs_fscache_domain_init_cookie(sb, name, need_inode); mutex_unlock(&erofs_domain_cookies_lock); return ctx; -- 2.25.1
