Commit bc1d69d6 authored by Konstantin Khlebnikov's avatar Konstantin Khlebnikov Committed by Theodore Ts'o

ext4: add sysfs attr /sys/fs/ext4/<disk>/journal_task

This is useful for moving journal thread into cgroup or
for tracing it with ftrace/perf/blktrace.

For now the only way is `pgrep jbd2/$DISK` but this is not reliable:
name may be longer than "comm" limit and any task could mock it.

Attribute shows pid in current pid-namespace or 0 if task is unreachable.
Signed-off-by: default avatarKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 231fe82b
...@@ -109,3 +109,10 @@ Description: ...@@ -109,3 +109,10 @@ Description:
write operation (since a 4k random write might turn write operation (since a 4k random write might turn
into a much larger write due to the zeroout into a much larger write due to the zeroout
operation). operation).
What: /sys/fs/ext4/<disk>/journal_task
Date: February 2019
Contact: "Theodore Ts'o" <tytso@mit.edu>
Description:
This file is read-only and shows the pid of journal thread in
current pid-namespace or 0 if task is unreachable.
...@@ -30,6 +30,7 @@ typedef enum { ...@@ -30,6 +30,7 @@ typedef enum {
attr_feature, attr_feature,
attr_pointer_ui, attr_pointer_ui,
attr_pointer_atomic, attr_pointer_atomic,
attr_journal_task,
} attr_id_t; } attr_id_t;
typedef enum { typedef enum {
...@@ -125,6 +126,14 @@ static ssize_t trigger_test_error(struct ext4_sb_info *sbi, ...@@ -125,6 +126,14 @@ static ssize_t trigger_test_error(struct ext4_sb_info *sbi,
return count; return count;
} }
static ssize_t journal_task_show(struct ext4_sb_info *sbi, char *buf)
{
if (!sbi->s_journal)
return snprintf(buf, PAGE_SIZE, "<none>\n");
return snprintf(buf, PAGE_SIZE, "%d\n",
task_pid_vnr(sbi->s_journal->j_task));
}
#define EXT4_ATTR(_name,_mode,_id) \ #define EXT4_ATTR(_name,_mode,_id) \
static struct ext4_attr ext4_attr_##_name = { \ static struct ext4_attr ext4_attr_##_name = { \
.attr = {.name = __stringify(_name), .mode = _mode }, \ .attr = {.name = __stringify(_name), .mode = _mode }, \
...@@ -188,6 +197,7 @@ EXT4_RW_ATTR_SBI_UI(msg_ratelimit_burst, s_msg_ratelimit_state.burst); ...@@ -188,6 +197,7 @@ EXT4_RW_ATTR_SBI_UI(msg_ratelimit_burst, s_msg_ratelimit_state.burst);
EXT4_RO_ATTR_ES_UI(errors_count, s_error_count); EXT4_RO_ATTR_ES_UI(errors_count, s_error_count);
EXT4_ATTR(first_error_time, 0444, first_error_time); EXT4_ATTR(first_error_time, 0444, first_error_time);
EXT4_ATTR(last_error_time, 0444, last_error_time); EXT4_ATTR(last_error_time, 0444, last_error_time);
EXT4_ATTR(journal_task, 0444, journal_task);
static unsigned int old_bump_val = 128; static unsigned int old_bump_val = 128;
EXT4_ATTR_PTR(max_writeback_mb_bump, 0444, pointer_ui, &old_bump_val); EXT4_ATTR_PTR(max_writeback_mb_bump, 0444, pointer_ui, &old_bump_val);
...@@ -217,6 +227,7 @@ static struct attribute *ext4_attrs[] = { ...@@ -217,6 +227,7 @@ static struct attribute *ext4_attrs[] = {
ATTR_LIST(errors_count), ATTR_LIST(errors_count),
ATTR_LIST(first_error_time), ATTR_LIST(first_error_time),
ATTR_LIST(last_error_time), ATTR_LIST(last_error_time),
ATTR_LIST(journal_task),
NULL, NULL,
}; };
...@@ -304,6 +315,8 @@ static ssize_t ext4_attr_show(struct kobject *kobj, ...@@ -304,6 +315,8 @@ static ssize_t ext4_attr_show(struct kobject *kobj,
return print_tstamp(buf, sbi->s_es, s_first_error_time); return print_tstamp(buf, sbi->s_es, s_first_error_time);
case attr_last_error_time: case attr_last_error_time:
return print_tstamp(buf, sbi->s_es, s_last_error_time); return print_tstamp(buf, sbi->s_es, s_last_error_time);
case attr_journal_task:
return journal_task_show(sbi, buf);
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment