[Ocfs2-tools-devel] [PATCH] fswreck: corrupt a given inode
zren at suse.com
zren at suse.com
Sat Mar 5 18:21:34 PST 2016
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