ext4: add sysfs attr /sys/fs/ext4/<disk>/journal_task
authorKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Thu, 21 Feb 2019 16:49:27 +0000 (11:49 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 21 Feb 2019 16:49:27 +0000 (11:49 -0500)
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: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Documentation/ABI/testing/sysfs-fs-ext4
fs/ext4/sysfs.c

index c631253..78604db 100644 (file)
@@ -109,3 +109,10 @@ Description:
                write operation (since a 4k random write might turn
                into a much larger write due to the zeroout
                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.
index 9212a02..1748e63 100644 (file)
@@ -30,6 +30,7 @@ typedef enum {
        attr_feature,
        attr_pointer_ui,
        attr_pointer_atomic,
+       attr_journal_task,
 } attr_id_t;
 
 typedef enum {
@@ -125,6 +126,14 @@ static ssize_t trigger_test_error(struct ext4_sb_info *sbi,
        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)                                     \
 static struct ext4_attr ext4_attr_##_name = {                          \
        .attr = {.name = __stringify(_name), .mode = _mode },           \
@@ -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_ATTR(first_error_time, 0444, first_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;
 EXT4_ATTR_PTR(max_writeback_mb_bump, 0444, pointer_ui, &old_bump_val);
@@ -217,6 +227,7 @@ static struct attribute *ext4_attrs[] = {
        ATTR_LIST(errors_count),
        ATTR_LIST(first_error_time),
        ATTR_LIST(last_error_time),
+       ATTR_LIST(journal_task),
        NULL,
 };
 
@@ -304,6 +315,8 @@ static ssize_t ext4_attr_show(struct kobject *kobj,
                return print_tstamp(buf, sbi->s_es, s_first_error_time);
        case attr_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;