Skip to content

Commit fecf136

Browse files
loemrawkdave
authored andcommitted
btrfs: add mount option for ref_tracker
The ref_tracker infrastructure aids debugging but is not enabled by default as it has a performance impact. Add mount option 'ref_tracker' so it can be selectively enabled on a filesystem. Currently it track references of 'delayed inodes'. Signed-off-by: Leo Martins <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 2b73cae commit fecf136

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

fs/btrfs/delayed-inode.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,18 +198,27 @@ void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info);
198198
#ifdef CONFIG_BTRFS_DEBUG
199199
static inline void btrfs_delayed_node_ref_tracker_dir_init(struct btrfs_delayed_node *node)
200200
{
201+
if (!btrfs_test_opt(node->root->fs_info, REF_TRACKER))
202+
return;
203+
201204
ref_tracker_dir_init(&node->ref_dir.dir,
202205
BTRFS_DELAYED_NODE_REF_TRACKER_QUARANTINE_COUNT,
203206
"delayed_node");
204207
}
205208

206209
static inline void btrfs_delayed_node_ref_tracker_dir_exit(struct btrfs_delayed_node *node)
207210
{
211+
if (!btrfs_test_opt(node->root->fs_info, REF_TRACKER))
212+
return;
213+
208214
ref_tracker_dir_exit(&node->ref_dir.dir);
209215
}
210216

211217
static inline void btrfs_delayed_node_ref_tracker_dir_print(struct btrfs_delayed_node *node)
212218
{
219+
if (!btrfs_test_opt(node->root->fs_info, REF_TRACKER))
220+
return;
221+
213222
ref_tracker_dir_print(&node->ref_dir.dir,
214223
BTRFS_DELAYED_NODE_REF_TRACKER_DISPLAY_LIMIT);
215224
}
@@ -218,12 +227,18 @@ static inline int btrfs_delayed_node_ref_tracker_alloc(struct btrfs_delayed_node
218227
struct btrfs_ref_tracker *tracker,
219228
gfp_t gfp)
220229
{
230+
if (!btrfs_test_opt(node->root->fs_info, REF_TRACKER))
231+
return 0;
232+
221233
return ref_tracker_alloc(&node->ref_dir.dir, &tracker->tracker, gfp);
222234
}
223235

224236
static inline int btrfs_delayed_node_ref_tracker_free(struct btrfs_delayed_node *node,
225237
struct btrfs_ref_tracker *tracker)
226238
{
239+
if (!btrfs_test_opt(node->root->fs_info, REF_TRACKER))
240+
return 0;
241+
227242
return ref_tracker_free(&node->ref_dir.dir, &tracker->tracker);
228243
}
229244
#else

fs/btrfs/fs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ enum {
245245
BTRFS_MOUNT_NOSPACECACHE = (1ULL << 30),
246246
BTRFS_MOUNT_IGNOREMETACSUMS = (1ULL << 31),
247247
BTRFS_MOUNT_IGNORESUPERFLAGS = (1ULL << 32),
248+
BTRFS_MOUNT_REF_TRACKER = (1ULL << 33),
248249
};
249250

250251
/*

fs/btrfs/super.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ enum {
134134
#ifdef CONFIG_BTRFS_DEBUG
135135
Opt_fragment, Opt_fragment_data, Opt_fragment_metadata, Opt_fragment_all,
136136
Opt_ref_verify,
137+
Opt_ref_tracker,
137138
#endif
138139
Opt_err,
139140
};
@@ -255,6 +256,7 @@ static const struct fs_parameter_spec btrfs_fs_parameters[] = {
255256
fsparam_flag_no("enospc_debug", Opt_enospc_debug),
256257
#ifdef CONFIG_BTRFS_DEBUG
257258
fsparam_enum("fragment", Opt_fragment, btrfs_parameter_fragment),
259+
fsparam_flag("ref_tracker", Opt_ref_tracker),
258260
fsparam_flag("ref_verify", Opt_ref_verify),
259261
#endif
260262
{}
@@ -631,6 +633,9 @@ static int btrfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
631633
case Opt_ref_verify:
632634
btrfs_set_opt(ctx->mount_opt, REF_VERIFY);
633635
break;
636+
case Opt_ref_tracker:
637+
btrfs_set_opt(ctx->mount_opt, REF_TRACKER);
638+
break;
634639
#endif
635640
default:
636641
btrfs_err(NULL, "unrecognized mount option '%s'", param->key);
@@ -1136,6 +1141,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
11361141
#endif
11371142
if (btrfs_test_opt(info, REF_VERIFY))
11381143
seq_puts(seq, ",ref_verify");
1144+
if (btrfs_test_opt(info, REF_TRACKER))
1145+
seq_puts(seq, ",ref_tracker");
11391146
seq_printf(seq, ",subvolid=%llu", btrfs_root_id(BTRFS_I(d_inode(dentry))->root));
11401147
subvol_name = btrfs_get_subvol_name_from_objectid(info,
11411148
btrfs_root_id(BTRFS_I(d_inode(dentry))->root));

0 commit comments

Comments
 (0)