[PATCH 13/17] jbd2: Add jbd2_jh_lock

From: Matthew Wilcox (Oracle)
Date: Thu Apr 08 2021 - 23:00:59 EST


Allow lockdep to track the journal bit spin locks.

Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>
---
fs/jbd2/journal.c | 18 ++++++++++--------
include/linux/jbd2.h | 10 ++++++----
2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 2dc944442802..9c5f4b99157b 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -2733,6 +2733,8 @@ static void journal_free_journal_head(struct journal_head *jh)
* jbd2_journal_put_journal_head(jh);
*/

+static DEFINE_SPLIT_LOCK(jbd2_jh_lock);
+
/*
* Give a buffer_head a journal_head.
*
@@ -2747,7 +2749,7 @@ struct journal_head *jbd2_journal_add_journal_head(struct buffer_head *bh)
if (!buffer_jbd(bh))
new_jh = journal_alloc_journal_head();

- jbd_lock_bh_journal_head(bh);
+ jbd_lock_bh_journal_head(bh, &jbd2_jh_lock);
if (buffer_jbd(bh)) {
jh = bh2jh(bh);
} else {
@@ -2756,7 +2758,7 @@ struct journal_head *jbd2_journal_add_journal_head(struct buffer_head *bh)
(bh->b_page && bh->b_page->mapping));

if (!new_jh) {
- jbd_unlock_bh_journal_head(bh);
+ jbd_unlock_bh_journal_head(bh, &jbd2_jh_lock);
goto repeat;
}

@@ -2769,7 +2771,7 @@ struct journal_head *jbd2_journal_add_journal_head(struct buffer_head *bh)
BUFFER_TRACE(bh, "added journal_head");
}
jh->b_jcount++;
- jbd_unlock_bh_journal_head(bh);
+ jbd_unlock_bh_journal_head(bh, &jbd2_jh_lock);
if (new_jh)
journal_free_journal_head(new_jh);
return bh->b_private;
@@ -2783,12 +2785,12 @@ struct journal_head *jbd2_journal_grab_journal_head(struct buffer_head *bh)
{
struct journal_head *jh = NULL;

- jbd_lock_bh_journal_head(bh);
+ jbd_lock_bh_journal_head(bh, &jbd2_jh_lock);
if (buffer_jbd(bh)) {
jh = bh2jh(bh);
jh->b_jcount++;
}
- jbd_unlock_bh_journal_head(bh);
+ jbd_unlock_bh_journal_head(bh, &jbd2_jh_lock);
return jh;
}

@@ -2831,16 +2833,16 @@ void jbd2_journal_put_journal_head(struct journal_head *jh)
{
struct buffer_head *bh = jh2bh(jh);

- jbd_lock_bh_journal_head(bh);
+ jbd_lock_bh_journal_head(bh, &jbd2_jh_lock);
J_ASSERT_JH(jh, jh->b_jcount > 0);
--jh->b_jcount;
if (!jh->b_jcount) {
__journal_remove_journal_head(bh);
- jbd_unlock_bh_journal_head(bh);
+ jbd_unlock_bh_journal_head(bh, &jbd2_jh_lock);
journal_release_journal_head(jh, bh->b_size);
__brelse(bh);
} else {
- jbd_unlock_bh_journal_head(bh);
+ jbd_unlock_bh_journal_head(bh, &jbd2_jh_lock);
}
}

diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
index 99d3cd051ac3..bf32cee8b1e2 100644
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -348,14 +348,16 @@ static inline struct journal_head *bh2jh(struct buffer_head *bh)
return bh->b_private;
}

-static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
+static inline void jbd_lock_bh_journal_head(struct buffer_head *bh,
+ struct split_lock *sl)
{
- bit_spin_lock(BH_JournalHead, &bh->b_state);
+ bit_spin_lock(BH_JournalHead, &bh->b_state, sl);
}

-static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
+static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh,
+ struct split_lock *sl)
{
- bit_spin_unlock(BH_JournalHead, &bh->b_state);
+ bit_spin_unlock(BH_JournalHead, &bh->b_state, sl);
}

#define J_ASSERT(assert) BUG_ON(!(assert))
--
2.30.2