[Ocfs2-tools-devel] [PATCH] debugfs.ocfs2: fix dump_block_check for big-endian

Goldwyn Rodrigues rgoldwyn at gmail.com
Wed Jul 6 16:13:17 PDT 2011


Hi Sunil,

On Wed, Jul 6, 2011 at 5:26 PM, Sunil Mushran <sunil.mushran at oracle.com> wrote:
> looks good. assuming it was tested on both little and big endian box.

Yes, I tested it on s390x and x86_64.

> if so, you can check it in with my ack.

me? How? Do I have the rights?
If you meant SLES, yes we will include once it is well tested at a larger scale.

>
> On 07/06/2011 03:19 PM, Goldwyn Rodrigues wrote:
>>
>> The block check or metaecc code expects the data to be in little-endian
>> format for calculating CRC and ECC. However, with big-endian machines,
>> the block is in big-endian format.
>>
>> Convert the block to little-endian format before feeding to meta ecc
>> computation. After computing, change data format back to CPU.
>>
>> Signed-off-by: Goldwyn Rodrigues<rgoldwyn at suse.de>
>>
>> ---
>> diff --git a/debugfs.ocfs2/dump.c b/debugfs.ocfs2/dump.c
>> index ad58126..d54c31a 100644
>> --- a/debugfs.ocfs2/dump.c
>> +++ b/debugfs.ocfs2/dump.c
>> @@ -166,10 +166,74 @@ void dump_block_check(FILE *out, struct
>> ocfs2_block_check *bc, void *block)
>>  {
>>        struct ocfs2_block_check tmp = *bc;
>>        int crc_fail;
>> +       enum dump_block_type bt = detect_block(block);
>> +
>> +       /* Swap block to little endian for compute_meta_ecc */
>> +       switch (bt) {
>> +               case DUMP_BLOCK_INODE:
>> +                       ocfs2_swap_inode_from_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_EXTENT_BLOCK:
>> +                       ocfs2_swap_extent_block_from_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_GROUP_DESCRIPTOR:
>> +                       ocfs2_swap_group_desc_from_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_DIR_BLOCK:
>> +                       ocfs2_swap_dir_entries_from_cpu(block,
>> +                                       gbls.fs->fs_blocksize);
>> +                       break;
>> +               case DUMP_BLOCK_XATTR:
>> +                       ocfs2_swap_xattr_block_from_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_REFCOUNT:
>> +                       ocfs2_swap_refcount_block_from_cpu(gbls.fs,
>> block);
>> +                       break;
>> +               case DUMP_BLOCK_DXROOT:
>> +                       ocfs2_swap_dx_root_from_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_DXLEAF:
>> +                       ocfs2_swap_dx_leaf_from_cpu(block);
>> +                       break;
>> +               default:
>> +                       fprintf(out, "Unable to determine block type");
>> +                       return;
>> +       }
>>
>>        /* Re-compute based on what we got from disk */
>>        ocfs2_compute_meta_ecc(gbls.fs, block, bc);
>>
>> +       /* Swap block back to CPU */
>> +       switch (bt) {
>> +               case DUMP_BLOCK_INODE:
>> +                       ocfs2_swap_inode_to_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_EXTENT_BLOCK:
>> +                       ocfs2_swap_extent_block_to_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_GROUP_DESCRIPTOR:
>> +                       ocfs2_swap_group_desc_to_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_DIR_BLOCK:
>> +                       ocfs2_swap_dir_entries_to_cpu(block,
>> +                                       gbls.fs->fs_blocksize);
>> +                       break;
>> +               case DUMP_BLOCK_XATTR:
>> +                       ocfs2_swap_xattr_block_to_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_REFCOUNT:
>> +                       ocfs2_swap_refcount_block_to_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_DXROOT:
>> +                       ocfs2_swap_dx_root_to_cpu(gbls.fs, block);
>> +                       break;
>> +               case DUMP_BLOCK_DXLEAF:
>> +                       ocfs2_swap_dx_leaf_to_cpu(block);
>> +                       break;
>> +               default:
>> +                       break;
>> +       }
>> +
>>        crc_fail = memcmp(bc,&tmp, sizeof(*bc));
>>
>>        fprintf(out, "\tCRC32: %.8"PRIx32"   ECC: %.4"PRIx16"\n",
>> diff --git a/debugfs.ocfs2/include/utils.h b/debugfs.ocfs2/include/utils.h
>> index 8b5c90c..ada699c 100644
>> --- a/debugfs.ocfs2/include/utils.h
>> +++ b/debugfs.ocfs2/include/utils.h
>> @@ -69,5 +69,6 @@ void init_stringlist(struct list_head *strlist);
>>  void free_stringlist(struct list_head *strlist);
>>  errcode_t add_to_stringlist(char *str, struct list_head *strlist);
>>  int del_from_stringlist(char *str, struct list_head *strlist);
>> +enum dump_block_type detect_block (char *buf);
>>
>>  #endif                /* __UTILS_H__ */
>> diff --git a/debugfs.ocfs2/journal.c b/debugfs.ocfs2/journal.c
>> index abc0ebc..7fd32fe 100644
>> --- a/debugfs.ocfs2/journal.c
>> +++ b/debugfs.ocfs2/journal.c
>> @@ -29,8 +29,6 @@
>>
>>  extern dbgfs_gbls gbls;
>>
>> -static enum dump_block_type detect_block (char *buf);
>> -
>>  static void scan_journal(FILE *out, journal_superblock_t *jsb, char *buf,
>>                         int len, uint64_t *blocknum, uint64_t
>> *last_unknown)
>>  {
>> @@ -157,78 +155,3 @@ bail:
>>        return ret;
>>  }
>>
>> -/*
>> - * detect_block()
>> - *
>> - */
>> -static enum dump_block_type detect_block (char *buf)
>> -{
>> -       struct ocfs2_dinode *inode;
>> -       struct ocfs2_extent_block *extent;
>> -       struct ocfs2_group_desc *group;
>> -       struct ocfs2_dir_block_trailer *trailer;
>> -       struct ocfs2_xattr_block *xb;
>> -       struct ocfs2_refcount_block *rb;
>> -       struct ocfs2_dx_root_block *dx_root;
>> -       struct ocfs2_dx_leaf *dx_leaf;
>> -       enum dump_block_type ret = DUMP_BLOCK_UNKNOWN;
>> -
>> -       inode = (struct ocfs2_dinode *)buf;
>> -       if (!strncmp((char *)inode->i_signature, OCFS2_INODE_SIGNATURE,
>> -                    sizeof(inode->i_signature))) {
>> -               ret = DUMP_BLOCK_INODE;
>> -               goto bail;
>> -       }
>> -
>> -       extent = (struct ocfs2_extent_block *)buf;
>> -       if (!strncmp((char *)extent->h_signature,
>> OCFS2_EXTENT_BLOCK_SIGNATURE,
>> -                    sizeof(extent->h_signature))) {
>> -               ret = DUMP_BLOCK_EXTENT_BLOCK;
>> -               goto bail;
>> -       }
>> -
>> -       group = (struct ocfs2_group_desc *)buf;
>> -       if (!strncmp((char *)group->bg_signature,
>> OCFS2_GROUP_DESC_SIGNATURE,
>> -                    sizeof(group->bg_signature))) {
>> -               ret = DUMP_BLOCK_GROUP_DESCRIPTOR;
>> -               goto bail;
>> -       }
>> -
>> -       trailer = ocfs2_dir_trailer_from_block(gbls.fs, buf);
>> -       if (!strncmp((char *)trailer->db_signature,
>> OCFS2_DIR_TRAILER_SIGNATURE,
>> -                    sizeof(trailer->db_signature))) {
>> -               ret = DUMP_BLOCK_DIR_BLOCK;
>> -               goto bail;
>> -       }
>> -
>> -       xb = (struct ocfs2_xattr_block *)buf;
>> -       if (!strncmp((char *)xb->xb_signature,
>> OCFS2_XATTR_BLOCK_SIGNATURE,
>> -                    sizeof(xb->xb_signature))) {
>> -               ret = DUMP_BLOCK_XATTR;
>> -               goto bail;
>> -       }
>> -
>> -       rb = (struct ocfs2_refcount_block *)buf;
>> -       if (!strncmp((char *)rb->rf_signature,
>> OCFS2_REFCOUNT_BLOCK_SIGNATURE,
>> -                    sizeof(rb->rf_signature))) {
>> -               ret = DUMP_BLOCK_REFCOUNT;
>> -               goto bail;
>> -       }
>> -
>> -       dx_root = (struct ocfs2_dx_root_block *)buf;
>> -       if (!strncmp((char *)dx_root->dr_signature,
>> OCFS2_DX_ROOT_SIGNATURE,
>> -                    strlen(OCFS2_DX_ROOT_SIGNATURE))) {
>> -               ret = DUMP_BLOCK_DXROOT;
>> -               goto bail;
>> -       }
>> -
>> -       dx_leaf = (struct ocfs2_dx_leaf *)buf;
>> -       if (!strncmp((char *)dx_leaf->dl_signature,
>> OCFS2_DX_LEAF_SIGNATURE,
>> -                    strlen(OCFS2_DX_LEAF_SIGNATURE))) {
>> -               ret = DUMP_BLOCK_DXLEAF;
>> -               goto bail;
>> -       }
>> -
>> -bail:
>> -       return ret;
>> -}                              /* detect_block */
>> diff --git a/debugfs.ocfs2/utils.c b/debugfs.ocfs2/utils.c
>> index d22ae8e..1fb77b7 100644
>> --- a/debugfs.ocfs2/utils.c
>> +++ b/debugfs.ocfs2/utils.c
>> @@ -881,3 +881,80 @@ int del_from_stringlist(char *str, struct
>> list_head *strlist)
>>        return 0;
>>  }
>>
>> +/*
>> + * detect_block()
>> + *
>> + */
>> +enum dump_block_type detect_block (char *buf)
>> +{
>> +       struct ocfs2_dinode *inode;
>> +       struct ocfs2_extent_block *extent;
>> +       struct ocfs2_group_desc *group;
>> +       struct ocfs2_dir_block_trailer *trailer;
>> +       struct ocfs2_xattr_block *xb;
>> +       struct ocfs2_refcount_block *rb;
>> +       struct ocfs2_dx_root_block *dx_root;
>> +       struct ocfs2_dx_leaf *dx_leaf;
>> +       enum dump_block_type ret = DUMP_BLOCK_UNKNOWN;
>> +
>> +       inode = (struct ocfs2_dinode *)buf;
>> +       if (!strncmp((char *)inode->i_signature, OCFS2_INODE_SIGNATURE,
>> +                    sizeof(inode->i_signature)) ||
>> +               !strncmp((char *)inode->i_signature,
>> +               OCFS2_SUPER_BLOCK_SIGNATURE, sizeof(inode->i_signature)))
>> {
>> +               ret = DUMP_BLOCK_INODE;
>> +               goto bail;
>> +       }
>> +
>> +       extent = (struct ocfs2_extent_block *)buf;
>> +       if (!strncmp((char *)extent->h_signature,
>> OCFS2_EXTENT_BLOCK_SIGNATURE,
>> +                    sizeof(extent->h_signature))) {
>> +               ret = DUMP_BLOCK_EXTENT_BLOCK;
>> +               goto bail;
>> +       }
>> +
>> +       group = (struct ocfs2_group_desc *)buf;
>> +       if (!strncmp((char *)group->bg_signature,
>> OCFS2_GROUP_DESC_SIGNATURE,
>> +                    sizeof(group->bg_signature))) {
>> +               ret = DUMP_BLOCK_GROUP_DESCRIPTOR;
>> +               goto bail;
>> +       }
>> +
>> +       trailer = ocfs2_dir_trailer_from_block(gbls.fs, buf);
>> +       if (!strncmp((char *)trailer->db_signature,
>> OCFS2_DIR_TRAILER_SIGNATURE,
>> +                    sizeof(trailer->db_signature))) {
>> +               ret = DUMP_BLOCK_DIR_BLOCK;
>> +               goto bail;
>> +       }
>> +
>> +       xb = (struct ocfs2_xattr_block *)buf;
>> +       if (!strncmp((char *)xb->xb_signature,
>> OCFS2_XATTR_BLOCK_SIGNATURE,
>> +                    sizeof(xb->xb_signature))) {
>> +               ret = DUMP_BLOCK_XATTR;
>> +               goto bail;
>> +       }
>> +
>> +       rb = (struct ocfs2_refcount_block *)buf;
>> +       if (!strncmp((char *)rb->rf_signature,
>> OCFS2_REFCOUNT_BLOCK_SIGNATURE,
>> +                    sizeof(rb->rf_signature))) {
>> +               ret = DUMP_BLOCK_REFCOUNT;
>> +               goto bail;
>> +       }
>> +
>> +       dx_root = (struct ocfs2_dx_root_block *)buf;
>> +       if (!strncmp((char *)dx_root->dr_signature,
>> OCFS2_DX_ROOT_SIGNATURE,
>> +                    strlen(OCFS2_DX_ROOT_SIGNATURE))) {
>> +               ret = DUMP_BLOCK_DXROOT;
>> +               goto bail;
>> +       }
>> +
>> +       dx_leaf = (struct ocfs2_dx_leaf *)buf;
>> +       if (!strncmp((char *)dx_leaf->dl_signature,
>> OCFS2_DX_LEAF_SIGNATURE,
>> +                    strlen(OCFS2_DX_LEAF_SIGNATURE))) {
>> +               ret = DUMP_BLOCK_DXLEAF;
>> +               goto bail;
>> +       }
>> +
>> +bail:
>> +       return ret;
>> +}                              /* detect_block */
>> diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
>> index fa91a54..d06b3f5 100644
>> --- a/include/ocfs2/ocfs2.h
>> +++ b/include/ocfs2/ocfs2.h
>> @@ -502,8 +502,11 @@ void ocfs2_init_dir_trailer(ocfs2_filesys *fs,
>> struct ocfs2_dinode *di,
>>  void ocfs2_swap_dx_root_to_cpu(ocfs2_filesys *fs,
>>                               struct ocfs2_dx_root_block *dx_root);
>>  void ocfs2_swap_dx_leaf_to_cpu(struct ocfs2_dx_leaf *dx_leaf);
>> +void ocfs2_swap_dx_root_from_cpu(ocfs2_filesys *fs,
>> +               struct ocfs2_dx_root_block *dx_root);
>>  errcode_t ocfs2_read_dx_root(ocfs2_filesys *fs, uint64_t block,
>>                             void *buf);
>> +void ocfs2_swap_dx_leaf_from_cpu(struct ocfs2_dx_leaf *dx_leaf);
>>  errcode_t ocfs2_read_dx_leaf(ocfs2_filesys *fs, uint64_t block,
>>                             void *buf);
>>  int ocfs2_dir_indexed(struct ocfs2_dinode *di);
>> diff --git a/libocfs2/dirblock.c b/libocfs2/dirblock.c
>> index 4594000..bc60a26 100644
>> --- a/libocfs2/dirblock.c
>> +++ b/libocfs2/dirblock.c
>> @@ -295,7 +295,7 @@ void ocfs2_swap_dx_root_to_cpu(ocfs2_filesys *fs,
>>                ocfs2_swap_extent_list_to_cpu(fs,
>> dx_root,&dx_root->dr_list);
>>  }
>>
>> -static void ocfs2_swap_dx_root_from_cpu(ocfs2_filesys *fs,
>> +void ocfs2_swap_dx_root_from_cpu(ocfs2_filesys *fs,
>>                                struct ocfs2_dx_root_block *dx_root)
>>  {
>>        if (cpu_is_little_endian)
>> @@ -396,7 +396,7 @@ void ocfs2_swap_dx_leaf_to_cpu(struct
>> ocfs2_dx_leaf *dx_leaf)
>>        ocfs2_swap_dx_entry_list_to_cpu(&dx_leaf->dl_list);
>>  }
>>
>> -static void ocfs2_swap_dx_leaf_from_cpu(struct ocfs2_dx_leaf *dx_leaf)
>> +void ocfs2_swap_dx_leaf_from_cpu(struct ocfs2_dx_leaf *dx_leaf)
>>  {
>>        if (cpu_is_little_endian)
>>                return;
>>
>
>



-- 
Goldwyn



More information about the Ocfs2-tools-devel mailing list