[Ocfs2-tools-devel] [PATCH] fswreck: corrupt a given inode

Gang He ghe at suse.com
Sun Mar 6 18:54:53 PST 2016


Hello Eric,

I think that using extent file path is better than specifying a inode number, otherwise the user possibly specify a wrong inode number to bring rise.


Thanks
Gang


>>> 
> From: Eric Ren <zren at suse.com>
> 
> When we want to corrupt a given inode, fswreck now cannot do this instead
> it creates one internally. So, make it possible by introducing option -i 
> which
> specify the inode number.
> 
> Signed-off-by: Eric Ren <zren at suse.com>
> ---
>  fswreck/corrupt.c         | 19 ++++++++++---------
>  fswreck/include/corrupt.h | 16 ++++++++--------
>  fswreck/inode.c           | 13 +++++++------
>  fswreck/main.c            | 23 ++++++++++++++++++-----
>  4 files changed, 43 insertions(+), 28 deletions(-)
> 
> diff --git a/fswreck/corrupt.c b/fswreck/corrupt.c
> index 2f6074e..49b99ba 100644
> --- a/fswreck/corrupt.c
> +++ b/fswreck/corrupt.c
> @@ -56,10 +56,10 @@ void create_named_directory(ocfs2_filesys *fs, char 
> *dirname,
>  	return;
>  }
>  
> -void corrupt_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum)
> +void corrupt_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum, 
> void *priv)
>  {
>  	void (*func)(ocfs2_filesys *fs, enum fsck_type type, uint64_t blkno) = 
> NULL;
> -	uint64_t blkno;
> +	uint64_t blkno = *(int *)priv;
>  
>  	switch (type) {
>  	case EB_BLKNO:
> @@ -235,7 +235,8 @@ void corrupt_file(ocfs2_filesys *fs, enum fsck_type type, 
> uint16_t slotnum)
>  		FSWRK_FATAL("Invalid code=%d", type);
>  	}
>  
> -	create_named_directory(fs, "tmp", &blkno);
> +	if (blkno <= 0)
> +		create_named_directory(fs, "tmp", &blkno);
>  
>  	if (func)
>  		func(fs, type, blkno);
> @@ -243,7 +244,7 @@ void corrupt_file(ocfs2_filesys *fs, enum fsck_type type, 
> uint16_t slotnum)
>  	return;
>  }
>  
> -void corrupt_sys_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum)
> +void corrupt_sys_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum, void *priv)
>  {
>  	void (*func)(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum) = 
> NULL;
>  
> @@ -320,7 +321,7 @@ void corrupt_sys_file(ocfs2_filesys *fs, enum fsck_type 
> type, uint16_t slotnum)
>  }
>  
>  void corrupt_group_desc(ocfs2_filesys *fs, enum fsck_type type,
> -			uint16_t slotnum)
> +			uint16_t slotnum, void *priv)
>  {
>  	void (*func)(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum) = 
> NULL;
>  
> @@ -366,7 +367,7 @@ void corrupt_group_desc(ocfs2_filesys *fs, enum fsck_type 
> type,
>  }
>  
>  void corrupt_local_alloc(ocfs2_filesys *fs, enum fsck_type type,
> -			 uint16_t slotnum)
> +			 uint16_t slotnum, void *priv)
>  {
>  	void (*func)(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum) = 
> NULL;
>  
> @@ -406,7 +407,7 @@ void corrupt_local_alloc(ocfs2_filesys *fs, enum 
> fsck_type type,
>  }
>  
>  void corrupt_truncate_log(ocfs2_filesys *fs, enum fsck_type type,
> -			  uint16_t slotnum)
> +			  uint16_t slotnum, void *priv)
>  {
>  	void (*func)(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum) = 
> NULL;
>  
> @@ -436,7 +437,7 @@ void corrupt_truncate_log(ocfs2_filesys *fs, enum 
> fsck_type type,
>  	return;
>  }
>  
> -void corrupt_refcount(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum)
> +void corrupt_refcount(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum, void *priv)
>  {
>  	uint64_t blkno;
>  	void (*func)(ocfs2_filesys *fs,
> @@ -476,7 +477,7 @@ void corrupt_refcount(ocfs2_filesys *fs, enum fsck_type 
> type, uint16_t slotnum)
>  }
>  
>  void corrupt_discontig_bg(ocfs2_filesys *fs, enum fsck_type type,
> -			  uint16_t slotnum)
> +			  uint16_t slotnum, void *priv)
>  {
>  	mess_up_discontig_bg(fs, type, slotnum);
>  }
> diff --git a/fswreck/include/corrupt.h b/fswreck/include/corrupt.h
> index 7037b16..a7fa3b4 100644
> --- a/fswreck/include/corrupt.h
> +++ b/fswreck/include/corrupt.h
> @@ -25,18 +25,18 @@
>  #ifndef __CORRUPT_H
>  #define __CORRUPT_H
>  
> -void corrupt_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum);
> -void corrupt_sys_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum);
> +void corrupt_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t slotnum, 
> void *priv);
> +void corrupt_sys_file(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum, void *priv);
>  void corrupt_group_desc(ocfs2_filesys *fs, enum fsck_type type,
> -			uint16_t slotnum);
> -void corrupt_inode(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum);
> +			uint16_t slotnum, void *priv);
> +void corrupt_inode(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum, void *priv);
>  void corrupt_local_alloc(ocfs2_filesys *fs, enum fsck_type type,
> -			 uint16_t slotnum);
> +			 uint16_t slotnum, void *priv);
>  void corrupt_truncate_log(ocfs2_filesys *fs, enum fsck_type type,
> -			  uint16_t slotnum);
> -void corrupt_refcount(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum);
> +			  uint16_t slotnum, void *priv);
> +void corrupt_refcount(ocfs2_filesys *fs, enum fsck_type type, uint16_t 
> slotnum, void *priv);
>  void corrupt_discontig_bg(ocfs2_filesys *fs, enum fsck_type type,
> -			  uint16_t slotnum);
> +			  uint16_t slotnum, void *priv);
>  void create_named_directory(ocfs2_filesys *fs, char *name, uint64_t 
> *blkno);
>  
>  #endif		/* __CORRUPT_H */
> diff --git a/fswreck/inode.c b/fswreck/inode.c
> index 83adae2..085092b 100644
> --- a/fswreck/inode.c
> +++ b/fswreck/inode.c
> @@ -176,13 +176,14 @@ static void damage_inode(ocfs2_filesys *fs, uint64_t 
> blkno,
>  void mess_up_inode_field(ocfs2_filesys *fs, enum fsck_type type, uint64_t 
> blkno)
>  {
>  	errcode_t ret;
> -	uint64_t tmpblkno;
> +	uint64_t tmpblkno = blkno;
>  	uint32_t clusters = 10;
>  
>  	char *buf = NULL;
>  	struct ocfs2_dinode *di;
>  
> -	create_file(fs, blkno, &tmpblkno);
> +	if (tmpblkno <= 0)
> +		create_file(fs, blkno, &tmpblkno);
>  
>  	if ((type == INODE_SPARSE_SIZE) || (type == INODE_SPARSE_CLUSTERS)) {
>  
> @@ -311,7 +312,7 @@ void mess_up_inline_flag(ocfs2_filesys *fs, enum 
> fsck_type type, uint64_t blkno)
>  	int i;
>  	errcode_t ret;
>  	char *buf = NULL, file_type[20];
> -	uint64_t inline_blkno;
> +	uint64_t inline_blkno = blkno;
>  	struct ocfs2_dinode *di;
>  	struct ocfs2_super_block *osb;
>  
> @@ -325,7 +326,7 @@ void mess_up_inline_flag(ocfs2_filesys *fs, enum 
> fsck_type type, uint64_t blkno)
>  		FSWRK_COM_FATAL(progname, ret);
>  
>  	for (i = 0; i < 2; i++) {
> -		if (i == 0) {
> +		if (i == 0 && inline_blkno <=0) {
>  			create_file(fs, blkno, &inline_blkno);
>  			snprintf(file_type, 20, "%s", "Regular file");
>  		} else {
> @@ -361,7 +362,7 @@ void mess_up_inline_inode(ocfs2_filesys *fs, enum 
> fsck_type type, uint64_t blkno
>  	int i;
>  	errcode_t ret;
>  	char *buf = NULL, file_type[20];
> -	uint64_t inline_blkno;
> +	uint64_t inline_blkno = blkno;
>  	struct ocfs2_dinode *di;
>  	uint16_t max_inline_sz;
>  	struct ocfs2_super_block *osb;
> @@ -376,7 +377,7 @@ void mess_up_inline_inode(ocfs2_filesys *fs, enum 
> fsck_type type, uint64_t blkno
>  		FSWRK_COM_FATAL(progname, ret);
>  
>  	for (i = 0; i < 2; i++) {
> -		if (i == 0) {
> +		if (i == 0 && inline_blkno <= 0) {
>  			create_file(fs, blkno, &inline_blkno);
>  			snprintf(file_type, 20, "%s", "Regular file");
>  		} else {
> diff --git a/fswreck/main.c b/fswreck/main.c
> index 016fc03..8763f2d 100644
> --- a/fswreck/main.c
> +++ b/fswreck/main.c
> @@ -29,6 +29,7 @@ char *progname = NULL;
>  
>  static char *device = NULL;
>  static uint16_t slotnum = UINT16_MAX;
> +static uint64_t ino = 0;	/* deem 0 as an invalid inode number */
>  
>  static int corrupt[NUM_FSCK_TYPE];
>  
> @@ -37,8 +38,11 @@ struct prompt_code {
>  	char		*pc_codestr;
>  	char		*pc_fsfeat;
>  	int		pc_slots;
> -	void		(*pc_func)(ocfs2_filesys *fs,
> -				   enum fsck_type code, uint16_t slotnum);
> +	/* @priv: different implementations of func decide how to use it,
> +	 * now only corrupt_file use this to get inode number.
> +	 */
> +	void		(*pc_func)(ocfs2_filesys *fs, enum fsck_type code,
> +				   uint16_t slotnum, void *priv);
>  	char		*pc_desc;
>  };
>  
> @@ -344,12 +348,13 @@ static void usage(void)
>  	g_print("%s is a program to corrupt a filesystem\n", progname);
>          g_print("***** THIS WILL DAMAGE YOUR FILESYSTEM.  USE AT YOUR OWN 
> RISK. *****\n");
>  	g_print("Usage: %s [-c corrupt-string] [-C corrupt-number] [-L corrupt-number] " 
> \
> -		"[-N slot-number] [-nlM] [DEVICE]\n", progname);
> +		"[-N slot-number] [-i inode-number] [-nlM] [DEVICE]\n", progname);
>  	g_print("	-c, -C, Corrupt the file system\n");
>  	g_print("	-L, Prints the corresponsing corrupt-string\n");
>  	g_print("	-l, Lists all the corrupt codes\n");
>  	g_print("	-n, Prints the total number of corrupt codes\n");
>  	g_print("	-M, Prints the mkfs options\n");
> +	g_print("	-i, Corrupt this inode instead of creating one internally\n");
>  	exit(0);
>  }
>  
> @@ -451,6 +456,7 @@ static int read_options(int argc, char **argv)
>  {
>  	int i, c, listcode = 0, showmkfs = 0;
>  	int ret = 0;
> +	char *dummy = NULL;
>  
>  	progname = basename(argv[0]);
>  
> @@ -458,7 +464,7 @@ static int read_options(int argc, char **argv)
>  		usage();
>  
>  	while (1) {
> -		c = getopt(argc, argv, "lnc:C:N:L:M");
> +		c = getopt(argc, argv, "lnc:C:N:L:i:M");
>  		if (c == -1)
>  			break;
>  
> @@ -495,6 +501,13 @@ static int read_options(int argc, char **argv)
>  		case 'N':	/* slotnum */
>  			slotnum = strtoul(optarg, NULL, 0);
>  			break;
> +		case 'i':	/* inode number */
> +			ino = strtoul(optarg, &dummy, 0);
> +			if (!ino || *dummy !='\0') {
> +				fprintf(stderr, "Invalid inode number.\n");
> +				exit(-1);
> +			}
> +			break;
>  
>  		default:
>  			ret = -1;
> @@ -597,7 +610,7 @@ int main(int argc, char **argv)
>  				progname, device, prompt_codes[i].pc_codestr,
>  				prompt_codes[i].pc_codenum);
>  			prompt_codes[i].pc_func(fs, prompt_codes[i].pc_codenum,
> -						slotnum);
> +						slotnum, &ino);
>  		}
>  	}
>  
> -- 
> 2.6.2



More information about the Ocfs2-tools-devel mailing list