Skip to content

Commit 0c954c5

Browse files
Tetsuo Handaakpm00
authored andcommitted
ocfs2: embed actual values into ocfs2_sysfile_lock_key names
Since lockdep_set_class() uses stringified key name via macro, calling lockdep_set_class() with an array causes lockdep warning messages to report variable name than actual index number. Change ocfs2_init_locked_inode() to pass actual index number for better readability of lockdep reports. This patch does not change behavior. Before: Chain exists of: &ocfs2_sysfile_lock_key[args->fi_sysfile_type] --> jbd2_handle --> &oi->ip_xattr_sem Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&oi->ip_xattr_sem); lock(jbd2_handle); lock(&oi->ip_xattr_sem); lock(&ocfs2_sysfile_lock_key[args->fi_sysfile_type]); *** DEADLOCK *** After: Chain exists of: &ocfs2_sysfile_lock_key[EXTENT_ALLOC_SYSTEM_INODE] --> jbd2_handle --> &oi->ip_xattr_sem Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&oi->ip_xattr_sem); lock(jbd2_handle); lock(&oi->ip_xattr_sem); lock(&ocfs2_sysfile_lock_key[EXTENT_ALLOC_SYSTEM_INODE]); *** DEADLOCK *** Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Tetsuo Handa <[email protected]> Reviewed-by: Joseph Qi <[email protected]> Cc: Mark Fasheh <[email protected]> Cc: Joel Becker <[email protected]> Cc: Junxiao Bi <[email protected]> Cc: Changwei Ge <[email protected]> Cc: Jun Piao <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 01bda05 commit 0c954c5

File tree

1 file changed

+66
-4
lines changed

1 file changed

+66
-4
lines changed

fs/ocfs2/inode.c

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ struct ocfs2_find_inode_args
5050
unsigned int fi_sysfile_type;
5151
};
5252

53-
static struct lock_class_key ocfs2_sysfile_lock_key[NUM_SYSTEM_INODES];
54-
5553
static int ocfs2_read_locked_inode(struct inode *inode,
5654
struct ocfs2_find_inode_args *args);
5755
static int ocfs2_init_locked_inode(struct inode *inode, void *opaque);
@@ -250,14 +248,77 @@ static int ocfs2_find_actor(struct inode *inode, void *opaque)
250248
static int ocfs2_init_locked_inode(struct inode *inode, void *opaque)
251249
{
252250
struct ocfs2_find_inode_args *args = opaque;
251+
#ifdef CONFIG_LOCKDEP
252+
static struct lock_class_key ocfs2_sysfile_lock_key[NUM_SYSTEM_INODES];
253253
static struct lock_class_key ocfs2_quota_ip_alloc_sem_key,
254254
ocfs2_file_ip_alloc_sem_key;
255+
#endif
255256

256257
inode->i_ino = args->fi_ino;
257258
OCFS2_I(inode)->ip_blkno = args->fi_blkno;
258-
if (args->fi_sysfile_type != 0)
259+
#ifdef CONFIG_LOCKDEP
260+
switch (args->fi_sysfile_type) {
261+
case BAD_BLOCK_SYSTEM_INODE:
262+
break;
263+
case GLOBAL_INODE_ALLOC_SYSTEM_INODE:
264+
lockdep_set_class(&inode->i_rwsem,
265+
&ocfs2_sysfile_lock_key[GLOBAL_INODE_ALLOC_SYSTEM_INODE]);
266+
break;
267+
case SLOT_MAP_SYSTEM_INODE:
268+
lockdep_set_class(&inode->i_rwsem,
269+
&ocfs2_sysfile_lock_key[SLOT_MAP_SYSTEM_INODE]);
270+
break;
271+
case HEARTBEAT_SYSTEM_INODE:
272+
lockdep_set_class(&inode->i_rwsem,
273+
&ocfs2_sysfile_lock_key[HEARTBEAT_SYSTEM_INODE]);
274+
break;
275+
case GLOBAL_BITMAP_SYSTEM_INODE:
276+
lockdep_set_class(&inode->i_rwsem,
277+
&ocfs2_sysfile_lock_key[GLOBAL_BITMAP_SYSTEM_INODE]);
278+
break;
279+
case USER_QUOTA_SYSTEM_INODE:
280+
lockdep_set_class(&inode->i_rwsem,
281+
&ocfs2_sysfile_lock_key[USER_QUOTA_SYSTEM_INODE]);
282+
break;
283+
case GROUP_QUOTA_SYSTEM_INODE:
284+
lockdep_set_class(&inode->i_rwsem,
285+
&ocfs2_sysfile_lock_key[GROUP_QUOTA_SYSTEM_INODE]);
286+
break;
287+
case ORPHAN_DIR_SYSTEM_INODE:
288+
lockdep_set_class(&inode->i_rwsem,
289+
&ocfs2_sysfile_lock_key[ORPHAN_DIR_SYSTEM_INODE]);
290+
break;
291+
case EXTENT_ALLOC_SYSTEM_INODE:
259292
lockdep_set_class(&inode->i_rwsem,
260-
&ocfs2_sysfile_lock_key[args->fi_sysfile_type]);
293+
&ocfs2_sysfile_lock_key[EXTENT_ALLOC_SYSTEM_INODE]);
294+
break;
295+
case INODE_ALLOC_SYSTEM_INODE:
296+
lockdep_set_class(&inode->i_rwsem,
297+
&ocfs2_sysfile_lock_key[INODE_ALLOC_SYSTEM_INODE]);
298+
break;
299+
case JOURNAL_SYSTEM_INODE:
300+
lockdep_set_class(&inode->i_rwsem,
301+
&ocfs2_sysfile_lock_key[JOURNAL_SYSTEM_INODE]);
302+
break;
303+
case LOCAL_ALLOC_SYSTEM_INODE:
304+
lockdep_set_class(&inode->i_rwsem,
305+
&ocfs2_sysfile_lock_key[LOCAL_ALLOC_SYSTEM_INODE]);
306+
break;
307+
case TRUNCATE_LOG_SYSTEM_INODE:
308+
lockdep_set_class(&inode->i_rwsem,
309+
&ocfs2_sysfile_lock_key[TRUNCATE_LOG_SYSTEM_INODE]);
310+
break;
311+
case LOCAL_USER_QUOTA_SYSTEM_INODE:
312+
lockdep_set_class(&inode->i_rwsem,
313+
&ocfs2_sysfile_lock_key[LOCAL_USER_QUOTA_SYSTEM_INODE]);
314+
break;
315+
case LOCAL_GROUP_QUOTA_SYSTEM_INODE:
316+
lockdep_set_class(&inode->i_rwsem,
317+
&ocfs2_sysfile_lock_key[LOCAL_GROUP_QUOTA_SYSTEM_INODE]);
318+
break;
319+
default:
320+
WARN_ONCE(1, "Unknown sysfile type %d\n", args->fi_sysfile_type);
321+
}
261322
if (args->fi_sysfile_type == USER_QUOTA_SYSTEM_INODE ||
262323
args->fi_sysfile_type == GROUP_QUOTA_SYSTEM_INODE ||
263324
args->fi_sysfile_type == LOCAL_USER_QUOTA_SYSTEM_INODE ||
@@ -267,6 +328,7 @@ static int ocfs2_init_locked_inode(struct inode *inode, void *opaque)
267328
else
268329
lockdep_set_class(&OCFS2_I(inode)->ip_alloc_sem,
269330
&ocfs2_file_ip_alloc_sem_key);
331+
#endif
270332

271333
return 0;
272334
}

0 commit comments

Comments
 (0)