[Ocfs2-tools-devel] [PATCH 1/1] Ocfs2-tools: Add new corruptions of inline-data for fswreck.v2
Tristan Ye
tristan.ye at oracle.com
Mon Sep 8 23:31:59 PDT 2008
Add two corruptions of inline-data for fswreck,their corruptions were 44 and 45,
The former one attempts to mess up the inline-data flag for regular file and directory,
that means create a inode with inline-data flag set on a noinline-data supported volume.
The latter one will try to mess up the id_count,i_size and i_clusters for regular file and directory.
that means it will mess up the flags in a inlined inode like this:
id_count = 0;
i_size = max_inline_sz + 1;
i_clusters = 1;
>From v1 to v2,did following modification,
Output readable info for users.
check volume flag before corruption.
Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
---
fswreck/corrupt.c | 11 +++-
fswreck/dir.c | 2 +-
fswreck/include/dir.h | 2 +
fswreck/include/fsck_type.h | 6 ++
fswreck/include/inode.h | 2 +
fswreck/include/main.h | 3 +-
fswreck/inode.c | 143 ++++++++++++++++++++++++++++++++++++++----
fswreck/main.c | 5 +-
8 files changed, 155 insertions(+), 19 deletions(-)
diff --git a/fswreck/corrupt.c b/fswreck/corrupt.c
index f698cb0..50f063b 100644
--- a/fswreck/corrupt.c
+++ b/fswreck/corrupt.c
@@ -78,7 +78,8 @@ void corrupt_chains(ocfs2_filesys *fs, int code, uint16_t slotnum)
return ;
}
-static void create_directory(ocfs2_filesys *fs, char *dirname, uint64_t *blkno)
+static void create_named_directory(ocfs2_filesys *fs, char *dirname,
+ uint64_t *blkno)
{
errcode_t ret;
struct ocfs2_super_block *sb = OCFS2_RAW_SB(fs->fs_super);
@@ -147,11 +148,17 @@ 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_INLINE_DATA_FLAG:
+ func = mess_up_inline_flag;
+ break;
+ case CORRUPT_INLINE_DATA_COUNT:
+ func = mess_up_inline_count;
+ break;
default:
FSWRK_FATAL("Invalid code=%d", code);
}
- create_directory(fs, "tmp", &blkno);
+ create_named_directory(fs, "tmp", &blkno);
if (func)
func(fs, blkno);
diff --git a/fswreck/dir.c b/fswreck/dir.c
index 3338a17..694b07c 100644
--- a/fswreck/dir.c
+++ b/fswreck/dir.c
@@ -43,7 +43,7 @@
extern char *progname;
-static void create_directory(ocfs2_filesys *fs,
+void create_directory(ocfs2_filesys *fs,
uint64_t parentblk, uint64_t *blkno)
{
errcode_t ret;
diff --git a/fswreck/include/dir.h b/fswreck/include/dir.h
index 57afcfb..c534f1b 100644
--- a/fswreck/include/dir.h
+++ b/fswreck/include/dir.h
@@ -31,4 +31,6 @@ 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 create_directory(ocfs2_filesys *fs, uint64_t parentblk, uint64_t *blkno);
+
#endif /* __DIR_H */
diff --git a/fswreck/include/fsck_type.h b/fswreck/include/fsck_type.h
index a6a4873..a03333d 100644
--- a/fswreck/include/fsck_type.h
+++ b/fswreck/include/fsck_type.h
@@ -112,6 +112,8 @@ enum fsck_type
INODE_NOT_CONNECTED,
INODE_COUNT,
INODE_ORPHANED,
+ INLINE_DATA_FLAG_INVALID,
+ INLINE_DATA_COUNT_INVALID,
NUM_FSCK_TYPE
};
@@ -184,5 +186,9 @@ enum fsck_type
*
* Directory not connected error: DIR_NOT_CONNECTED
*
+ * Inline file flag error: INLINE_DATA_FLAG_INVALID
+ *
+ * Inline file id_count error: INLINE_DATA_COUNT_INVALID
+ *
*/
#endif
diff --git a/fswreck/include/inode.h b/fswreck/include/inode.h
index d604e65..6094a0a 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_inline_flag(ocfs2_filesys *fs, uint64_t blkno);
+void mess_up_inline_count(ocfs2_filesys *fs, uint64_t blkno);
#endif /* __INODE_H */
diff --git a/fswreck/include/main.h b/fswreck/include/main.h
index de9b520..e201672 100644
--- a/fswreck/include/main.h
+++ b/fswreck/include/main.h
@@ -106,8 +106,9 @@ enum{
CORRUPT_DIR_PARENT_DUP,
CORRUPT_DIR_NOT_CONNECTED,
CORRUPT_CLUSTER_AND_GROUP_DESC,
+ CORRUPT_INLINE_DATA_FLAG,
+ CORRUPT_INLINE_DATA_COUNT,
MAX_CORRUPT
-
};
#define ARRAY_ELEMENTS(arr) (sizeof(arr) / sizeof(arr[0]))
diff --git a/fswreck/inode.c b/fswreck/inode.c
index f823117..731fc25 100644
--- a/fswreck/inode.c
+++ b/fswreck/inode.c
@@ -9,12 +9,12 @@
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
- *
+ *
* 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.
- *
+ *
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
@@ -27,7 +27,7 @@
* Inode field error: INODE_SUBALLOC, INODE_GEN, INODE_GEN_FIX,INODE_BLKNO,
INODE_NZ_DTIME, INODE_SIZE, INODE_CLUSTERS, INODE_COUNT
*
- * Inode link not connected error: INODE_LINK_NOT_CONNECTED
+ * Inode link not connected error: INODE_LINK_NOT_CONNECTED
*
* Inode orphaned error: INODE_ORPHANED
*
@@ -47,12 +47,12 @@ static void damage_inode(ocfs2_filesys *fs, uint64_t blkno,
struct ocfs2_dinode *di;
ret = ocfs2_malloc_block(fs->fs_io, &buf);
- if (ret)
- FSWRK_COM_FATAL(progname, ret);
+ if (ret)
+ FSWRK_COM_FATAL(progname, ret);
ret = ocfs2_read_inode(fs, blkno, buf);
if (ret)
- FSWRK_COM_FATAL(progname, ret);
+ FSWRK_COM_FATAL(progname, ret);
di = (struct ocfs2_dinode *)buf;
@@ -70,7 +70,7 @@ static void damage_inode(ocfs2_filesys *fs, uint64_t blkno,
fprintf(stdout, "INODE_GEN_FIX: "
"Corrupt inode#%"PRIu64", change generation "
" from %u to 0x1234, please answer 'n' when "
- "INODE_GEN error shows in fsck.ocfs2\n",
+ "INODE_GEN error shows in fsck.ocfs2\n",
blkno, di->i_fs_generation);
di->i_fs_generation = 0x1234;
break;
@@ -116,7 +116,7 @@ static void damage_inode(ocfs2_filesys *fs, uint64_t blkno,
default:
FSWRK_FATAL("Invalid type[%d]\n", type);
}
-
+
ret = ocfs2_write_inode(fs, blkno, buf);
if (ret)
FSWRK_COM_FATAL(progname, ret);
@@ -136,7 +136,7 @@ void mess_up_inode_field(ocfs2_filesys *fs, uint64_t blkno)
INODE_NZ_DTIME, INODE_SUBALLOC,
INODE_SIZE, INODE_CLUSTERS,
INODE_COUNT};
-
+
for (i = 0; i < ARRAY_ELEMENTS(types); i++) {
create_file(fs, blkno, &tmpblkno);
@@ -147,7 +147,7 @@ void mess_up_inode_field(ocfs2_filesys *fs, uint64_t blkno)
}
damage_inode(fs, tmpblkno, types[i]);
- }
+ }
return;
}
@@ -174,14 +174,14 @@ void mess_up_inode_orphaned(ocfs2_filesys *fs, uint16_t slotnum)
if (slotnum == UINT16_MAX)
slotnum = 0;
- snprintf(parentdir, sizeof(parentdir),
+ snprintf(parentdir, sizeof(parentdir),
ocfs2_system_inodes[ORPHAN_DIR_SYSTEM_INODE].si_name, slotnum);
-
+
ret = ocfs2_lookup(fs, sb->s_system_dir_blkno, parentdir,
strlen(parentdir), NULL, &blkno);
if (ret)
FSWRK_COM_FATAL(progname, ret);
-
+
create_file(fs, blkno, &tmpblkno);
fprintf(stdout, "INODE_ORPHANED: "
@@ -202,7 +202,7 @@ void mess_up_inode_alloc(ocfs2_filesys *fs, uint16_t slotnum)
FSWRK_COM_FATAL(progname, ret);
ret = ocfs2_malloc_block(fs->fs_io, &buf);
- if (ret)
+ if (ret)
FSWRK_COM_FATAL(progname, ret);
ret = ocfs2_read_inode(fs, tmpblkno, buf);
@@ -224,3 +224,118 @@ void mess_up_inode_alloc(ocfs2_filesys *fs, uint16_t slotnum)
ocfs2_free(&buf);
return;
}
+
+void mess_up_inline_flag(ocfs2_filesys *fs, uint64_t blkno)
+{
+
+ int i;
+ errcode_t ret;
+ char *buf = NULL, file_type[20];
+ uint64_t inline_blkno;
+ struct ocfs2_dinode *di;
+ struct ocfs2_super_block *osb;
+
+ osb = OCFS2_RAW_SB(fs->fs_super);
+ if (ocfs2_support_inline_data(osb)) {
+ fprintf(stderr, "Should specify a noinline-data supported "
+ "volume to do this corruption\n");
+ goto bail;
+ }
+
+ ret = ocfs2_malloc_block(fs->fs_io, &buf);
+ if (ret)
+ FSWRK_COM_FATAL(progname, ret);
+
+ for (i = 0; i < 2; i++) {
+ if (i == 0) {
+ create_file(fs, blkno, &inline_blkno);
+ snprintf(file_type, 20, "%s", "Regular file");
+ } else {
+ create_directory(fs, blkno, &inline_blkno);
+ snprintf(file_type, 20, "%s", "Diectory");
+ }
+
+ 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);
+ }
+
+ fprintf(stdout, "INLINE_DATA_FLAG_INVALID: "
+ "Create an inlined inode#%"PRIu64"(%s) "
+ "on a noinline-data supported volume\n",
+ inline_blkno, file_type);
+ }
+
+bail:
+ if (buf)
+ ocfs2_free(&buf);
+ return;
+}
+
+void mess_up_inline_count(ocfs2_filesys *fs, uint64_t blkno)
+{
+ int i;
+ errcode_t ret;
+ char *buf = NULL, file_type[20];
+ uint64_t inline_blkno;
+ struct ocfs2_dinode *di;
+ uint16_t max_inline_sz;
+ struct ocfs2_super_block *osb;
+
+ osb = OCFS2_RAW_SB(fs->fs_super);
+ if (!ocfs2_support_inline_data(osb)) {
+ fprintf(stderr, "Should specify a inline-data supported "
+ "volume to do this corruption\n");
+ goto bail;
+ }
+
+ ret = ocfs2_malloc_block(fs->fs_io, &buf);
+ if (ret)
+ FSWRK_COM_FATAL(progname, ret);
+
+ for (i = 0; i < 2; i++) {
+ if (i == 0) {
+ create_file(fs, blkno, &inline_blkno);
+ snprintf(file_type, 20, "%s", "Regular file");
+ } else {
+ create_directory(fs, blkno, &inline_blkno);
+ snprintf(file_type, 20, "%s", "Diectroy");
+ }
+
+ 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;
+
+ 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);
+
+ fprintf(stdout, "INLINE_DATA_COUNT_INVALID: "
+ "Create an inlined inode#%"PRIu64"(%s),"
+ "whose id_count, i_size and i_clusters "
+ "been messed up\n", inline_blkno, file_type);
+ }
+
+bail:
+ if (buf)
+ ocfs2_free(&buf);
+
+ return;
+}
diff --git a/fswreck/main.c b/fswreck/main.c
index b8afe08..8e087dc 100644
--- a/fswreck/main.c
+++ b/fswreck/main.c
@@ -88,7 +88,10 @@ 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, "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"},
+
};
static int corrupt[MAX_CORRUPT];
--
1.5.5
More information about the Ocfs2-tools-devel
mailing list