[Ocfs2-tools-devel] [PATCH 1/3] Mess up super block's ECC

Goldwyn Rodrigues rgoldwyn at gmail.com
Mon Jun 20 10:31:46 PDT 2011


Mess up the ECC of a super block by changing the block_check values

Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.de>
---
 fswreck/Makefile            |    2 +-
 fswreck/corrupt.c           |    7 +++++++
 fswreck/include/corrupt.h   |    2 ++
 fswreck/include/fsck_type.h |    1 +
 fswreck/include/main.h      |    1 +
 fswreck/include/super.h     |   24 ++++++++++++++++++++++++
 fswreck/main.c              |    2 ++
 fswreck/super.c             |   38 ++++++++++++++++++++++++++++++++++++++
 8 files changed, 76 insertions(+), 1 deletions(-)
 create mode 100644 fswreck/include/super.h
 create mode 100644 fswreck/super.c

diff --git a/fswreck/Makefile b/fswreck/Makefile
index b1ee546..b870af7 100644
--- a/fswreck/Makefile
+++ b/fswreck/Makefile
@@ -10,7 +10,7 @@ INCLUDES += $(GLIB_CFLAGS)

 UNINST_PROGRAMS = fswreck

-CFILES = main.c corrupt.c chain.c extent.c group.c inode.c
local_alloc.c truncate_log.c special.c symlink.c dir.c journal.c
quota.c refcount.c discontig_bg.c
+CFILES = main.c corrupt.c chain.c extent.c group.c inode.c
local_alloc.c truncate_log.c special.c symlink.c dir.c journal.c
quota.c refcount.c discontig_bg.c super.c

 HFILES = 			\
 	include/chain.h		\
diff --git a/fswreck/corrupt.c b/fswreck/corrupt.c
index aa76dcc..03e1acd 100644
--- a/fswreck/corrupt.c
+++ b/fswreck/corrupt.c
@@ -462,3 +462,10 @@ void corrupt_discontig_bg(ocfs2_filesys *fs, enum
fsck_type type,
 {
 	mess_up_discontig_bg(fs, type, slotnum);
 }
+
+void corrupt_super(ocfs2_filesys *fs, enum fsck_type type,
+		uint16_t slotnum)
+{
+	mess_up_super(fs, type);
+}
+
diff --git a/fswreck/include/corrupt.h b/fswreck/include/corrupt.h
index 0fb7193..70c4b95 100644
--- a/fswreck/include/corrupt.h
+++ b/fswreck/include/corrupt.h
@@ -37,5 +37,7 @@ void corrupt_truncate_log(ocfs2_filesys *fs, enum
fsck_type type,
 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);
+void corrupt_super(ocfs2_filesys *fs, enum fsck_type type,
+			  uint16_t slotnum);

 #endif		/* __CORRUPT_H */
diff --git a/fswreck/include/fsck_type.h b/fswreck/include/fsck_type.h
index e58d343..7d810dd 100644
--- a/fswreck/include/fsck_type.h
+++ b/fswreck/include/fsck_type.h
@@ -162,6 +162,7 @@ enum fsck_type
 	REFCOUNT_REC_REDUNDANT,
 	REFCOUNT_COUNT_INVALID,
 	DUP_CLUSTERS_ADD_REFCOUNT,
+	INVALID_SUPER_ECC,
 	NUM_FSCK_TYPE
 };

diff --git a/fswreck/include/main.h b/fswreck/include/main.h
index 3175305..5d94c46 100644
--- a/fswreck/include/main.h
+++ b/fswreck/include/main.h
@@ -92,5 +92,6 @@
 #include "quota.h"
 #include "refcount.h"
 #include "discontig_bg.h"
+#include "super.h"

 #endif		/* __MAIN_H__ */
diff --git a/fswreck/include/super.h b/fswreck/include/super.h
new file mode 100644
index 0000000..43f9fbe
--- /dev/null
+++ b/fswreck/include/super.h
@@ -0,0 +1,24 @@
+/*
+ * super.h
+ *
+ * Function prototypes, macros, etc. for related 'C' files
+ *
+ * Copyright (C) 2011 Suse/Attachmate.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+
+
+#ifndef _FSWRECK_SUPER_H_
+#define _FSWRECK_SUPER_H_
+
+void mess_up_super(ocfs2_filesys *fs, enum fsck_type type);
+#endif          /* _FSWRECK_SUPER_H_ */
+
diff --git a/fswreck/main.c b/fswreck/main.c
index b1b2fcb..a6d6924 100644
--- a/fswreck/main.c
+++ b/fswreck/main.c
@@ -316,6 +316,8 @@ static struct prompt_code prompt_codes[NUM_FSCK_TYPE] = {
 			   "corrupt extent rec for a discontig bg"),
 	define_prompt_code(DISCONTIG_BG_LEAF_CLUSTERS, corrupt_discontig_bg,
 			   "corrupt extent rec's clusters for a discontig bg"),
+	define_prompt_code(INVALID_SUPER_ECC, corrupt_super,
+			   "corrupt superblock's ecc"),
 };

 #undef define_prompt_code
diff --git a/fswreck/super.c b/fswreck/super.c
new file mode 100644
index 0000000..2fc795c
--- /dev/null
+++ b/fswreck/super.c
@@ -0,0 +1,38 @@
+/* -*- mode: c; c-basic-offset: 8; -*-
+ * vim: noexpandtab sw=8 ts=8 sts=0:
+ *
+ * super.c
+ *
+ * Copyright (C) 2011 Suse/Attachmate.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+
+#include "main.h"
+
+void mess_up_super(ocfs2_filesys *fs, enum fsck_type type)
+{
+	struct ocfs2_dinode *di;
+	struct ocfs2_block_check bc;
+	char *buf;
+	errcode_t ret = ocfs2_malloc_block(fs->fs_io, &buf);
+	if (ret)
+		return;
+
+	memcpy(buf, fs->fs_super, fs->fs_blocksize);
+	di = (char *) buf;
+	bc = di->i_check;
+	bc.bc_ecc ^= 7;
+	bc.bc_crc32e ^= 15;
+	di->i_check = bc;
+	ocfs2_swap_inode_from_cpu(fs, di);
+	io_write_block(fs->fs_io, di->i_blkno, 1, buf);
+	ocfs2_free(&buf);
+}
-- 
1.7.3.4


-- 
Goldwyn



More information about the Ocfs2-tools-devel mailing list