ext4: pass context information to jbd2__journal_start()
So we can better understand what bits of ext4 are responsible for long-running jbd2 handles, use jbd2__journal_start() so we can pass context information for logging purposes. The recommended way for finding the longer-running handles is: T=/sys/kernel/debug/tracing EVENT=$T/events/jbd2/jbd2_handle_stats echo "interval > 5" > $EVENT/filter echo 1 > $EVENT/enable ./run-my-fs-benchmark cat $T/trace > /tmp/problem-handles This will list handles that were active for longer than 20ms. Having longer-running handles is bad, because a commit started at the wrong time could stall for those 20+ milliseconds, which could delay an fsync() or an O_SYNC operation. Here is an example line from the trace file describing a handle which lived on for 311 jiffies, or over 1.2 seconds: postmark-2917 [000] .... 196.435786: jbd2_handle_stats: dev 254,32 tid 570 type 2 line_no 2541 interval 311 sync 0 requested_blocks 1 dirtied_blocks 0 Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
@@ -545,7 +545,7 @@ static int ext4_convert_inline_data_to_extent(struct address_space *mapping,
|
||||
return ret;
|
||||
|
||||
retry:
|
||||
handle = ext4_journal_start(inode, needed_blocks);
|
||||
handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks);
|
||||
if (IS_ERR(handle)) {
|
||||
ret = PTR_ERR(handle);
|
||||
handle = NULL;
|
||||
@@ -657,7 +657,7 @@ int ext4_try_to_write_inline_data(struct address_space *mapping,
|
||||
* The possible write could happen in the inode,
|
||||
* so try to reserve the space in inode first.
|
||||
*/
|
||||
handle = ext4_journal_start(inode, 1);
|
||||
handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
|
||||
if (IS_ERR(handle)) {
|
||||
ret = PTR_ERR(handle);
|
||||
handle = NULL;
|
||||
@@ -853,7 +853,7 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
handle = ext4_journal_start(inode, 1);
|
||||
handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
|
||||
if (IS_ERR(handle)) {
|
||||
ret = PTR_ERR(handle);
|
||||
handle = NULL;
|
||||
@@ -1770,7 +1770,7 @@ void ext4_inline_data_truncate(struct inode *inode, int *has_inline)
|
||||
|
||||
|
||||
needed_blocks = ext4_writepage_trans_blocks(inode);
|
||||
handle = ext4_journal_start(inode, needed_blocks);
|
||||
handle = ext4_journal_start(inode, EXT4_HT_INODE, needed_blocks);
|
||||
if (IS_ERR(handle))
|
||||
return;
|
||||
|
||||
@@ -1862,7 +1862,7 @@ int ext4_convert_inline_data(struct inode *inode)
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
handle = ext4_journal_start(inode, needed_blocks);
|
||||
handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks);
|
||||
if (IS_ERR(handle)) {
|
||||
error = PTR_ERR(handle);
|
||||
goto out_free;
|
||||
|
Reference in New Issue
Block a user