[Ocfs2-tools-devel] [PATCH] Make duplicate clusters via fswreck

Sunil Mushran sunil.mushran at oracle.com
Tue Jun 2 22:02:22 PDT 2009


Looks good.

Joel Becker wrote:
> Hey folks,
> 	Here's my quick and dirty change to fswreck that will allocate
> the same cluster to two inodes.
>
> Joel
>
> diff --git a/fswreck/corrupt.c b/fswreck/corrupt.c
> index 50f063b..09ebe17 100644
> --- a/fswreck/corrupt.c
> +++ b/fswreck/corrupt.c
> @@ -1,4 +1,6 @@
> -/*
> +/* -*- mode: c; c-basic-offset: 8; -*-
> + * vim: noexpandtab sw=8 ts=8 sts=0:
> + *
>   * corrupt.c
>   *
>   * corruption routines
> @@ -154,6 +156,9 @@ void corrupt_file(ocfs2_filesys *fs, int code, uint16_t slotnum)
>  	case CORRUPT_INLINE_DATA_COUNT:
>  		func = mess_up_inline_count;
>  		break;
> +	case CORRUPT_DUPLICATE_CLUSTERS:
> +		func = mess_up_dup_clusters;
> +		break;
>  	default:
>  		FSWRK_FATAL("Invalid code=%d", code);
>  	}
> diff --git a/fswreck/include/inode.h b/fswreck/include/inode.h
> index 6094a0a..6f98e94 100644
> --- a/fswreck/include/inode.h
> +++ b/fswreck/include/inode.h
> @@ -31,5 +31,6 @@ void mess_up_inode_orphaned(ocfs2_filesys *fs, uint16_t slotnum);
>  void mess_up_inode_alloc(ocfs2_filesys *fs, uint16_t slotnum);
>  void mess_up_inline_flag(ocfs2_filesys *fs, uint64_t blkno);
>  void mess_up_inline_count(ocfs2_filesys *fs, uint64_t blkno);
> +void mess_up_dup_clusters(ocfs2_filesys *fs, uint64_t blkno);
>  
>  #endif		/* __INODE_H */
> diff --git a/fswreck/include/main.h b/fswreck/include/main.h
> index e201672..96230f4 100644
> --- a/fswreck/include/main.h
> +++ b/fswreck/include/main.h
> @@ -108,6 +108,7 @@ enum{
>  	CORRUPT_CLUSTER_AND_GROUP_DESC,
>  	CORRUPT_INLINE_DATA_FLAG,
>  	CORRUPT_INLINE_DATA_COUNT,
> +        CORRUPT_DUPLICATE_CLUSTERS,
>  	MAX_CORRUPT
>  };
>  
> diff --git a/fswreck/inode.c b/fswreck/inode.c
> index 701472c..ac2dfff 100644
> --- a/fswreck/inode.c
> +++ b/fswreck/inode.c
> @@ -1,4 +1,6 @@
> -/*
> +/* -*- mode: c; c-basic-offset: 8; -*-
> + * vim: noexpandtab sw=8 ts=8 sts=0:
> + *
>   * inode.c
>   *
>   * inode fields corruptions
> @@ -333,3 +335,75 @@ void mess_up_inline_count(ocfs2_filesys *fs, uint64_t blkno)
>  
>  	return;
>  }
> +
> +void mess_up_dup_clusters(ocfs2_filesys *fs, uint64_t blkno)
> +{
> +	errcode_t err;
> +	char *buf = NULL;
> +	uint64_t inode1_blkno, inode2_blkno;
> +	struct ocfs2_dinode *di1, *di2;
> +	struct ocfs2_extent_list *el1, *el2;
> +
> +	err = ocfs2_malloc_blocks(fs->fs_io, 2, &buf);
> +	if (err)
> +		FSWRK_COM_FATAL(progname, err);
> +
> +	create_file(fs, blkno, &inode1_blkno);
> +	create_file(fs, blkno, &inode2_blkno);
> +
> +	di1 = (struct ocfs2_dinode *)buf;
> +	err = ocfs2_read_inode(fs, inode1_blkno, (char *)di1);
> +	if (err)
> +		FSWRK_COM_FATAL(progname, err);
> +
> +	di2 = (struct ocfs2_dinode *)(buf + fs->fs_blocksize);
> +	err = ocfs2_read_inode(fs, inode2_blkno, (char *)di2);
> +	if (err)
> +		FSWRK_COM_FATAL(progname, err);
> +
> +	if (ocfs2_support_inline_data(OCFS2_RAW_SB(fs->fs_super))) {
> +		if (di1->i_dyn_features & OCFS2_INLINE_DATA_FL) {
> +			di1->i_dyn_features &= ~OCFS2_INLINE_DATA_FL;
> +			err = ocfs2_write_inode(fs, inode1_blkno, (char *)di1);
> +			if (err)
> +				FSWRK_COM_FATAL(progname, err);
> +		}
> +		if (di2->i_dyn_features & OCFS2_INLINE_DATA_FL) {
> +			di2->i_dyn_features &= ~OCFS2_INLINE_DATA_FL;
> +			err = ocfs2_write_inode(fs, inode1_blkno, (char *)di2);
> +			if (err)
> +				FSWRK_COM_FATAL(progname, err);
> +		}
> +	}
> +
> +	err = ocfs2_extend_allocation(fs, inode1_blkno, 1);
> +	if (err)
> +		FSWRK_COM_FATAL(progname, err);
> +
> +	/* Re-read the inode with the allocation */
> +	err = ocfs2_read_inode(fs, inode1_blkno, (char *)di1);
> +	if (err)
> +		FSWRK_COM_FATAL(progname, err);
> +
> +	/* Set i_size to non-zero so that the allocation is valid */
> +	di1->i_size = fs->fs_clustersize;
> +	err = ocfs2_write_inode(fs, inode1_blkno, (char *)di1);
> +	if (err)
> +		FSWRK_COM_FATAL(progname, err);
> +
> +	el1 = &(di1->id2.i_list);
> +	el2 = &(di2->id2.i_list);
> +
> +	el2->l_next_free_rec = el1->l_next_free_rec;
> +	el2->l_recs[0] = el1->l_recs[0];
> +
> +	di2->i_size = di1->i_size;
> +	di2->i_clusters = di1->i_clusters;
> +
> +	err = ocfs2_write_inode(fs, inode2_blkno, (char *)di2);
> +	if (err)
> +		FSWRK_COM_FATAL(progname, err);
> +
> +	ocfs2_free(&buf);
> +}
> +
> diff --git a/fswreck/main.c b/fswreck/main.c
> index 39502e1..bc889d8 100644
> --- a/fswreck/main.c
> +++ b/fswreck/main.c
> @@ -91,6 +91,7 @@ static struct corrupt_funcs cf[MAX_CORRUPT] = {
>  	{ &corrupt_group_desc,	"Create an error of GROUP_FREE_BITS and CLUSTER_ALLOC_BITS, simulate bug841 in oss.oracle.com/bugzilla"},
>  	{ &corrupt_file,        "Inline file dyn_features flag error: INLINE_DATA_FLAG_INVALID"},
>  	{ &corrupt_file,        "Inline file id_count,i_clusters and i_size error: INLINE_DATA_COUNT_INVALID"},
> +	{ &corrupt_file,        "Allocate the same cluster to two different files"},
>  
>  };
>  
>   




More information about the Ocfs2-tools-devel mailing list