[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