2012-05-15 54 views
1

我正在爲我的大學制作一個遠程文件系統服務器,並且在讀取根目錄時遇到了一些麻煩......以下是這個東西: 我讀過根inode(inode 2)並且它具有一致的數據,我的意思是,例如,所有者用戶標識字段被設置爲'1000'。然後我繼續讀取inode數據塊的內容,但是當我嘗試訪問有問題的數據塊時(唯一在inode i_block數組中尋址的數據塊,在我的調試中爲240),所有字節均設置爲0 」。誰能幫我這個?這非常重要。注意:我無法使用映射內存的另一種方式,我不打開真正的磁盤,而是打開.disk linux文件。它已與命令行如何從映射內存中讀取ext2根目錄?

mkfs.ext2 -F -r 0 -b 1024 ext2.disk創建30000

這裏是我的代碼:

#include <linux/ext2_fs.h> 

typedef struct s_inode *pinode;   /* Pointer to inode struct */ 
typedef struct s_direct *pdir;   /* Pointer to direct struct */ 

int main(int argv, char *argc[]){ 
    int *data; 
    pdir root = malloc(sizeof(struct s_direct)); 

    /* Code for mpping .disk file, fetching supernode, and other ext2 data */ 
    /* fsys is a global variable that holds general ext2 system data  */ 
    fsys->root   = get_inode(2); 
    data     = get_cont(fsys->root); 
    root     = (pdir)getblock(data[0]); 

} 

pinode get_inode(int idx){ 
    pinode inod; 
    int grp, offs; 

    grp = (idx-1)/fsys->superblock->s_inodes_per_group; 
    offs = (idx-1)%fsys->superblock->s_inodes_per_group; 
    inod = (pinode)&fsys->diskmap[(fsys->group[grp]->itab)+offs*sizeof(struct s_inode)]; 

    return inod; 
} 

int *get_cont(pinode inod){ 
    int *cont; 
    int *idx; 
    int i=0; 
    int *block; 

    idx = malloc(sizeof(int)); 
    cont = malloc(sizeof(int)); 

    while(i < inod->i_blocks && i<13) { 
      realloc(cont, i*sizeof(int)); 
      cont[i]=inod->i_block[i]; 
      i++; 
    } 

    if(i < inod->i_blocks){ 
     *idx=13; 
     block=(int*)getblock(inod->i_block[*idx]); 
     fetchcont(block, idx, cont, inod->i_blocks, 0); 
    } 
    if(i < inod->i_blocks){ 
     block=(int*)getblock(inod->i_block[*idx]); 
     fetchcont(block, idx, cont, inod->i_blocks, 1); 
    } 
    if(i < inod->i_blocks){ 
     block=(int*)getblock(inod->i_block[*idx]); 
     fetchcont(block, idx, cont, inod->i_blocks, 2); 
    } 

    return cont; 

} 

int fetchcont(int *block, int *idx, int *cont, int lim, int lvl){ 
    int i=0; 

    if(lvl == 0){ 
     while((*idx) < lim && i<fsys->bsize){ 
      realloc(cont, (*idx)*sizeof(int)); 
      cont[*idx]=block[i]; 
      (*idx)++; 
      i++; 
     } 
     if(i>=fsys->bsize){ 
      return 1; 
     }else{ 
      return 0; 
     } 
    }else{ 
     lvl--; 
     while(i<fsys->bsize){ 
      if(!fetchcont((int*)getblock(block[i]), idx, cont, lim, lvl)){ 
       return 0; 
      } 
      i++; 
     } 

    } 
} 

void *getblock(int idx){ 
    char *block; 
    int grp, offs; 

    grp = (idx-1)/fsys->superblock->s_blocks_per_group; 
    offs = (idx-1)%fsys->superblock->s_blocks_per_group; 
    block = &fsys->diskmap[fsys->group[grp]->blocks+offs*fsys->bsize]; 

    return block; 
} 

回答

1

解決的問題。我假設塊n是n個數據塊,但是偏移量包括所有塊。我已將getblock功能更改爲

void *getblock(int idx){ 

    return &fsys->diskmap[fsys->bsize*idx]; 
} 

並且工作!