Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2c71e74 authored by Gao Xiang's avatar Gao Xiang Committed by Greg Kroah-Hartman
Browse files

erofs: kill all erofs specific fault injection

As Christoph suggested [1], "Please just use plain kmalloc
everywhere and let the normal kernel error injection code
take care of injeting any errors."

[1] https://lore.kernel.org/r/20190829102426.GE20598@infradead.org/


Reported-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarGao Xiang <gaoxiang25@huawei.com>
Link: https://lore.kernel.org/r/20190904020912.63925-20-gaoxiang25@huawei.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 99634bf3
Loading
Loading
Loading
Loading
+0 −5
Original line number Original line Diff line number Diff line
@@ -52,11 +52,6 @@ linux-erofs mailing list:
Mount options
Mount options
=============
=============


fault_injection=%d     Enable fault injection in all supported types with
                       specified injection rate. Supported injection type:
                       Type_Name                Type_Value
                       FAULT_KMALLOC            0x000000001
                       FAULT_READ_IO            0x000000002
(no)user_xattr         Setup Extended User Attributes. Note: xattr is enabled
(no)user_xattr         Setup Extended User Attributes. Note: xattr is enabled
                       by default if CONFIG_EROFS_FS_XATTR is selected.
                       by default if CONFIG_EROFS_FS_XATTR is selected.
(no)acl                Setup POSIX Access Control List. Note: acl is enabled
(no)acl                Setup POSIX Access Control List. Note: acl is enabled
+0 −7
Original line number Original line Diff line number Diff line
@@ -27,13 +27,6 @@ config EROFS_FS_DEBUG


	  For daily use, say N.
	  For daily use, say N.


config EROFS_FAULT_INJECTION
	bool "EROFS fault injection facility"
	depends on EROFS_FS
	help
	  Test EROFS to inject faults such as ENOMEM, EIO, and so on.
	  If unsure, say N.

config EROFS_FS_XATTR
config EROFS_FS_XATTR
	bool "EROFS extended attributes"
	bool "EROFS extended attributes"
	depends on EROFS_FS
	depends on EROFS_FS
+0 −7
Original line number Original line Diff line number Diff line
@@ -11,16 +11,10 @@


static void erofs_readendio(struct bio *bio)
static void erofs_readendio(struct bio *bio)
{
{
	struct super_block *const sb = bio->bi_private;
	struct bio_vec *bvec;
	struct bio_vec *bvec;
	blk_status_t err = bio->bi_status;
	blk_status_t err = bio->bi_status;
	struct bvec_iter_all iter_all;
	struct bvec_iter_all iter_all;


	if (time_to_inject(EROFS_SB(sb), FAULT_READ_IO)) {
		erofs_show_injection_info(FAULT_READ_IO);
		err = BLK_STS_IOERR;
	}

	bio_for_each_segment_all(bvec, bio, iter_all) {
	bio_for_each_segment_all(bvec, bio, iter_all) {
		struct page *page = bvec->bv_page;
		struct page *page = bvec->bv_page;


@@ -48,7 +42,6 @@ static struct bio *erofs_grab_raw_bio(struct super_block *sb,
	bio->bi_end_io = erofs_readendio;
	bio->bi_end_io = erofs_readendio;
	bio_set_dev(bio, sb->s_bdev);
	bio_set_dev(bio, sb->s_bdev);
	bio->bi_iter.bi_sector = (sector_t)blkaddr << LOG_SECTORS_PER_BLOCK;
	bio->bi_iter.bi_sector = (sector_t)blkaddr << LOG_SECTORS_PER_BLOCK;
	bio->bi_private = sb;
	if (ismeta)
	if (ismeta)
		bio->bi_opf = REQ_OP_READ | REQ_META;
		bio->bi_opf = REQ_OP_READ | REQ_META;
	else
	else
+1 −2
Original line number Original line Diff line number Diff line
@@ -131,7 +131,6 @@ static int erofs_fill_symlink(struct inode *inode, void *data,
			      unsigned int m_pofs)
			      unsigned int m_pofs)
{
{
	struct erofs_inode *vi = EROFS_I(inode);
	struct erofs_inode *vi = EROFS_I(inode);
	struct erofs_sb_info *sbi = EROFS_I_SB(inode);
	char *lnk;
	char *lnk;


	/* if it cannot be handled with fast symlink scheme */
	/* if it cannot be handled with fast symlink scheme */
@@ -141,7 +140,7 @@ static int erofs_fill_symlink(struct inode *inode, void *data,
		return 0;
		return 0;
	}
	}


	lnk = erofs_kmalloc(sbi, inode->i_size + 1, GFP_KERNEL);
	lnk = kmalloc(inode->i_size + 1, GFP_KERNEL);
	if (!lnk)
	if (!lnk)
		return -ENOMEM;
		return -ENOMEM;


+0 −65
Original line number Original line Diff line number Diff line
@@ -32,23 +32,6 @@
#define DBG_BUGON(x)            ((void)(x))
#define DBG_BUGON(x)            ((void)(x))
#endif	/* !CONFIG_EROFS_FS_DEBUG */
#endif	/* !CONFIG_EROFS_FS_DEBUG */


enum {
	FAULT_KMALLOC,
	FAULT_READ_IO,
	FAULT_MAX,
};

#ifdef CONFIG_EROFS_FAULT_INJECTION
extern const char *erofs_fault_name[FAULT_MAX];
#define IS_FAULT_SET(fi, type) ((fi)->inject_type & (1 << (type)))

struct erofs_fault_info {
	atomic_t inject_ops;
	unsigned int inject_rate;
	unsigned int inject_type;
};
#endif	/* CONFIG_EROFS_FAULT_INJECTION */

/* EROFS_SUPER_MAGIC_V1 to represent the whole file system */
/* EROFS_SUPER_MAGIC_V1 to represent the whole file system */
#define EROFS_SUPER_MAGIC   EROFS_SUPER_MAGIC_V1
#define EROFS_SUPER_MAGIC   EROFS_SUPER_MAGIC_V1


@@ -99,62 +82,14 @@ struct erofs_sb_info {
	u32 feature_incompat;
	u32 feature_incompat;


	unsigned int mount_opt;
	unsigned int mount_opt;

#ifdef CONFIG_EROFS_FAULT_INJECTION
	struct erofs_fault_info fault_info;	/* For fault injection */
#endif
};
};


#ifdef CONFIG_EROFS_FAULT_INJECTION
#define erofs_show_injection_info(type)					\
	infoln("inject %s in %s of %pS", erofs_fault_name[type],        \
		__func__, __builtin_return_address(0))

static inline bool time_to_inject(struct erofs_sb_info *sbi, int type)
{
	struct erofs_fault_info *ffi = &sbi->fault_info;

	if (!ffi->inject_rate)
		return false;

	if (!IS_FAULT_SET(ffi, type))
		return false;

	atomic_inc(&ffi->inject_ops);
	if (atomic_read(&ffi->inject_ops) >= ffi->inject_rate) {
		atomic_set(&ffi->inject_ops, 0);
		return true;
	}
	return false;
}
#else
static inline bool time_to_inject(struct erofs_sb_info *sbi, int type)
{
	return false;
}

static inline void erofs_show_injection_info(int type)
{
}
#endif	/* !CONFIG_EROFS_FAULT_INJECTION */

static inline void *erofs_kmalloc(struct erofs_sb_info *sbi,
					size_t size, gfp_t flags)
{
	if (time_to_inject(sbi, FAULT_KMALLOC)) {
		erofs_show_injection_info(FAULT_KMALLOC);
		return NULL;
	}
	return kmalloc(size, flags);
}

#define EROFS_SB(sb) ((struct erofs_sb_info *)(sb)->s_fs_info)
#define EROFS_SB(sb) ((struct erofs_sb_info *)(sb)->s_fs_info)
#define EROFS_I_SB(inode) ((struct erofs_sb_info *)(inode)->i_sb->s_fs_info)
#define EROFS_I_SB(inode) ((struct erofs_sb_info *)(inode)->i_sb->s_fs_info)


/* Mount flags set via mount options or defaults */
/* Mount flags set via mount options or defaults */
#define EROFS_MOUNT_XATTR_USER		0x00000010
#define EROFS_MOUNT_XATTR_USER		0x00000010
#define EROFS_MOUNT_POSIX_ACL		0x00000020
#define EROFS_MOUNT_POSIX_ACL		0x00000020
#define EROFS_MOUNT_FAULT_INJECTION	0x00000040


#define clear_opt(sbi, option)	((sbi)->mount_opt &= ~EROFS_MOUNT_##option)
#define clear_opt(sbi, option)	((sbi)->mount_opt &= ~EROFS_MOUNT_##option)
#define set_opt(sbi, option)	((sbi)->mount_opt |= EROFS_MOUNT_##option)
#define set_opt(sbi, option)	((sbi)->mount_opt |= EROFS_MOUNT_##option)
Loading