[Ocfs2-tools-devel] [PATCH 1/3] Create holes in directories
Goldwyn Rodrigues
rgoldwyn at gmail.com
Tue Aug 16 15:03:32 PDT 2011
On Tue, Aug 16, 2011 at 12:54 AM, Tiger Yang <tiger.yang at oracle.com> wrote:
> Hi, Goldwyn,
> I have few comments, some are coding style issues. And Sunil and Joel said
> we should fix three positions of hole on a directory, at the beginning, at
> the middle and at the end. This patch did not create such holes.
>
Yes, the holes were in the middle and the end only. I will put the
hole in the begining as well.
Thanks for the review.
>
> On 08/13/2011 06:33 AM, Goldwyn Rodrigues wrote:
>>
>> The patch adds the feature to create holes in a directory.
>> It works on two directories and creates files alternatively in both of
>> them.
>>
>> Finally, it changes the offset of the [1]th extent record and
>> increases the filesize.
>>
>> Signed-off-by: Goldwyn Rodrigues<rgoldwyn at suse.de>
>> ---
>> fswreck/corrupt.c | 5 +++-
>> fswreck/dir.c | 63
>> +++++++++++++++++++++++++++++++-----------
>> fswreck/include/corrupt.h | 1 +
>> fswreck/include/fsck_type.h | 1 +
>> fswreck/main.c | 2 +
>> 5 files changed, 54 insertions(+), 18 deletions(-)
>>
>> diff --git a/fswreck/corrupt.c b/fswreck/corrupt.c
>> index aa76dcc..161b078 100644
>> --- a/fswreck/corrupt.c
>> +++ b/fswreck/corrupt.c
>> @@ -28,7 +28,7 @@
>>
>> extern char *progname;
>>
>> -static void create_named_directory(ocfs2_filesys *fs, char *dirname,
>> +void create_named_directory(ocfs2_filesys *fs, char *dirname,
>> uint64_t *blkno)
>> {
>> errcode_t ret;
>> @@ -151,6 +151,9 @@ void corrupt_file(ocfs2_filesys *fs, enum
>> fsck_type type, uint16_t slotnum)
>> case DIR_ZERO:
>> func = mess_up_dir_inode;
>> break;
>> + case DIR_HOLE:
>> + func = mess_up_dir_inode;
>> + break;
>> case DIRENT_DOTTY_DUP:
>> func = mess_up_dir_dot;
>> break;
>> diff --git a/fswreck/dir.c b/fswreck/dir.c
>> index eb8d0f2..1ee8394 100644
>> --- a/fswreck/dir.c
>> +++ b/fswreck/dir.c
>> @@ -464,10 +464,12 @@ void mess_up_dir_parent_dup(ocfs2_filesys *fs,
>> enum fsck_type type,
>> void mess_up_dir_inode(ocfs2_filesys *fs, enum fsck_type type, uint64_t
>> blkno)
>> {
>> errcode_t ret;
>> - char *buf = NULL;
>> - struct ocfs2_dinode *di;
>> + char *buf = NULL, *buf2 = NULL;
>> + struct ocfs2_dinode *di, *di2;
>> struct ocfs2_extent_list *el;
>> - uint64_t tmp_blkno;
>> + uint64_t tmp_blkno, file_ino, dir2;
>> + int i;
>> + struct ocfs2_extent_rec *er;
>>
>> create_directory(fs, blkno,&tmp_blkno);
>>
>> @@ -475,6 +477,10 @@ void mess_up_dir_inode(ocfs2_filesys *fs, enum
>> fsck_type type, uint64_t blkno)
>> if (ret)
>> FSWRK_COM_FATAL(progname, ret);
>>
>> + ret = ocfs2_malloc_block(fs->fs_io,&buf2);
>> + if (ret)
>> + FSWRK_COM_FATAL(progname, ret);
>> +
>> ret = ocfs2_read_inode(fs, tmp_blkno, buf);
>> if (ret)
>> FSWRK_COM_FATAL(progname, ret);
>> @@ -484,22 +490,43 @@ void mess_up_dir_inode(ocfs2_filesys *fs, enum
>> fsck_type type, uint64_t blkno)
>> if (!(di->i_flags& OCFS2_VALID_FL))
>> FSWRK_FATAL("not a valid file");
>>
>> - if (di->i_dyn_features& OCFS2_INLINE_DATA_FL) {
>> -
>> - FSWRK_FATAL("Inlined directory");
>> -
>> - } else {
>> -
>> - el =&(di->id2.i_list);
>> - if (el->l_next_free_rec == 0)
>> - FSWRK_FATAL("directory empty");
>> -
>> - el->l_next_free_rec = 0;
>> + switch(type) {
>
> space required before the open parenthesis '('
>>
>> + case DIR_HOLE:
>
> switch and case should be at the same indent
>>
>> + create_named_directory(fs, "tmp1",&dir2);
>> + for (i = 0; i< fs->fs_blocksize; i++) {
>> + if (i%2)
>> + create_file(fs, blkno,&file_ino);
>> + else
>> + create_file(fs, dir2,&file_ino);
>> + }
>> + ret = ocfs2_read_inode(fs, dir2, buf2);
>> + di2 = (struct ocfs2_dinode *)buf2;
>> + el =&(di2->id2.i_list);
>> + er =&(el->l_recs[1]);
>> + er->e_cpos += 3;
>> + di2->i_size += 23 * fs->fs_blocksize;
>> + ret = ocfs2_write_inode(fs, dir2, buf2);
>> + fprintf(stdout, "DIR_HOLE: Messed up extent
>> record"
>> + " of %"PRIu64" to show a hole.\n",
>> + di->i_blkno);
>
> I think this should be di2.
>>
>> + break;
>> + case DIR_ZERO:
>> + if (di->i_dyn_features& OCFS2_INLINE_DATA_FL) {
>> + FSWRK_FATAL("Inlined directory");
>> + } else {
>> + el =&(di->id2.i_list);
>> + if (el->l_next_free_rec == 0)
>> + FSWRK_FATAL("directory empty");
>> + el->l_next_free_rec = 0;
>> + }
>> + fprintf(stdout, "DIR_ZERO: "
>> + "Corrupt directory#%"PRIu64", empty its"
>> + " content.\n", tmp_blkno);
>> + break;
>> + default:
>> + fprintf(stdout, "Invalid code passed for dir\n");
>> }
>>
>> - fprintf(stdout, "DIR_ZERO: "
>> - "Corrupt directory#%"PRIu64", empty its content.\n",
>> - tmp_blkno);
>>
>> ret = ocfs2_write_inode(fs, tmp_blkno, buf);
>> if (ret)
>> @@ -507,6 +534,8 @@ void mess_up_dir_inode(ocfs2_filesys *fs, enum
>> fsck_type type, uint64_t blkno)
>>
>> if (buf)
>> ocfs2_free(&buf);
>> + if (buf2)
>> + ocfs2_free(&buf2);
>> return;
>> }
>>
>> diff --git a/fswreck/include/corrupt.h b/fswreck/include/corrupt.h
>> index 0fb7193..7037b16 100644
>> --- a/fswreck/include/corrupt.h
>> +++ b/fswreck/include/corrupt.h
>> @@ -37,5 +37,6 @@ 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 create_named_directory(ocfs2_filesys *fs, char *name, uint64_t
>> *blkno);
>>
>> #endif /* __CORRUPT_H */
>> diff --git a/fswreck/include/fsck_type.h b/fswreck/include/fsck_type.h
>> index e58d343..c18a134 100644
>> --- a/fswreck/include/fsck_type.h
>> +++ b/fswreck/include/fsck_type.h
>> @@ -101,6 +101,7 @@ enum fsck_type
>> LINK_SIZE,
>> LINK_BLOCKS,
>> DIR_ZERO,
>> + DIR_HOLE,
>> INODE_SIZE,
>> INODE_SPARSE_SIZE,
>> INODE_CLUSTERS,
>> diff --git a/fswreck/main.c b/fswreck/main.c
>> index b1b2fcb..14b0301 100644
>> --- a/fswreck/main.c
>> +++ b/fswreck/main.c
>> @@ -117,6 +117,8 @@ static struct prompt_code prompt_codes[NUM_FSCK_TYPE]
>> = {
>> "Corrupt dir's dotdot entry's ino it points
>> to"),
>> define_prompt_code(DIR_ZERO, corrupt_file,
>> "Corrupt directory, empty its content"),
>> + define_prompt_code(DIR_HOLE, corrupt_file,
>> + "Create a hole in the directory"),
>> define_prompt_code(DIRENT_DOTTY_DUP, corrupt_file,
>> "Duplicate '.' dirent to a directory"),
>> define_prompt_code(DIRENT_NOT_DOTTY, corrupt_file,
>
>
While working on this, I thought that the reverse of a hole can also
be a problem. That is, when the extents overlap. I will furnish it in
the patches which I shall send soon.
Regards,
--
Goldwyn
More information about the Ocfs2-tools-devel
mailing list