summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/ctree.c10
-rw-r--r--include/trace/events/btrfs.h24
2 files changed, 32 insertions, 2 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index e8d260ecdcf6..71e7ada95477 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -2102,6 +2102,7 @@ again:
p->nodes[level + 1])) {
write_lock_level = level + 1;
btrfs_release_path(p);
+ trace_btrfs_search_slot_restart(root, level, "write_lock");
goto again;
}
@@ -2164,8 +2165,10 @@ cow_done:
p->slots[level] = slot;
ret2 = setup_nodes_for_search(trans, root, p, b, level, ins_len,
&write_lock_level);
- if (ret2 == -EAGAIN)
+ if (ret2 == -EAGAIN) {
+ trace_btrfs_search_slot_restart(root, level, "setup_nodes");
goto again;
+ }
if (ret2) {
ret = ret2;
goto done;
@@ -2181,6 +2184,7 @@ cow_done:
if (slot == 0 && ins_len && write_lock_level < level + 1) {
write_lock_level = level + 1;
btrfs_release_path(p);
+ trace_btrfs_search_slot_restart(root, level, "slot_zero");
goto again;
}
@@ -2194,8 +2198,10 @@ cow_done:
}
ret2 = read_block_for_search(root, p, &b, slot, key);
- if (ret2 == -EAGAIN && !p->nowait)
+ if (ret2 == -EAGAIN && !p->nowait) {
+ trace_btrfs_search_slot_restart(root, level, "read_block");
goto again;
+ }
if (ret2) {
ret = ret2;
goto done;
diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
index 0864700f76e0..8ad7a2d76c1d 100644
--- a/include/trace/events/btrfs.h
+++ b/include/trace/events/btrfs.h
@@ -1113,6 +1113,30 @@ TRACE_EVENT(btrfs_cow_block,
__entry->cow_level)
);
+TRACE_EVENT(btrfs_search_slot_restart,
+
+ TP_PROTO(const struct btrfs_root *root, int level,
+ const char *reason),
+
+ TP_ARGS(root, level, reason),
+
+ TP_STRUCT__entry_btrfs(
+ __field( u64, root_objectid )
+ __field( int, level )
+ __string( reason, reason )
+ ),
+
+ TP_fast_assign_btrfs(root->fs_info,
+ __entry->root_objectid = btrfs_root_id(root);
+ __entry->level = level;
+ __assign_str(reason);
+ ),
+
+ TP_printk_btrfs("root=%llu(%s) level=%d reason=%s",
+ show_root_type(__entry->root_objectid),
+ __entry->level, __get_str(reason))
+);
+
TRACE_EVENT(btrfs_space_reservation,
TP_PROTO(const struct btrfs_fs_info *fs_info, const char *type, u64 val,