Skip to content

Commit

Permalink
jbd2: move lockdep tracking to journal_s
Browse files Browse the repository at this point in the history
Currently lockdep map is tracked in each journal handle. To be able to
expand lockdep support to cover also other cases where we depend on
transaction commit and where handle is not available, move lockdep map
into struct journal_s. Since this makes the lockdep map shared for all
handles, we have to use rwsem_acquire_read() for acquisitions now.

Signed-off-by: Jan Kara <[email protected]>
Signed-off-by: Theodore Ts'o <[email protected]>
  • Loading branch information
jankara authored and tytso committed Jun 30, 2016
1 parent 7a4b188 commit ab714af
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
4 changes: 4 additions & 0 deletions fs/jbd2/journal.c
Original file line number Diff line number Diff line change
Expand Up @@ -1091,6 +1091,7 @@ static void jbd2_stats_proc_exit(journal_t *journal)

static journal_t * journal_init_common (void)
{
static struct lock_class_key jbd2_trans_commit_key;
journal_t *journal;
int err;

Expand Down Expand Up @@ -1126,6 +1127,9 @@ static journal_t * journal_init_common (void)

spin_lock_init(&journal->j_history_lock);

lockdep_init_map(&journal->j_trans_commit_map, "jbd2_handle",
&jbd2_trans_commit_key, 0);

return journal;
}

Expand Down
11 changes: 3 additions & 8 deletions fs/jbd2/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,13 +382,11 @@ static int start_this_handle(journal_t *journal, handle_t *handle,
read_unlock(&journal->j_state_lock);
current->journal_info = handle;

lock_map_acquire(&handle->h_lockdep_map);
rwsem_acquire_read(&journal->j_trans_commit_map, 0, 0, _THIS_IP_);
jbd2_journal_free_transaction(new_transaction);
return 0;
}

static struct lock_class_key jbd2_handle_key;

/* Allocate a new handle. This should probably be in a slab... */
static handle_t *new_handle(int nblocks)
{
Expand All @@ -398,9 +396,6 @@ static handle_t *new_handle(int nblocks)
handle->h_buffer_credits = nblocks;
handle->h_ref = 1;

lockdep_init_map(&handle->h_lockdep_map, "jbd2_handle",
&jbd2_handle_key, 0);

return handle;
}

Expand Down Expand Up @@ -672,7 +667,7 @@ int jbd2__journal_restart(handle_t *handle, int nblocks, gfp_t gfp_mask)
if (need_to_start)
jbd2_log_start_commit(journal, tid);

lock_map_release(&handle->h_lockdep_map);
rwsem_release(&journal->j_trans_commit_map, 1, _THIS_IP_);
handle->h_buffer_credits = nblocks;
ret = start_this_handle(journal, handle, gfp_mask);
return ret;
Expand Down Expand Up @@ -1750,7 +1745,7 @@ int jbd2_journal_stop(handle_t *handle)
wake_up(&journal->j_wait_transaction_locked);
}

lock_map_release(&handle->h_lockdep_map);
rwsem_release(&journal->j_trans_commit_map, 1, _THIS_IP_);

if (wait_for_commit)
err = jbd2_log_wait_commit(journal, tid);
Expand Down
17 changes: 13 additions & 4 deletions include/linux/jbd2.h
Original file line number Diff line number Diff line change
Expand Up @@ -491,10 +491,6 @@ struct jbd2_journal_handle

unsigned long h_start_jiffies;
unsigned int h_requested_credits;

#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map h_lockdep_map;
#endif
};


Expand Down Expand Up @@ -793,6 +789,7 @@ jbd2_time_diff(unsigned long start, unsigned long end)
* @j_proc_entry: procfs entry for the jbd statistics directory
* @j_stats: Overall statistics
* @j_private: An opaque pointer to fs-private information.
* @j_trans_commit_map: Lockdep entity to track transaction commit dependencies
*/

struct journal_s
Expand Down Expand Up @@ -1035,6 +1032,18 @@ struct journal_s

/* Precomputed journal UUID checksum for seeding other checksums */
__u32 j_csum_seed;

#ifdef CONFIG_DEBUG_LOCK_ALLOC
/*
* Lockdep entity to track transaction commit dependencies. Handles
* hold this "lock" for read, when we wait for commit, we acquire the
* "lock" for writing. This matches the properties of jbd2 journalling
* where the running transaction has to wait for all handles to be
* dropped to commit that transaction and also acquiring a handle may
* require transaction commit to finish.
*/
struct lockdep_map j_trans_commit_map;
#endif
};

/* journal feature predicate functions */
Expand Down

0 comments on commit ab714af

Please sign in to comment.