reiserfs: Warn on lock relax if taken recursively
When we relax the reiserfs lock to avoid creating unwanted dependencies against others locks while grabbing these, we want to ensure it has not been taken recursively, otherwise the lock won't be really relaxed. Only its depth will be decreased. The unwanted dependency would then actually happen. To prevent from that, add a reiserfs_lock_check_recursive() call in the places that need it. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Alexander Beregalov <a.beregalov@gmail.com> Cc: Chris Mason <chris.mason@oracle.com> Cc: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
0719d34347
commit
c4a62ca362
2 changed files with 18 additions and 0 deletions
|
@ -86,3 +86,12 @@ void reiserfs_check_lock_depth(struct super_block *sb, char *caller)
|
|||
reiserfs_panic(sb, "%s called without kernel lock held %d",
|
||||
caller);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_REISERFS_CHECK
|
||||
void reiserfs_lock_check_recursive(struct super_block *sb)
|
||||
{
|
||||
struct reiserfs_sb_info *sb_i = REISERFS_SB(sb);
|
||||
|
||||
WARN_ONCE((sb_i->lock_depth > 0), "Unwanted recursive reiserfs lock!\n");
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -62,6 +62,12 @@ void reiserfs_write_unlock(struct super_block *s);
|
|||
int reiserfs_write_lock_once(struct super_block *s);
|
||||
void reiserfs_write_unlock_once(struct super_block *s, int lock_depth);
|
||||
|
||||
#ifdef CONFIG_REISERFS_CHECK
|
||||
void reiserfs_lock_check_recursive(struct super_block *s);
|
||||
#else
|
||||
static inline void reiserfs_lock_check_recursive(struct super_block *s) { }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Several mutexes depend on the write lock.
|
||||
* However sometimes we want to relax the write lock while we hold
|
||||
|
@ -92,6 +98,7 @@ void reiserfs_write_unlock_once(struct super_block *s, int lock_depth);
|
|||
static inline void reiserfs_mutex_lock_safe(struct mutex *m,
|
||||
struct super_block *s)
|
||||
{
|
||||
reiserfs_lock_check_recursive(s);
|
||||
reiserfs_write_unlock(s);
|
||||
mutex_lock(m);
|
||||
reiserfs_write_lock(s);
|
||||
|
@ -101,6 +108,7 @@ static inline void
|
|||
reiserfs_mutex_lock_nested_safe(struct mutex *m, unsigned int subclass,
|
||||
struct super_block *s)
|
||||
{
|
||||
reiserfs_lock_check_recursive(s);
|
||||
reiserfs_write_unlock(s);
|
||||
mutex_lock_nested(m, subclass);
|
||||
reiserfs_write_lock(s);
|
||||
|
@ -109,6 +117,7 @@ reiserfs_mutex_lock_nested_safe(struct mutex *m, unsigned int subclass,
|
|||
static inline void
|
||||
reiserfs_down_read_safe(struct rw_semaphore *sem, struct super_block *s)
|
||||
{
|
||||
reiserfs_lock_check_recursive(s);
|
||||
reiserfs_write_unlock(s);
|
||||
down_read(sem);
|
||||
reiserfs_write_lock(s);
|
||||
|
|
Loading…
Reference in a new issue