mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-21 22:47:51 -04:00
ocfs2: kill osb->system_file_mutex lock
Commit43b10a2037("ocfs2: avoid system inode ref confusion by adding mutex lock") tried to avoid a refcount leak caused by allowing multiple threads to call igrab(inode). But addition of osb->system_file_mutex made locking dependency complicated and is causing lockdep to warn about possibility of AB-BA deadlock. Since _ocfs2_get_system_file_inode() returns the same inode for the same input arguments, we don't need to serialize _ocfs2_get_system_file_inode(). What we need to make sure is that igrab(inode) is called for only once(). Therefore, replace osb->system_file_mutex with cmpxchg()-based locking. Link: https://lore.kernel.org/fea8d1fd-afb0-4302-a560-c202e2ef7afd@I-love.SAKURA.ne.jp Fixes:43b10a2037("ocfs2: avoid system inode ref confusion by adding mutex lock") Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Reviewed-by: Heming Zhao <heming.zhao@suse.com> Acked-by: Joseph Qi <joseph.qi@linux.alibaba.com> Cc: Mark Fasheh <mark@fasheh.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Junxiao Bi <junxiao.bi@oracle.com> Cc: Changwei Ge <gechangwei@live.cn> Cc: Jun Piao <piaojun@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
f7ea0d1373
commit
f5b1910e23
@@ -494,8 +494,6 @@ struct ocfs2_super
|
||||
struct rb_root osb_rf_lock_tree;
|
||||
struct ocfs2_refcount_tree *osb_ref_tree_lru;
|
||||
|
||||
struct mutex system_file_mutex;
|
||||
|
||||
/*
|
||||
* OCFS2 needs to schedule several different types of work which
|
||||
* require cluster locking, disk I/O, recovery waits, etc. Since these
|
||||
|
||||
@@ -1997,8 +1997,6 @@ static int ocfs2_initialize_super(struct super_block *sb,
|
||||
spin_lock_init(&osb->osb_xattr_lock);
|
||||
ocfs2_init_steal_slots(osb);
|
||||
|
||||
mutex_init(&osb->system_file_mutex);
|
||||
|
||||
atomic_set(&osb->alloc_stats.moves, 0);
|
||||
atomic_set(&osb->alloc_stats.local_data, 0);
|
||||
atomic_set(&osb->alloc_stats.bitmap_data, 0);
|
||||
|
||||
@@ -98,11 +98,9 @@ struct inode *ocfs2_get_system_file_inode(struct ocfs2_super *osb,
|
||||
} else
|
||||
arr = get_local_system_inode(osb, type, slot);
|
||||
|
||||
mutex_lock(&osb->system_file_mutex);
|
||||
if (arr && ((inode = *arr) != NULL)) {
|
||||
/* get a ref in addition to the array ref */
|
||||
inode = igrab(inode);
|
||||
mutex_unlock(&osb->system_file_mutex);
|
||||
BUG_ON(!inode);
|
||||
|
||||
return inode;
|
||||
@@ -112,11 +110,10 @@ struct inode *ocfs2_get_system_file_inode(struct ocfs2_super *osb,
|
||||
inode = _ocfs2_get_system_file_inode(osb, type, slot);
|
||||
|
||||
/* add one more if putting into array for first time */
|
||||
if (arr && inode) {
|
||||
*arr = igrab(inode);
|
||||
BUG_ON(!*arr);
|
||||
if (inode && arr && !*arr && !cmpxchg(&(*arr), NULL, inode)) {
|
||||
inode = igrab(inode);
|
||||
BUG_ON(!inode);
|
||||
}
|
||||
mutex_unlock(&osb->system_file_mutex);
|
||||
return inode;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user