Skip to content

Commit

Permalink
ext4: add transaction tid info in fc_track events
Browse files Browse the repository at this point in the history
This patch adds the transaction & inode tid info in trace events for
callers of ext4_fc_track_template(). This is helpful in debugging race
conditions where an inode could belong to two different transaction tids.
It also fixes the checkpatch warnings which says use tabs instead of
spaces.

Signed-off-by: Ritesh Harjani <riteshh@linux.ibm.com>
Link: https://lore.kernel.org/r/c203c09dc11bb372803c430f621f25a4b8c2c8b4.1647057583.git.riteshh@linux.ibm.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
  • Loading branch information
Ritesh Harjani authored and Theodore Ts'o committed Mar 15, 2022
1 parent 08f4c42 commit 1d2e244
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 50 deletions.
10 changes: 5 additions & 5 deletions fs/ext4/fast_commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ void __ext4_fc_track_unlink(handle_t *handle,

ret = ext4_fc_track_template(handle, inode, __track_dentry_update,
(void *)&args, 0);
trace_ext4_fc_track_unlink(inode, dentry, ret);
trace_ext4_fc_track_unlink(handle, inode, dentry, ret);
}

void ext4_fc_track_unlink(handle_t *handle, struct dentry *dentry)
Expand Down Expand Up @@ -516,7 +516,7 @@ void __ext4_fc_track_link(handle_t *handle,

ret = ext4_fc_track_template(handle, inode, __track_dentry_update,
(void *)&args, 0);
trace_ext4_fc_track_link(inode, dentry, ret);
trace_ext4_fc_track_link(handle, inode, dentry, ret);
}

void ext4_fc_track_link(handle_t *handle, struct dentry *dentry)
Expand Down Expand Up @@ -545,7 +545,7 @@ void __ext4_fc_track_create(handle_t *handle, struct inode *inode,

ret = ext4_fc_track_template(handle, inode, __track_dentry_update,
(void *)&args, 0);
trace_ext4_fc_track_create(inode, dentry, ret);
trace_ext4_fc_track_create(handle, inode, dentry, ret);
}

void ext4_fc_track_create(handle_t *handle, struct dentry *dentry)
Expand Down Expand Up @@ -596,7 +596,7 @@ void ext4_fc_track_inode(handle_t *handle, struct inode *inode)
return;

ret = ext4_fc_track_template(handle, inode, __track_inode, NULL, 1);
trace_ext4_fc_track_inode(inode, ret);
trace_ext4_fc_track_inode(handle, inode, ret);
}

struct __track_range_args {
Expand Down Expand Up @@ -653,7 +653,7 @@ void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t star

ret = ext4_fc_track_template(handle, inode, __track_range, &args, 1);

trace_ext4_fc_track_range(inode, start, end, ret);
trace_ext4_fc_track_range(handle, inode, start, end, ret);
}

static void ext4_fc_submit_bh(struct super_block *sb, bool is_tail)
Expand Down
113 changes: 68 additions & 45 deletions include/trace/events/ext4.h
Original file line number Diff line number Diff line change
Expand Up @@ -2782,85 +2782,108 @@ TRACE_EVENT(ext4_fc_stats,

DECLARE_EVENT_CLASS(ext4_fc_track_dentry,

TP_PROTO(struct inode *inode, struct dentry *dentry, int ret),
TP_PROTO(handle_t *handle, struct inode *inode,
struct dentry *dentry, int ret),

TP_ARGS(inode, dentry, ret),
TP_ARGS(handle, inode, dentry, ret),

TP_STRUCT__entry(
__field(dev_t, dev)
__field(tid_t, t_tid)
__field(ino_t, i_ino)
__field(tid_t, i_sync_tid)
__field(int, error)
),

TP_fast_assign(
struct ext4_inode_info *ei = EXT4_I(inode);

__entry->dev = inode->i_sb->s_dev;
__entry->t_tid = handle->h_transaction->t_tid;
__entry->i_ino = inode->i_ino;
__entry->i_sync_tid = ei->i_sync_tid;
__entry->error = ret;
),

TP_printk("dev %d,%d, ino %lu, error %d",
TP_printk("dev %d,%d, t_tid %u, ino %lu, i_sync_tid %u, error %d",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->i_ino, __entry->error
__entry->t_tid, __entry->i_ino, __entry->i_sync_tid,
__entry->error
)
);

#define DEFINE_EVENT_CLASS_DENTRY(__type) \
DEFINE_EVENT(ext4_fc_track_dentry, ext4_fc_track_##__type, \
TP_PROTO(struct inode *inode, struct dentry *dentry, int ret), \
TP_ARGS(inode, dentry, ret) \
TP_PROTO(handle_t *handle, struct inode *inode, \
struct dentry *dentry, int ret), \
TP_ARGS(handle, inode, dentry, ret) \
)

DEFINE_EVENT_CLASS_DENTRY(create);
DEFINE_EVENT_CLASS_DENTRY(link);
DEFINE_EVENT_CLASS_DENTRY(unlink);

TRACE_EVENT(ext4_fc_track_inode,
TP_PROTO(struct inode *inode, int ret),
TP_PROTO(handle_t *handle, struct inode *inode, int ret),

TP_ARGS(inode, ret),
TP_ARGS(handle, inode, ret),

TP_STRUCT__entry(
__field(dev_t, dev)
__field(int, ino)
__field(int, error)
),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(tid_t, t_tid)
__field(ino_t, i_ino)
__field(tid_t, i_sync_tid)
__field(int, error)
),

TP_fast_assign(
__entry->dev = inode->i_sb->s_dev;
__entry->ino = inode->i_ino;
__entry->error = ret;
),
TP_fast_assign(
struct ext4_inode_info *ei = EXT4_I(inode);

TP_printk("dev %d:%d, inode %d, error %d",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->error)
__entry->dev = inode->i_sb->s_dev;
__entry->t_tid = handle->h_transaction->t_tid;
__entry->i_ino = inode->i_ino;
__entry->i_sync_tid = ei->i_sync_tid;
__entry->error = ret;
),

TP_printk("dev %d:%d, t_tid %u, inode %lu, i_sync_tid %u, error %d",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->t_tid, __entry->i_ino, __entry->i_sync_tid,
__entry->error)
);

TRACE_EVENT(ext4_fc_track_range,
TP_PROTO(struct inode *inode, long start, long end, int ret),

TP_ARGS(inode, start, end, ret),

TP_STRUCT__entry(
__field(dev_t, dev)
__field(int, ino)
__field(long, start)
__field(long, end)
__field(int, error)
),

TP_fast_assign(
__entry->dev = inode->i_sb->s_dev;
__entry->ino = inode->i_ino;
__entry->start = start;
__entry->end = end;
__entry->error = ret;
),

TP_printk("dev %d:%d, inode %d, error %d, start %ld, end %ld",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->error, __entry->start,
__entry->end)
TP_PROTO(handle_t *handle, struct inode *inode,
long start, long end, int ret),

TP_ARGS(handle, inode, start, end, ret),

TP_STRUCT__entry(
__field(dev_t, dev)
__field(tid_t, t_tid)
__field(ino_t, i_ino)
__field(tid_t, i_sync_tid)
__field(long, start)
__field(long, end)
__field(int, error)
),

TP_fast_assign(
struct ext4_inode_info *ei = EXT4_I(inode);

__entry->dev = inode->i_sb->s_dev;
__entry->t_tid = handle->h_transaction->t_tid;
__entry->i_ino = inode->i_ino;
__entry->i_sync_tid = ei->i_sync_tid;
__entry->start = start;
__entry->end = end;
__entry->error = ret;
),

TP_printk("dev %d:%d, t_tid %u, inode %lu, i_sync_tid %u, error %d, start %ld, end %ld",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->t_tid, __entry->i_ino, __entry->i_sync_tid,
__entry->error, __entry->start, __entry->end)
);

TRACE_EVENT(ext4_fc_cleanup,
Expand Down

0 comments on commit 1d2e244

Please sign in to comment.