[Ocfs-tools-devel] The tool to find where the data reside in devices

y huang c_programmingii at yahoo.com
Wed Sep 22 14:34:42 PDT 2004


Trying to write a program to map a OCFS file or file
system to devices level, i.e. giving a file or file
system, the program tells where (offsets of the
devices) all the data reside. Anyone has written such
program. The following is the simple code for EXT3:

#include "sb_ext3.h"
#include "gd_ext3.h"
#include "inode_ext3.h"
#include <stdio.h>
#include <fcntl.h>

main(int argc, char *argv[])
{
        int fd, i;
        struct ext3_super_block sb;
        struct ext3_group_desc gd;
        struct ext3_inode inode;

        if(argc!=2)
        {
                printf("Usage:  %s
file_system_dev_name\n");
                exit(1);
        }

        if((fd=open(argv[1],O_RDONLY))<0)
        {
                printf("Could not open
%s.\n",argv[0]);
                exit(1);
        }

        lseek(fd,1024,0);
        if(read(fd,&sb,sizeof(sb))!=sizeof(sb))
        {
                printf("Could not read super
block\n");
                exit(1);
        }

        printf("Inode count is
%d\n",sb.s_inodes_count);
        printf("Block count is
%d\n",sb.s_blocks_count);
        printf("Reserved block count is
%d\n",sb.s_r_blocks_count);
        printf("Free block count is
%d\n",sb.s_free_blocks_count);
        printf("Free inode count is
%d\n",sb.s_free_inodes_count);
        printf("Fisrt data block is
%d\n",sb.s_first_data_block);
        printf("Block size is
%d\n",sb.s_log_block_size);
        printf("Blocks per group is
%d\n",sb.s_blocks_per_group);
        printf("Inodes per group is
%d\n",sb.s_inodes_per_group);

        lseek(fd,4096,0);
        if(read(fd,&gd,sizeof(gd))!=sizeof(gd))
        {
                printf("Could not read group
descriptor\n");
                exit(1);
        }                                             
                 
        printf("Blocks bit map is at
%d.\n",gd.bg_block_bitmap);
        printf("Inodes bit map is at
%d.\n",gd.bg_inode_bitmap);
        printf("Inode table starts at
%d.\n",gd.bg_inode_table);
        printf("Free block count in this BG is
%d\n",gd.bg_free_blocks_count);
        printf("Free inode count in this BG is
%d\n",gd.bg_free_inodes_count);
        printf("Used dirs count in this BG is
%d\n",gd.bg_used_dirs_count);


        printf("\n\nHere is inode 382
information...\n");
        lseek(fd,((4096*4)+(381*128)),0);
        read(fd,&inode,sizeof(inode));

        printf("The owner is %d\n",inode.i_uid);
        printf("The size is %d\n",inode.i_size);
        printf("Data blocks are:\n");
        for(i=0;i<15;i++)
        {
                if (inode.i_block[i] == 0)
                        break;
                printf("   Logical %d =
%d\n",i+1,inode.i_block[i]);
        }
        close(fd);

}           




		
__________________________________
Do you Yahoo!?
Yahoo! Mail Address AutoComplete - You start. We finish.
http://promotions.yahoo.com/new_mail 



More information about the Ocfs-tools-devel mailing list