mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
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: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
231fe82b56
commit
bc1d69d615
2 changed files with 20 additions and 0 deletions
|
@ -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 {
|
||||||
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,
|
||||||
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);
|
||||||
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[] = {
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue