[Ocfs2-tools-devel] [PATCH 1/1] Add corrupt code for inline data in fswreck:Revised

tristan tristan.ye at oracle.com
Mon Aug 11 21:45:36 PDT 2008


 Add corrupt code for inline data in fswreck,include both regular file
and dir.
 Mainly aims at corrupting the newly added checking codes in
fsck.ocfs2.checks for inline-data.

Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
---
 fswreck/corrupt.c           |   13 +++++
 fswreck/dir.c               |  107
+++++++++++++++++++++++++++++++++++++++++++
 fswreck/include/dir.h       |    2 +
 fswreck/include/fsck_type.h |   20 ++++++++
 fswreck/include/inode.h     |    2 +
 fswreck/include/main.h      |    5 ++-
 fswreck/inode.c             |  104
+++++++++++++++++++++++++++++++++++++++++
 fswreck/main.c              |    7 ++-
 8 files changed, 258 insertions(+), 2 deletions(-)

diff --git a/fswreck/corrupt.c b/fswreck/corrupt.c
index f698cb0..188b767 100644
--- a/fswreck/corrupt.c
+++ b/fswreck/corrupt.c
@@ -147,6 +147,19 @@ void corrupt_file(ocfs2_filesys *fs, int code,
uint16_t slotnum)
 	case CORRUPT_DIR_NOT_CONNECTED:
 		func = mess_up_dir_not_connected;
 		break;
+	case CORRUPT_REGULAR_INLINE_DATA_FLAG:
+		func = mess_up_regular_inline_flag;
+		break;
+	case CORRUPT_REGULAR_INLINE_DATA_SIZE:
+		func = mess_up_regular_inline_size;
+		break;
+	case CORRUPT_DIR_INLINE_DATA_FLAG:
+		func = mess_up_dir_inline_flag;
+		break;
+	case CORRUPT_DIR_INLINE_DATA_SIZE:
+		func = mess_up_dir_inline_size;
+		break;
+
 	default:
 		FSWRK_FATAL("Invalid code=%d", code);
 	}
diff --git a/fswreck/dir.c b/fswreck/dir.c
index 3338a17..4009e2f 100644
--- a/fswreck/dir.c
+++ b/fswreck/dir.c
@@ -452,3 +452,110 @@ void mess_up_dir_not_connected(ocfs2_filesys *fs,
uint64_t blkno)
 
 	return;
 }
+
+void create_inline_dir(ocfs2_filesys *fs, const char *dirname,
+		       uint64_t blkno, uint64_t *retblkno)
+{
+	errcode_t ret;
+	uint64_t tmp_blkno;
+
+	ret = ocfs2_check_directory(fs, blkno);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret  = ocfs2_new_inode(fs, &tmp_blkno, S_IFDIR | 0755);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_init_dir(fs, tmp_blkno, blkno);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_link(fs, blkno, dirname, tmp_blkno, OCFS2_FT_DIR);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	*retblkno = tmp_blkno;
+	return;
+}
+void mess_up_dir_inline_flag(ocfs2_filesys *fs, uint64_t blkno)
+{
+	char inline_dirname[OCFS2_MAX_FILENAME_LEN];
+	char *buf = NULL;
+	uint64_t inline_blkno;
+	errcode_t ret;
+	struct ocfs2_dinode *sb_di = fs->fs_super;
+	struct ocfs2_dinode *di;
+
+	/*mess up inline flag in inode*/
+	memset(inline_dirname, 0, sizeof(inline_dirname));
+	sprintf(inline_dirname, "testXXXXXX");
+	if (!mktemp(inline_dirname))
+		FSWRK_COM_FATAL(progname, errno);
+
+	create_inline_dir(fs, inline_dirname, blkno, &inline_blkno);
+
+	ret = ocfs2_malloc_block(fs->fs_io, &buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_read_inode(fs, inline_blkno, buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	di = (struct ocfs2_dinode *)buf;
+	if (!(di->i_dyn_features & OCFS2_INLINE_DATA_FL)) {
+		di->i_dyn_features |= OCFS2_INLINE_DATA_FL;
+		ret = ocfs2_write_inode(fs, inline_blkno, buf);
+		if (ret)
+			FSWRK_COM_FATAL(progname, ret);
+	}
+
+	if (buf)
+		ocfs2_free(&buf);
+	return;
+}
+void mess_up_dir_inline_size(ocfs2_filesys *fs, uint64_t blkno)
+{
+	char inline_dirname[OCFS2_MAX_FILENAME_LEN];
+	char *buf = NULL;
+	uint64_t inline_blkno;
+	errcode_t ret;
+	struct ocfs2_dinode *di;
+	uint16_t max_inline_sz;
+
+	/*mess up inline flag in inode*/
+	memset(inline_dirname, 0, sizeof(inline_dirname));
+	sprintf(inline_dirname, "testXXXXXX");
+	if (!mktemp(inline_dirname))
+		FSWRK_COM_FATAL(progname, errno);
+
+	create_inline_dir(fs, inline_dirname, blkno, &inline_blkno);
+
+	ret = ocfs2_malloc_block(fs->fs_io, &buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_read_inode(fs, inline_blkno, buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	di = (struct ocfs2_dinode *)buf;
+	max_inline_sz = ocfs2_max_inline_data(fs->fs_blocksize);
+
+	if (!(di->i_dyn_features & OCFS2_INLINE_DATA_FL))
+		di->i_dyn_features |= OCFS2_INLINE_DATA_FL;
+
+	/*mess up id_count,i_size and i_cluster in a inline inode*/
+	di->id2.i_data.id_count = 0;
+	di->i_size = max_inline_sz + 1;
+	di->i_clusters = 1;
+
+	ret = ocfs2_write_inode(fs, inline_blkno, buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	if (buf)
+		ocfs2_free(&buf);
+	return;
+}
diff --git a/fswreck/include/dir.h b/fswreck/include/dir.h
index 57afcfb..77e865c 100644
--- a/fswreck/include/dir.h
+++ b/fswreck/include/dir.h
@@ -30,5 +30,7 @@ void mess_up_dir_dot(ocfs2_filesys *fs, uint64_t
blkno);
 void mess_up_dir_ent(ocfs2_filesys *fs, uint64_t blkno);
 void mess_up_dir_parent_dup(ocfs2_filesys *fs, uint64_t blkno);
 void mess_up_dir_not_connected(ocfs2_filesys *fs, uint64_t blkno);
+void mess_up_dir_inline_flag(ocfs2_filesys *fs, uint64_t blkno);
+void mess_up_dir_inline_size(ocfs2_filesys *fs, uint64_t blkno);
 
 #endif		/* __DIR_H */
diff --git a/fswreck/include/fsck_type.h b/fswreck/include/fsck_type.h
index a6a4873..4785c3e 100644
--- a/fswreck/include/fsck_type.h
+++ b/fswreck/include/fsck_type.h
@@ -112,6 +112,14 @@ enum fsck_type
 	INODE_NOT_CONNECTED,
 	INODE_COUNT,
 	INODE_ORPHANED,
+	REGULAR_INLINE_DATA_FLAG,
+	REGULAR_INLINE_DATA_ID_COUNT,
+	REGULAR_INLINE_DATA_I_CLUSTER,
+	REGULAR_INLINE_DATA_I_SIZE,
+	DIR_INLINE_DATA_FLAG,
+	DIR_INLINE_DATA_ID_COUNT,
+	DIR_INLINE_DATA_I_CLUSTER,
+	DIR_INLINE_DATA_I_SIZE,
 	NUM_FSCK_TYPE
 };
 
@@ -184,5 +192,17 @@ enum fsck_type
  *
  * Directory not connected error: DIR_NOT_CONNECTED
  *
+ * Regular file inline-data flag error: REGULAR_INLINE_DATA_FLAG
+ *
+ * Regular inline file i_size,i_cluster and id_count error:
REGULAR_INLINE_DATA_ID_COUNT,
+							    REGULAR_INLINE_DATA_I_CLUSTER,
+							    REGULAR_INLINE_DATA_I_SIZE
+ *
+ * Directory inline-data flag error: DIR_INLINE_DATA_FLAG
+ *
+ * Inline directory  i_size,i_cluster and id_count error:
DIR_INLINE_DATA_ID_COUNT,
+							  DIR_INLINE_DATA_I_CLUSTER,
+							  DIR_INLINE_DATA_I_SIZE
+ *
  */
 #endif
diff --git a/fswreck/include/inode.h b/fswreck/include/inode.h
index d604e65..876abce 100644
--- a/fswreck/include/inode.h
+++ b/fswreck/include/inode.h
@@ -29,5 +29,7 @@ void mess_up_inode_field(ocfs2_filesys *fs, uint64_t
blkno);
 void mess_up_inode_not_connected(ocfs2_filesys *fs, uint64_t blkno);
 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_regular_inline_flag(ocfs2_filesys *fs, uint64_t blkno);
+void mess_up_regular_inline_size(ocfs2_filesys *fs, uint64_t blkno);
 
 #endif		/* __INODE_H */
diff --git a/fswreck/include/main.h b/fswreck/include/main.h
index de9b520..5fde568 100644
--- a/fswreck/include/main.h
+++ b/fswreck/include/main.h
@@ -106,8 +106,11 @@ enum{
 	CORRUPT_DIR_PARENT_DUP,
 	CORRUPT_DIR_NOT_CONNECTED,
 	CORRUPT_CLUSTER_AND_GROUP_DESC,
+	CORRUPT_REGULAR_INLINE_DATA_FLAG,
+	CORRUPT_REGULAR_INLINE_DATA_SIZE,
+	CORRUPT_DIR_INLINE_DATA_FLAG,
+	CORRUPT_DIR_INLINE_DATA_SIZE,
 	MAX_CORRUPT
-	
 };
 
 #define ARRAY_ELEMENTS(arr) (sizeof(arr) / sizeof(arr[0]))
diff --git a/fswreck/inode.c b/fswreck/inode.c
index f823117..0aff44b 100644
--- a/fswreck/inode.c
+++ b/fswreck/inode.c
@@ -224,3 +224,107 @@ void mess_up_inode_alloc(ocfs2_filesys *fs,
uint16_t slotnum)
 		ocfs2_free(&buf);
 	return;
 }
+
+void create_inline_file(ocfs2_filesys *fs, const char *filename,
+			uint64_t blkno, uint64_t *retblkno)
+{
+	errcode_t ret;
+	uint64_t tmp_blkno;
+
+	ret = ocfs2_check_directory(fs, blkno);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_new_inode(fs, &tmp_blkno, S_IFREG | 0755);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_link(fs, blkno, filename, tmp_blkno, OCFS2_FT_REG_FILE);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	*retblkno = tmp_blkno;
+	return;
+}
+void mess_up_regular_inline_flag(ocfs2_filesys *fs, uint64_t blkno)
+{
+	char inline_filename[OCFS2_MAX_FILENAME_LEN];
+	char *buf = NULL;
+	uint64_t inline_blkno;
+	errcode_t ret;
+	struct ocfs2_dinode *sb_di = fs->fs_super;
+	struct ocfs2_dinode *di;
+
+	/*mess up inline flag in inode*/
+	memset(inline_filename, 0, sizeof(inline_filename));
+	sprintf(inline_filename, "testXXXXXX");
+	if (!mktemp(inline_filename))
+		FSWRK_COM_FATAL(progname, errno);
+
+	create_inline_file(fs, inline_filename, blkno, &inline_blkno);
+
+	ret = ocfs2_malloc_block(fs->fs_io, &buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_read_inode(fs, inline_blkno, buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	di = (struct ocfs2_dinode *)buf;
+	if (!(di->i_dyn_features & OCFS2_INLINE_DATA_FL)) {
+		di->i_dyn_features |= OCFS2_INLINE_DATA_FL;
+		ret = ocfs2_write_inode(fs, inline_blkno, buf);
+		if (ret)
+			FSWRK_COM_FATAL(progname, ret);
+	}
+
+	if (buf)
+		ocfs2_free(&buf);
+	return;
+}
+
+void mess_up_regular_inline_size(ocfs2_filesys *fs, uint64_t blkno)
+{
+	char inline_filename[OCFS2_MAX_FILENAME_LEN];
+	char *buf = NULL;
+	uint64_t inline_blkno;
+	errcode_t ret;
+	struct ocfs2_dinode *di;
+	uint16_t max_inline_sz;
+
+	/*mess up inline flag in inode*/
+	memset(inline_filename, 0, sizeof(inline_filename));
+	sprintf(inline_filename, "testXXXXXX");
+	if (!mktemp(inline_filename))
+		FSWRK_COM_FATAL(progname, errno);
+
+	create_inline_file(fs, inline_filename, blkno, &inline_blkno);
+
+	ret = ocfs2_malloc_block(fs->fs_io, &buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	ret = ocfs2_read_inode(fs, inline_blkno, buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	di = (struct ocfs2_dinode *)buf;
+	max_inline_sz = ocfs2_max_inline_data(fs->fs_blocksize);
+
+	if (!(di->i_dyn_features & OCFS2_INLINE_DATA_FL))
+		di->i_dyn_features |= OCFS2_INLINE_DATA_FL;
+
+	/*mess up id_count,i_size and i_cluster in a inline inode*/
+	di->id2.i_data.id_count = 0;
+	di->i_size = max_inline_sz + 1;
+	di->i_clusters = 1;
+
+	ret = ocfs2_write_inode(fs, inline_blkno, buf);
+	if (ret)
+		FSWRK_COM_FATAL(progname, ret);
+
+	if (buf)
+		ocfs2_free(&buf);
+	return;
+}
diff --git a/fswreck/main.c b/fswreck/main.c
index b8afe08..777a4b0 100644
--- a/fswreck/main.c
+++ b/fswreck/main.c
@@ -88,7 +88,12 @@ static struct corrupt_funcs cf[MAX_CORRUPT] = {
 	{ &corrupt_file,	"Dirent field error: DIRENT_ZERO,
DIRENT_NAME_CHARS,DIRENT_INODE_RANGE, DIRENT_INODE_FREE, DIRENT_TYPE,
DIRENT_DUPLICATE, DIRENT_LENGTH"}, 
 	{ &corrupt_file,	"Directory parent duplicate error: DIR_PARENT_DUP"},
 	{ &corrupt_file,	"Directory not connected error: DIR_NOT_CONNECTED"},
-	{ &corrupt_group_desc,	"Create an error of GROUP_FREE_BITS and
CLUSTER_ALLOC_BITS, simulate bug841 in oss.oracle.com/bugzilla"}
+	{ &corrupt_group_desc,	"Create an error of GROUP_FREE_BITS and
CLUSTER_ALLOC_BITS, simulate bug841 in oss.oracle.com/bugzilla"},
+	{ &corrupt_file,        "Regular file inline-data flag
error :REGULAR_INLINE_DATA_FLAG"},
+	{ &corrupt_file,        "Regular file inline-data id_count,i_clusters
and i_size error : REGULAR_INLINE_DATA_ID_COUNT,
REGULAR_INLINE_DATA_I_CLUSTER, REGULAR_INLINE_DATA_I_SIZE "},
+	{ &corrupt_file,        "Directory inline-data flag
error :DIR_INLINE_DATA_FLAG"},
+	{ &corrupt_file,        "Directory inline-data id_count,i_clusters and
i_size error : DIR_INLINE_DATA_ID_COUNT, DIR_INLINE_DATA_I_CLUSTER,
DIR_INLINE_DATA_I_SIZE "}
+
 };
 
 static int corrupt[MAX_CORRUPT];
-- 
1.5.5





More information about the Ocfs2-tools-devel mailing list