VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
b24413180f560 (Greg Kroah-Hartman    2017-11-01 15:07:57 +0100   1) // SPDX-License-Identifier: GPL-2.0
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   2) /*
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   3)  *  linux/fs/ext4/sysfs.c
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   4)  *
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   5)  * Copyright (C) 1992, 1993, 1994, 1995
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   6)  * Remy Card (card@masi.ibp.fr)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   7)  * Theodore Ts'o (tytso@mit.edu)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   8)  *
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400   9)  */
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  10) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  11) #include <linux/time.h>
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  12) #include <linux/fs.h>
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  13) #include <linux/seq_file.h>
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500  14) #include <linux/slab.h>
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  15) #include <linux/proc_fs.h>
c6a564ffadc91 (Christoph Hellwig     2020-03-25 16:48:42 +0100  16) #include <linux/part_stat.h>
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  17) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  18) #include "ext4.h"
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  19) #include "ext4_jbd2.h"
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  20) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  21) typedef enum {
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  22) 	attr_noop,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  23) 	attr_delayed_allocation_blocks,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  24) 	attr_session_write_kbytes,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  25) 	attr_lifetime_write_kbytes,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  26) 	attr_reserved_clusters,
efc61345274d6 (Eric Whitney          2021-02-18 10:11:32 -0500  27) 	attr_sra_exceeded_retry_limit,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  28) 	attr_inode_readahead,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  29) 	attr_trigger_test_error,
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400  30) 	attr_first_error_time,
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400  31) 	attr_last_error_time,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  32) 	attr_feature,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  33) 	attr_pointer_ui,
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500  34) 	attr_pointer_ul,
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500  35) 	attr_pointer_u64,
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500  36) 	attr_pointer_u8,
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500  37) 	attr_pointer_string,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  38) 	attr_pointer_atomic,
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500  39) 	attr_journal_task,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  40) } attr_id_t;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  41) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  42) typedef enum {
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  43) 	ptr_explicit,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  44) 	ptr_ext4_sb_info_offset,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  45) 	ptr_ext4_super_block_offset,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  46) } attr_ptr_t;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  47) 
d60061867303a (Eric Biggers          2017-04-29 23:47:50 -0400  48) static const char proc_dirname[] = "fs/ext4";
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400  49) static struct proc_dir_entry *ext4_proc_root;
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400  50) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  51) struct ext4_attr {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  52) 	struct attribute attr;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  53) 	short attr_id;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  54) 	short attr_ptr;
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500  55) 	unsigned short attr_size;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  56) 	union {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  57) 		int offset;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400  58) 		void *explicit_ptr;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  59) 	} u;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  60) };
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  61) 
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400  62) static ssize_t session_write_kbytes_show(struct ext4_sb_info *sbi, char *buf)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  63) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  64) 	struct super_block *sb = sbi->s_buddy_cache->i_sb;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  65) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  66) 	return snprintf(buf, PAGE_SIZE, "%lu\n",
8446fe9255be8 (Christoph Hellwig     2020-11-24 09:36:54 +0100  67) 			(part_stat_read(sb->s_bdev, sectors[STAT_WRITE]) -
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  68) 			 sbi->s_sectors_written_start) >> 1);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  69) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  70) 
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400  71) static ssize_t lifetime_write_kbytes_show(struct ext4_sb_info *sbi, char *buf)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  72) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  73) 	struct super_block *sb = sbi->s_buddy_cache->i_sb;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  74) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  75) 	return snprintf(buf, PAGE_SIZE, "%llu\n",
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  76) 			(unsigned long long)(sbi->s_kbytes_written +
8446fe9255be8 (Christoph Hellwig     2020-11-24 09:36:54 +0100  77) 			((part_stat_read(sb->s_bdev, sectors[STAT_WRITE]) -
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  78) 			  EXT4_SB(sb)->s_sectors_written_start) >> 1)));
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  79) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  80) 
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400  81) static ssize_t inode_readahead_blks_store(struct ext4_sb_info *sbi,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  82) 					  const char *buf, size_t count)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  83) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  84) 	unsigned long t;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  85) 	int ret;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  86) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  87) 	ret = kstrtoul(skip_spaces(buf), 0, &t);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  88) 	if (ret)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  89) 		return ret;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  90) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  91) 	if (t && (!is_power_of_2(t) || t > 0x40000000))
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  92) 		return -EINVAL;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  93) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  94) 	sbi->s_inode_readahead_blks = t;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  95) 	return count;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  96) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  97) 
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400  98) static ssize_t reserved_clusters_store(struct ext4_sb_info *sbi,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400  99) 				   const char *buf, size_t count)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 100) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 101) 	unsigned long long val;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 102) 	ext4_fsblk_t clusters = (ext4_blocks_count(sbi->s_es) >>
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 103) 				 sbi->s_cluster_bits);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 104) 	int ret;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 105) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 106) 	ret = kstrtoull(skip_spaces(buf), 0, &val);
1ea1516fbbab2 (Chao Yu               2017-06-23 01:08:22 -0400 107) 	if (ret || val >= clusters)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 108) 		return -EINVAL;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 109) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 110) 	atomic64_set(&sbi->s_resv_clusters, val);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 111) 	return count;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 112) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 113) 
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400 114) static ssize_t trigger_test_error(struct ext4_sb_info *sbi,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 115) 				  const char *buf, size_t count)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 116) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 117) 	int len = count;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 118) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 119) 	if (!capable(CAP_SYS_ADMIN))
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 120) 		return -EPERM;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 121) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 122) 	if (len && buf[len-1] == '\n')
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 123) 		len--;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 124) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 125) 	if (len)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 126) 		ext4_error(sbi->s_sb, "%.*s", len, buf);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 127) 	return count;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 128) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 129) 
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 130) static ssize_t journal_task_show(struct ext4_sb_info *sbi, char *buf)
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 131) {
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 132) 	if (!sbi->s_journal)
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 133) 		return snprintf(buf, PAGE_SIZE, "<none>\n");
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 134) 	return snprintf(buf, PAGE_SIZE, "%d\n",
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 135) 			task_pid_vnr(sbi->s_journal->j_task));
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 136) }
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 137) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 138) #define EXT4_ATTR(_name,_mode,_id)					\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 139) static struct ext4_attr ext4_attr_##_name = {				\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 140) 	.attr = {.name = __stringify(_name), .mode = _mode },		\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 141) 	.attr_id = attr_##_id,						\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 142) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 143) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 144) #define EXT4_ATTR_FUNC(_name,_mode)  EXT4_ATTR(_name,_mode,_name)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 145) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 146) #define EXT4_ATTR_FEATURE(_name)   EXT4_ATTR(_name, 0444, feature)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 147) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 148) #define EXT4_ATTR_OFFSET(_name,_mode,_id,_struct,_elname)	\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 149) static struct ext4_attr ext4_attr_##_name = {			\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 150) 	.attr = {.name = __stringify(_name), .mode = _mode },	\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 151) 	.attr_id = attr_##_id,					\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 152) 	.attr_ptr = ptr_##_struct##_offset,			\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 153) 	.u = {							\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 154) 		.offset = offsetof(struct _struct, _elname),\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 155) 	},							\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 156) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 157) 
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 158) #define EXT4_ATTR_STRING(_name,_mode,_size,_struct,_elname)	\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 159) static struct ext4_attr ext4_attr_##_name = {			\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 160) 	.attr = {.name = __stringify(_name), .mode = _mode },	\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 161) 	.attr_id = attr_pointer_string,				\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 162) 	.attr_size = _size,					\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 163) 	.attr_ptr = ptr_##_struct##_offset,			\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 164) 	.u = {							\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 165) 		.offset = offsetof(struct _struct, _elname),\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 166) 	},							\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 167) }
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 168) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 169) #define EXT4_RO_ATTR_ES_UI(_name,_elname)				\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 170) 	EXT4_ATTR_OFFSET(_name, 0444, pointer_ui, ext4_super_block, _elname)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 171) 
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 172) #define EXT4_RO_ATTR_ES_U8(_name,_elname)				\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 173) 	EXT4_ATTR_OFFSET(_name, 0444, pointer_u8, ext4_super_block, _elname)
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 174) 
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 175) #define EXT4_RO_ATTR_ES_U64(_name,_elname)				\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 176) 	EXT4_ATTR_OFFSET(_name, 0444, pointer_u64, ext4_super_block, _elname)
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 177) 
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 178) #define EXT4_RO_ATTR_ES_STRING(_name,_elname,_size)			\
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 179) 	EXT4_ATTR_STRING(_name, 0444, _size, ext4_super_block, _elname)
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 180) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 181) #define EXT4_RW_ATTR_SBI_UI(_name,_elname)	\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 182) 	EXT4_ATTR_OFFSET(_name, 0644, pointer_ui, ext4_sb_info, _elname)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 183) 
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 184) #define EXT4_RW_ATTR_SBI_UL(_name,_elname)	\
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 185) 	EXT4_ATTR_OFFSET(_name, 0644, pointer_ul, ext4_sb_info, _elname)
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 186) 
1cf006ed19a88 (Dmitry Monakhov       2020-07-25 12:33:13 +0000 187) #define EXT4_RO_ATTR_SBI_ATOMIC(_name,_elname)	\
1cf006ed19a88 (Dmitry Monakhov       2020-07-25 12:33:13 +0000 188) 	EXT4_ATTR_OFFSET(_name, 0444, pointer_atomic, ext4_sb_info, _elname)
1cf006ed19a88 (Dmitry Monakhov       2020-07-25 12:33:13 +0000 189) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 190) #define EXT4_ATTR_PTR(_name,_mode,_id,_ptr) \
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 191) static struct ext4_attr ext4_attr_##_name = {			\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 192) 	.attr = {.name = __stringify(_name), .mode = _mode },	\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 193) 	.attr_id = attr_##_id,					\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 194) 	.attr_ptr = ptr_explicit,				\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 195) 	.u = {							\
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 196) 		.explicit_ptr = _ptr,				\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 197) 	},							\
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 198) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 199) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 200) #define ATTR_LIST(name) &ext4_attr_##name.attr
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 201) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 202) EXT4_ATTR_FUNC(delayed_allocation_blocks, 0444);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 203) EXT4_ATTR_FUNC(session_write_kbytes, 0444);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 204) EXT4_ATTR_FUNC(lifetime_write_kbytes, 0444);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 205) EXT4_ATTR_FUNC(reserved_clusters, 0644);
efc61345274d6 (Eric Whitney          2021-02-18 10:11:32 -0500 206) EXT4_ATTR_FUNC(sra_exceeded_retry_limit, 0444);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 207) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 208) EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, inode_readahead,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 209) 		 ext4_sb_info, s_inode_readahead_blks);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 210) EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 211) EXT4_RW_ATTR_SBI_UI(mb_stats, s_mb_stats);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 212) EXT4_RW_ATTR_SBI_UI(mb_max_to_scan, s_mb_max_to_scan);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 213) EXT4_RW_ATTR_SBI_UI(mb_min_to_scan, s_mb_min_to_scan);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 214) EXT4_RW_ATTR_SBI_UI(mb_order2_req, s_mb_order2_reqs);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 215) EXT4_RW_ATTR_SBI_UI(mb_stream_req, s_mb_stream_request);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 216) EXT4_RW_ATTR_SBI_UI(mb_group_prealloc, s_mb_group_prealloc);
27bc446e2def3 (brookxu               2020-08-17 15:36:15 +0800 217) EXT4_RW_ATTR_SBI_UI(mb_max_inode_prealloc, s_mb_max_inode_prealloc);
196e402adf2e4 (Harshad Shirwadkar    2021-04-01 10:21:27 -0700 218) EXT4_RW_ATTR_SBI_UI(mb_max_linear_groups, s_mb_max_linear_groups);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 219) EXT4_RW_ATTR_SBI_UI(extent_max_zeroout_kb, s_extent_max_zeroout_kb);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 220) EXT4_ATTR(trigger_fs_error, 0200, trigger_test_error);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 221) EXT4_RW_ATTR_SBI_UI(err_ratelimit_interval_ms, s_err_ratelimit_state.interval);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 222) EXT4_RW_ATTR_SBI_UI(err_ratelimit_burst, s_err_ratelimit_state.burst);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 223) EXT4_RW_ATTR_SBI_UI(warning_ratelimit_interval_ms, s_warning_ratelimit_state.interval);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 224) EXT4_RW_ATTR_SBI_UI(warning_ratelimit_burst, s_warning_ratelimit_state.burst);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 225) EXT4_RW_ATTR_SBI_UI(msg_ratelimit_interval_ms, s_msg_ratelimit_state.interval);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 226) EXT4_RW_ATTR_SBI_UI(msg_ratelimit_burst, s_msg_ratelimit_state.burst);
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 227) #ifdef CONFIG_EXT4_DEBUG
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 228) EXT4_RW_ATTR_SBI_UL(simulate_fail, s_simulate_fail);
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 229) #endif
1cf006ed19a88 (Dmitry Monakhov       2020-07-25 12:33:13 +0000 230) EXT4_RO_ATTR_SBI_ATOMIC(warning_count, s_warning_count);
1cf006ed19a88 (Dmitry Monakhov       2020-07-25 12:33:13 +0000 231) EXT4_RO_ATTR_SBI_ATOMIC(msg_count, s_msg_count);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 232) EXT4_RO_ATTR_ES_UI(errors_count, s_error_count);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 233) EXT4_RO_ATTR_ES_U8(first_error_errcode, s_first_error_errcode);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 234) EXT4_RO_ATTR_ES_U8(last_error_errcode, s_last_error_errcode);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 235) EXT4_RO_ATTR_ES_UI(first_error_ino, s_first_error_ino);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 236) EXT4_RO_ATTR_ES_UI(last_error_ino, s_last_error_ino);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 237) EXT4_RO_ATTR_ES_U64(first_error_block, s_first_error_block);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 238) EXT4_RO_ATTR_ES_U64(last_error_block, s_last_error_block);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 239) EXT4_RO_ATTR_ES_UI(first_error_line, s_first_error_line);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 240) EXT4_RO_ATTR_ES_UI(last_error_line, s_last_error_line);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 241) EXT4_RO_ATTR_ES_STRING(first_error_func, s_first_error_func, 32);
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 242) EXT4_RO_ATTR_ES_STRING(last_error_func, s_last_error_func, 32);
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 243) EXT4_ATTR(first_error_time, 0444, first_error_time);
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 244) EXT4_ATTR(last_error_time, 0444, last_error_time);
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 245) EXT4_ATTR(journal_task, 0444, journal_task);
cfd7323772213 (Alex Zhuravlev        2020-04-21 10:54:07 +0300 246) EXT4_RW_ATTR_SBI_UI(mb_prefetch, s_mb_prefetch);
cfd7323772213 (Alex Zhuravlev        2020-04-21 10:54:07 +0300 247) EXT4_RW_ATTR_SBI_UI(mb_prefetch_limit, s_mb_prefetch_limit);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 248) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 249) static unsigned int old_bump_val = 128;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 250) EXT4_ATTR_PTR(max_writeback_mb_bump, 0444, pointer_ui, &old_bump_val);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 251) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 252) static struct attribute *ext4_attrs[] = {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 253) 	ATTR_LIST(delayed_allocation_blocks),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 254) 	ATTR_LIST(session_write_kbytes),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 255) 	ATTR_LIST(lifetime_write_kbytes),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 256) 	ATTR_LIST(reserved_clusters),
efc61345274d6 (Eric Whitney          2021-02-18 10:11:32 -0500 257) 	ATTR_LIST(sra_exceeded_retry_limit),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 258) 	ATTR_LIST(inode_readahead_blks),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 259) 	ATTR_LIST(inode_goal),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 260) 	ATTR_LIST(mb_stats),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 261) 	ATTR_LIST(mb_max_to_scan),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 262) 	ATTR_LIST(mb_min_to_scan),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 263) 	ATTR_LIST(mb_order2_req),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 264) 	ATTR_LIST(mb_stream_req),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 265) 	ATTR_LIST(mb_group_prealloc),
27bc446e2def3 (brookxu               2020-08-17 15:36:15 +0800 266) 	ATTR_LIST(mb_max_inode_prealloc),
196e402adf2e4 (Harshad Shirwadkar    2021-04-01 10:21:27 -0700 267) 	ATTR_LIST(mb_max_linear_groups),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 268) 	ATTR_LIST(max_writeback_mb_bump),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 269) 	ATTR_LIST(extent_max_zeroout_kb),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 270) 	ATTR_LIST(trigger_fs_error),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 271) 	ATTR_LIST(err_ratelimit_interval_ms),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 272) 	ATTR_LIST(err_ratelimit_burst),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 273) 	ATTR_LIST(warning_ratelimit_interval_ms),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 274) 	ATTR_LIST(warning_ratelimit_burst),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 275) 	ATTR_LIST(msg_ratelimit_interval_ms),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 276) 	ATTR_LIST(msg_ratelimit_burst),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 277) 	ATTR_LIST(errors_count),
1cf006ed19a88 (Dmitry Monakhov       2020-07-25 12:33:13 +0000 278) 	ATTR_LIST(warning_count),
1cf006ed19a88 (Dmitry Monakhov       2020-07-25 12:33:13 +0000 279) 	ATTR_LIST(msg_count),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 280) 	ATTR_LIST(first_error_ino),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 281) 	ATTR_LIST(last_error_ino),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 282) 	ATTR_LIST(first_error_block),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 283) 	ATTR_LIST(last_error_block),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 284) 	ATTR_LIST(first_error_line),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 285) 	ATTR_LIST(last_error_line),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 286) 	ATTR_LIST(first_error_func),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 287) 	ATTR_LIST(last_error_func),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 288) 	ATTR_LIST(first_error_errcode),
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 289) 	ATTR_LIST(last_error_errcode),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 290) 	ATTR_LIST(first_error_time),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 291) 	ATTR_LIST(last_error_time),
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 292) 	ATTR_LIST(journal_task),
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 293) #ifdef CONFIG_EXT4_DEBUG
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 294) 	ATTR_LIST(simulate_fail),
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 295) #endif
cfd7323772213 (Alex Zhuravlev        2020-04-21 10:54:07 +0300 296) 	ATTR_LIST(mb_prefetch),
cfd7323772213 (Alex Zhuravlev        2020-04-21 10:54:07 +0300 297) 	ATTR_LIST(mb_prefetch_limit),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 298) 	NULL,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 299) };
78e9605d4fdde (Kimberly Brown        2019-07-02 17:38:55 -0400 300) ATTRIBUTE_GROUPS(ext4);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 301) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 302) /* Features this copy of ext4 supports */
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 303) EXT4_ATTR_FEATURE(lazy_itable_init);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 304) EXT4_ATTR_FEATURE(batched_discard);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 305) EXT4_ATTR_FEATURE(meta_bg_resize);
643fa9612bf1a (Chandan Rajendra      2018-12-12 15:20:12 +0530 306) #ifdef CONFIG_FS_ENCRYPTION
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 307) EXT4_ATTR_FEATURE(encryption);
ed318a6cc0b62 (Eric Biggers          2020-05-12 16:32:50 -0700 308) EXT4_ATTR_FEATURE(test_dummy_encryption_v2);
c4704a4fbe834 (Eric Biggers          2016-10-12 23:24:51 -0400 309) #endif
db90f41916cf0 (Theodore Ts'o         2019-05-06 14:03:52 -0400 310) #ifdef CONFIG_UNICODE
db90f41916cf0 (Theodore Ts'o         2019-05-06 14:03:52 -0400 311) EXT4_ATTR_FEATURE(casefold);
db90f41916cf0 (Theodore Ts'o         2019-05-06 14:03:52 -0400 312) #endif
c93d8f8858092 (Eric Biggers          2019-07-22 09:26:24 -0700 313) #ifdef CONFIG_FS_VERITY
c93d8f8858092 (Eric Biggers          2019-07-22 09:26:24 -0700 314) EXT4_ATTR_FEATURE(verity);
c93d8f8858092 (Eric Biggers          2019-07-22 09:26:24 -0700 315) #endif
8c81bd8f586c4 (Darrick J. Wong       2015-10-17 16:16:02 -0400 316) EXT4_ATTR_FEATURE(metadata_csum_seed);
6694875ef8045 (Theodore Ts'o         2020-10-28 13:39:13 -0400 317) EXT4_ATTR_FEATURE(fast_commit);
e71f99f2dfb45 (Daniel Rosenberg      2021-06-03 09:48:49 +0000 318) #if defined(CONFIG_UNICODE) && defined(CONFIG_FS_ENCRYPTION)
471fbbea7ff70 (Daniel Rosenberg      2021-03-19 07:34:13 +0000 319) EXT4_ATTR_FEATURE(encrypted_casefold);
e71f99f2dfb45 (Daniel Rosenberg      2021-06-03 09:48:49 +0000 320) #endif
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 321) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 322) static struct attribute *ext4_feat_attrs[] = {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 323) 	ATTR_LIST(lazy_itable_init),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 324) 	ATTR_LIST(batched_discard),
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 325) 	ATTR_LIST(meta_bg_resize),
643fa9612bf1a (Chandan Rajendra      2018-12-12 15:20:12 +0530 326) #ifdef CONFIG_FS_ENCRYPTION
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 327) 	ATTR_LIST(encryption),
ed318a6cc0b62 (Eric Biggers          2020-05-12 16:32:50 -0700 328) 	ATTR_LIST(test_dummy_encryption_v2),
db90f41916cf0 (Theodore Ts'o         2019-05-06 14:03:52 -0400 329) #endif
db90f41916cf0 (Theodore Ts'o         2019-05-06 14:03:52 -0400 330) #ifdef CONFIG_UNICODE
db90f41916cf0 (Theodore Ts'o         2019-05-06 14:03:52 -0400 331) 	ATTR_LIST(casefold),
c93d8f8858092 (Eric Biggers          2019-07-22 09:26:24 -0700 332) #endif
c93d8f8858092 (Eric Biggers          2019-07-22 09:26:24 -0700 333) #ifdef CONFIG_FS_VERITY
c93d8f8858092 (Eric Biggers          2019-07-22 09:26:24 -0700 334) 	ATTR_LIST(verity),
c4704a4fbe834 (Eric Biggers          2016-10-12 23:24:51 -0400 335) #endif
8c81bd8f586c4 (Darrick J. Wong       2015-10-17 16:16:02 -0400 336) 	ATTR_LIST(metadata_csum_seed),
6694875ef8045 (Theodore Ts'o         2020-10-28 13:39:13 -0400 337) 	ATTR_LIST(fast_commit),
e71f99f2dfb45 (Daniel Rosenberg      2021-06-03 09:48:49 +0000 338) #if defined(CONFIG_UNICODE) && defined(CONFIG_FS_ENCRYPTION)
471fbbea7ff70 (Daniel Rosenberg      2021-03-19 07:34:13 +0000 339) 	ATTR_LIST(encrypted_casefold),
e71f99f2dfb45 (Daniel Rosenberg      2021-06-03 09:48:49 +0000 340) #endif
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 341) 	NULL,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 342) };
78e9605d4fdde (Kimberly Brown        2019-07-02 17:38:55 -0400 343) ATTRIBUTE_GROUPS(ext4_feat);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 344) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 345) static void *calc_ptr(struct ext4_attr *a, struct ext4_sb_info *sbi)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 346) {
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 347) 	switch (a->attr_ptr) {
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 348) 	case ptr_explicit:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 349) 		return a->u.explicit_ptr;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 350) 	case ptr_ext4_sb_info_offset:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 351) 		return (void *) (((char *) sbi) + a->u.offset);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 352) 	case ptr_ext4_super_block_offset:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 353) 		return (void *) (((char *) sbi->s_es) + a->u.offset);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 354) 	}
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 355) 	return NULL;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 356) }
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 357) 
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 358) static ssize_t __print_tstamp(char *buf, __le32 lo, __u8 hi)
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 359) {
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 360) 	return snprintf(buf, PAGE_SIZE, "%lld\n",
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 361) 			((time64_t)hi << 32) + le32_to_cpu(lo));
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 362) }
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 363) 
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 364) #define print_tstamp(buf, es, tstamp) \
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 365) 	__print_tstamp(buf, (es)->tstamp, (es)->tstamp ## _hi)
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 366) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 367) static ssize_t ext4_attr_show(struct kobject *kobj,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 368) 			      struct attribute *attr, char *buf)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 369) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 370) 	struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 371) 						s_kobj);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 372) 	struct ext4_attr *a = container_of(attr, struct ext4_attr, attr);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 373) 	void *ptr = calc_ptr(a, sbi);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 374) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 375) 	switch (a->attr_id) {
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 376) 	case attr_delayed_allocation_blocks:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 377) 		return snprintf(buf, PAGE_SIZE, "%llu\n",
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 378) 				(s64) EXT4_C2B(sbi,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 379) 		       percpu_counter_sum(&sbi->s_dirtyclusters_counter)));
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 380) 	case attr_session_write_kbytes:
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400 381) 		return session_write_kbytes_show(sbi, buf);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 382) 	case attr_lifetime_write_kbytes:
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400 383) 		return lifetime_write_kbytes_show(sbi, buf);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 384) 	case attr_reserved_clusters:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 385) 		return snprintf(buf, PAGE_SIZE, "%llu\n",
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 386) 				(unsigned long long)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 387) 				atomic64_read(&sbi->s_resv_clusters));
efc61345274d6 (Eric Whitney          2021-02-18 10:11:32 -0500 388) 	case attr_sra_exceeded_retry_limit:
efc61345274d6 (Eric Whitney          2021-02-18 10:11:32 -0500 389) 		return snprintf(buf, PAGE_SIZE, "%llu\n",
efc61345274d6 (Eric Whitney          2021-02-18 10:11:32 -0500 390) 				(unsigned long long)
efc61345274d6 (Eric Whitney          2021-02-18 10:11:32 -0500 391) 			percpu_counter_sum(&sbi->s_sra_exceeded_retry_limit));
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 392) 	case attr_inode_readahead:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 393) 	case attr_pointer_ui:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 394) 		if (!ptr)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 395) 			return 0;
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 396) 		if (a->attr_ptr == ptr_ext4_super_block_offset)
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 397) 			return snprintf(buf, PAGE_SIZE, "%u\n",
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 398) 					le32_to_cpup(ptr));
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 399) 		else
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 400) 			return snprintf(buf, PAGE_SIZE, "%u\n",
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 401) 					*((unsigned int *) ptr));
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 402) 	case attr_pointer_ul:
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 403) 		if (!ptr)
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 404) 			return 0;
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 405) 		return snprintf(buf, PAGE_SIZE, "%lu\n",
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 406) 				*((unsigned long *) ptr));
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 407) 	case attr_pointer_u8:
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 408) 		if (!ptr)
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 409) 			return 0;
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 410) 		return snprintf(buf, PAGE_SIZE, "%u\n",
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 411) 				*((unsigned char *) ptr));
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 412) 	case attr_pointer_u64:
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 413) 		if (!ptr)
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 414) 			return 0;
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 415) 		if (a->attr_ptr == ptr_ext4_super_block_offset)
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 416) 			return snprintf(buf, PAGE_SIZE, "%llu\n",
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 417) 					le64_to_cpup(ptr));
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 418) 		else
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 419) 			return snprintf(buf, PAGE_SIZE, "%llu\n",
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 420) 					*((unsigned long long *) ptr));
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 421) 	case attr_pointer_string:
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 422) 		if (!ptr)
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 423) 			return 0;
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 424) 		return snprintf(buf, PAGE_SIZE, "%.*s\n", a->attr_size,
4549b49f82ab4 (Theodore Ts'o         2019-12-23 18:44:49 -0500 425) 				(char *) ptr);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 426) 	case attr_pointer_atomic:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 427) 		if (!ptr)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 428) 			return 0;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 429) 		return snprintf(buf, PAGE_SIZE, "%d\n",
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 430) 				atomic_read((atomic_t *) ptr));
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 431) 	case attr_feature:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 432) 		return snprintf(buf, PAGE_SIZE, "supported\n");
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 433) 	case attr_first_error_time:
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 434) 		return print_tstamp(buf, sbi->s_es, s_first_error_time);
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 435) 	case attr_last_error_time:
6a0678a79bb3a (Arnd Bergmann         2018-07-29 15:51:48 -0400 436) 		return print_tstamp(buf, sbi->s_es, s_last_error_time);
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 437) 	case attr_journal_task:
bc1d69d6151f1 (Konstantin Khlebnikov 2019-02-21 11:49:27 -0500 438) 		return journal_task_show(sbi, buf);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 439) 	}
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 440) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 441) 	return 0;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 442) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 443) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 444) static ssize_t ext4_attr_store(struct kobject *kobj,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 445) 			       struct attribute *attr,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 446) 			       const char *buf, size_t len)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 447) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 448) 	struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 449) 						s_kobj);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 450) 	struct ext4_attr *a = container_of(attr, struct ext4_attr, attr);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 451) 	void *ptr = calc_ptr(a, sbi);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 452) 	unsigned long t;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 453) 	int ret;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 454) 
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 455) 	switch (a->attr_id) {
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 456) 	case attr_reserved_clusters:
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400 457) 		return reserved_clusters_store(sbi, buf, len);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 458) 	case attr_pointer_ui:
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 459) 		if (!ptr)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 460) 			return 0;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 461) 		ret = kstrtoul(skip_spaces(buf), 0, &t);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 462) 		if (ret)
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 463) 			return ret;
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 464) 		if (a->attr_ptr == ptr_ext4_super_block_offset)
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 465) 			*((__le32 *) ptr) = cpu_to_le32(t);
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 466) 		else
a4d2aadca184e (Arnd Bergmann         2018-07-29 15:48:00 -0400 467) 			*((unsigned int *) ptr) = t;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 468) 		return len;
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 469) 	case attr_pointer_ul:
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 470) 		if (!ptr)
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 471) 			return 0;
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 472) 		ret = kstrtoul(skip_spaces(buf), 0, &t);
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 473) 		if (ret)
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 474) 			return ret;
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 475) 		*((unsigned long *) ptr) = t;
46f870d690fec (Theodore Ts'o         2019-11-21 13:09:43 -0500 476) 		return len;
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 477) 	case attr_inode_readahead:
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400 478) 		return inode_readahead_blks_store(sbi, buf, len);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 479) 	case attr_trigger_test_error:
6ca06829fba60 (Tyson Nottingham      2018-03-30 00:13:10 -0400 480) 		return trigger_test_error(sbi, buf, len);
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 481) 	}
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 482) 	return 0;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 483) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 484) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 485) static void ext4_sb_release(struct kobject *kobj)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 486) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 487) 	struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 488) 						s_kobj);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 489) 	complete(&sbi->s_kobj_unregister);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 490) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 491) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 492) static const struct sysfs_ops ext4_attr_ops = {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 493) 	.show	= ext4_attr_show,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 494) 	.store	= ext4_attr_store,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 495) };
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 496) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 497) static struct kobj_type ext4_sb_ktype = {
78e9605d4fdde (Kimberly Brown        2019-07-02 17:38:55 -0400 498) 	.default_groups = ext4_groups,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 499) 	.sysfs_ops	= &ext4_attr_ops,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 500) 	.release	= ext4_sb_release,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 501) };
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 502) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 503) static struct kobj_type ext4_feat_ktype = {
78e9605d4fdde (Kimberly Brown        2019-07-02 17:38:55 -0400 504) 	.default_groups = ext4_feat_groups,
76d33bca5581b (Theodore Ts'o         2015-09-23 12:45:17 -0400 505) 	.sysfs_ops	= &ext4_attr_ops,
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 506) 	.release	= (void (*)(struct kobject *))kfree,
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 507) };
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 508) 
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 509) static struct kobject *ext4_root;
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 510) 
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 511) static struct kobject *ext4_feat;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 512) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 513) int ext4_register_sysfs(struct super_block *sb)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 514) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 515) 	struct ext4_sb_info *sbi = EXT4_SB(sb);
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 516) 	int err;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 517) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 518) 	init_completion(&sbi->s_kobj_unregister);
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 519) 	err = kobject_init_and_add(&sbi->s_kobj, &ext4_sb_ktype, ext4_root,
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 520) 				   "%s", sb->s_id);
95c4df029374d (Riccardo Schirone     2018-01-11 14:28:13 -0500 521) 	if (err) {
95c4df029374d (Riccardo Schirone     2018-01-11 14:28:13 -0500 522) 		kobject_put(&sbi->s_kobj);
95c4df029374d (Riccardo Schirone     2018-01-11 14:28:13 -0500 523) 		wait_for_completion(&sbi->s_kobj_unregister);
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 524) 		return err;
95c4df029374d (Riccardo Schirone     2018-01-11 14:28:13 -0500 525) 	}
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 526) 
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 527) 	if (ext4_proc_root)
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 528) 		sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root);
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 529) 	if (sbi->s_proc) {
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 530) 		proc_create_single_data("options", S_IRUGO, sbi->s_proc,
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 531) 				ext4_seq_options_show, sb);
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 532) 		proc_create_single_data("es_shrinker_info", S_IRUGO,
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 533) 				sbi->s_proc, ext4_seq_es_shrinker_info_show,
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 534) 				sb);
ce8c59d197c82 (Harshad Shirwadkar    2020-10-15 13:38:01 -0700 535) 		proc_create_single_data("fc_info", 0444, sbi->s_proc,
ce8c59d197c82 (Harshad Shirwadkar    2020-10-15 13:38:01 -0700 536) 					ext4_fc_info_show, sb);
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 537) 		proc_create_seq_data("mb_groups", S_IRUGO, sbi->s_proc,
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 538) 				&ext4_mb_seq_groups_ops, sb);
a6c75eaf11032 (Harshad Shirwadkar    2021-04-01 10:21:25 -0700 539) 		proc_create_single_data("mb_stats", 0444, sbi->s_proc,
a6c75eaf11032 (Harshad Shirwadkar    2021-04-01 10:21:25 -0700 540) 				ext4_seq_mb_stats_show, sb);
f68f406385590 (Harshad Shirwadkar    2021-04-01 10:21:28 -0700 541) 		proc_create_seq_data("mb_structs_summary", 0444, sbi->s_proc,
f68f406385590 (Harshad Shirwadkar    2021-04-01 10:21:28 -0700 542) 				&ext4_mb_seq_structs_summary_ops, sb);
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 543) 	}
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 544) 	return 0;
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 545) }
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 546) 
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 547) void ext4_unregister_sysfs(struct super_block *sb)
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 548) {
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 549) 	struct ext4_sb_info *sbi = EXT4_SB(sb);
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 550) 
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 551) 	if (sbi->s_proc)
247dbed8c9525 (Christoph Hellwig     2018-04-11 11:37:23 +0200 552) 		remove_proc_subtree(sb->s_id, ext4_proc_root);
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 553) 	kobject_del(&sbi->s_kobj);
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 554) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 555) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 556) int __init ext4_init_sysfs(void)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 557) {
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 558) 	int ret;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 559) 
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 560) 	ext4_root = kobject_create_and_add("ext4", fs_kobj);
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 561) 	if (!ext4_root)
5dc397113d195 (Riccardo Schirone     2018-01-11 15:34:04 -0500 562) 		return -ENOMEM;
5dc397113d195 (Riccardo Schirone     2018-01-11 15:34:04 -0500 563) 
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 564) 	ext4_feat = kzalloc(sizeof(*ext4_feat), GFP_KERNEL);
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 565) 	if (!ext4_feat) {
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 566) 		ret = -ENOMEM;
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 567) 		goto root_err;
95c4df029374d (Riccardo Schirone     2018-01-11 14:28:13 -0500 568) 	}
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 569) 
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 570) 	ret = kobject_init_and_add(ext4_feat, &ext4_feat_ktype,
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 571) 				   ext4_root, "features");
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 572) 	if (ret)
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 573) 		goto feat_err;
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 574) 
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 575) 	ext4_proc_root = proc_mkdir(proc_dirname, NULL);
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 576) 	return ret;
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 577) 
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 578) feat_err:
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 579) 	kobject_put(ext4_feat);
c2e5df7626011 (Tyson Nottingham      2018-03-30 00:03:38 -0400 580) 	ext4_feat = NULL;
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 581) root_err:
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 582) 	kobject_put(ext4_root);
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 583) 	ext4_root = NULL;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 584) 	return ret;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 585) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 586) 
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 587) void ext4_exit_sysfs(void)
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 588) {
b99fee58a20ab (Riccardo Schirone     2018-01-11 15:11:32 -0500 589) 	kobject_put(ext4_feat);
c2e5df7626011 (Tyson Nottingham      2018-03-30 00:03:38 -0400 590) 	ext4_feat = NULL;
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 591) 	kobject_put(ext4_root);
bc1420ae56266 (Tyson Nottingham      2018-03-30 00:41:34 -0400 592) 	ext4_root = NULL;
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 593) 	remove_proc_entry(proc_dirname, NULL);
ebd173beb8db5 (Theodore Ts'o         2015-09-23 12:46:17 -0400 594) 	ext4_proc_root = NULL;
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 595) }
b5799018827e6 (Theodore Ts'o         2015-09-23 12:44:17 -0400 596)