Commit 9f5c1700 authored by Zhihao Cheng's avatar Zhihao Cheng Committed by Baokun Li
Browse files

Add new config 'CONFIG_EXT4_ERROR_REPORT' to control ext3/4 error reporting

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8TNRU


CVE: NA

--------------------------------

Add new config 'CONFIG_EXT4_ERROR_REPORT' to control ext3/4 error
reporting.

Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>

Conflicts:
	fs/ext4/super.c

Signed-off-by: default avatarBaokun Li <libaokun1@huawei.com>
parent eb7a43c7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -6799,6 +6799,7 @@ CONFIG_EXT4_FS=m
CONFIG_EXT4_USE_FOR_EXT2=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ERROR_REPORT=y
# CONFIG_EXT4_DEBUG is not set
CONFIG_JBD2=m
# CONFIG_JBD2_DEBUG is not set
+1 −0
Original line number Diff line number Diff line
@@ -7996,6 +7996,7 @@ CONFIG_EXT4_FS=m
CONFIG_EXT4_USE_FOR_EXT2=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ERROR_REPORT=y
# CONFIG_EXT4_DEBUG is not set
CONFIG_JBD2=m
# CONFIG_JBD2_DEBUG is not set
+8 −0
Original line number Diff line number Diff line
@@ -118,3 +118,11 @@ config EXT4_KUNIT_TESTS
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config EXT4_ERROR_REPORT
	bool "Ext4 error reporting by netlink"
	depends on EXT4_FS && NET
	default n
	help
	  Implement the ext3/ext4 file system error report. Report error to
	  userspace by netlink
+2 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@

#include <linux/compiler.h>

#ifdef CONFIG_EXT4_ERROR_REPORT
#define NL_EXT4_ERROR_GROUP    1
#define EXT4_ERROR_MAGIC       0xAE32014U
struct ext4_err_msg {
@@ -55,6 +56,7 @@ struct ext4_err_msg {
	unsigned long s_flags;
	int ext4_errno;
};
#endif

/*
 * The fourth extended filesystem constants/structures
+19 −0
Original line number Diff line number Diff line
@@ -57,9 +57,11 @@
#include "mballoc.h"
#include "fsmap.h"

#ifdef CONFIG_EXT4_ERROR_REPORT
#include <uapi/linux/netlink.h>
#include <net/sock.h>
#include <net/net_namespace.h>
#endif

#define CREATE_TRACE_POINTS
#include <trace/events/ext4.h>
@@ -88,8 +90,10 @@ static void ext4_unregister_li_request(struct super_block *sb);
static void ext4_clear_request_list(void);
static struct inode *ext4_get_journal_inode(struct super_block *sb,
					    unsigned int journal_inum);
#ifdef CONFIG_EXT4_ERROR_REPORT
static void ext4_netlink_send_info(struct super_block *sb, int ext4_errno);
static struct sock *ext4nl;
#endif
static int ext4_validate_options(struct fs_context *fc);
static int ext4_check_opt_consistency(struct fs_context *fc,
				      struct super_block *sb);
@@ -684,6 +688,7 @@ static void save_error_info(struct super_block *sb, int error,
	spin_unlock(&sbi->s_error_lock);
}

#ifdef CONFIG_EXT4_ERROR_REPORT
static void ext4_netlink_send_info(struct super_block *sb, int ext4_errno)
{
	int size;
@@ -719,6 +724,7 @@ static void ext4_netlink_send_info(struct super_block *sb, int ext4_errno)
			kfree_skb(skb);
	}
}
#endif

/* Deal with the reporting of failure conditions on a filesystem such as
 * inconsistencies detected or read IO failures.
@@ -781,11 +787,16 @@ static void ext4_handle_error(struct super_block *sb, bool force_ro, int error,
			sb->s_id);
	}

#ifdef CONFIG_EXT4_ERROR_REPORT
	if (sb_rdonly(sb))
		return;

	if (continue_fs)
		goto out;
#else
	if (sb_rdonly(sb) || continue_fs)
		return;
#endif

	ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");
	/*
@@ -794,8 +805,10 @@ static void ext4_handle_error(struct super_block *sb, bool force_ro, int error,
	 */
	smp_wmb();
	sb->s_flags |= SB_RDONLY;
#ifdef CONFIG_EXT4_ERROR_REPORT
out:
	ext4_netlink_send_info(sb, force_ro ? 2 : 1);
#endif
}

static void update_super_work(struct work_struct *work)
@@ -7389,7 +7402,9 @@ wait_queue_head_t ext4__ioend_wq[EXT4_WQ_HASH_SZ];
static int __init ext4_init_fs(void)
{
	int i, err;
#ifdef CONFIG_EXT4_ERROR_REPORT
	struct netlink_kernel_cfg cfg = {.groups = NL_EXT4_ERROR_GROUP,};
#endif

	ratelimit_state_init(&ext4_mount_msg_ratelimit, 30 * HZ, 64);
	ext4_li_info = NULL;
@@ -7441,9 +7456,11 @@ static int __init ext4_init_fs(void)
	if (err)
		goto out;

#ifdef CONFIG_EXT4_ERROR_REPORT
	ext4nl = netlink_kernel_create(&init_net, NETLINK_FILESYSTEM, &cfg);
	if (!ext4nl)
		printk(KERN_ERR "EXT4-fs: Cannot create netlink socket.\n");
#endif
	return 0;
out:
	unregister_as_ext2();
@@ -7484,7 +7501,9 @@ static void __exit ext4_exit_fs(void)
	ext4_exit_post_read_processing();
	ext4_exit_es();
	ext4_exit_pending();
#ifdef CONFIG_EXT4_ERROR_REPORT
	netlink_kernel_release(ext4nl);
#endif
}

MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others");