mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
f2fs: Restore rwsem lockdep support
Lockdep uses lock class keys in its analysis. init_rwsem() instantiates one lock class key with each init_rwsem() user as follows: #define init_rwsem(sem) \ do { \ static struct lock_class_key __key; \ \ __init_rwsem((sem), #sem, &__key); \ } while (0) Commite4544b63a7
("f2fs: move f2fs to use reader-unfair rwsems") reduced the number of lock class keys from one per init_rwsem() user to one per file in which init_f2fs_rwsem() is used. This causes the same lock class key to be associated with multiple f2fs rwsems and also triggers a number of false positive lockdep deadlock reports. Fix this by again instantiating one lock class key with each init_f2fs_rwsem() caller. Cc: Tim Murray <timmurray@google.com> Reported-by: syzbot+0b9cadf5fc45a98a5083@syzkaller.appspotmail.com Fixes:e4544b63a7
("f2fs: move f2fs to use reader-unfair rwsems") Signed-off-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
2fef99b837
commit
c7f91bd410
@ -2115,9 +2115,17 @@ static inline void clear_ckpt_flags(struct f2fs_sb_info *sbi, unsigned int f)
|
||||
spin_unlock_irqrestore(&sbi->cp_lock, flags);
|
||||
}
|
||||
|
||||
static inline void init_f2fs_rwsem(struct f2fs_rwsem *sem)
|
||||
#define init_f2fs_rwsem(sem) \
|
||||
do { \
|
||||
static struct lock_class_key __key; \
|
||||
\
|
||||
__init_f2fs_rwsem((sem), #sem, &__key); \
|
||||
} while (0)
|
||||
|
||||
static inline void __init_f2fs_rwsem(struct f2fs_rwsem *sem,
|
||||
const char *sem_name, struct lock_class_key *key)
|
||||
{
|
||||
init_rwsem(&sem->internal_rwsem);
|
||||
__init_rwsem(&sem->internal_rwsem, sem_name, key);
|
||||
init_waitqueue_head(&sem->read_waiters);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user