1

大学用にリモート ファイルシステム サーバーを作成していますが、ルート ディレクトリの読み取りに問題があります...ここに問題があります: ルート i ノード (i ノード 2) を読み取ったところ、一貫したデータがあります。たとえば、所有者のユーザー ID フィールドは「1000」に設定されています。次に、i ノード データ ブロックの内容の読み取りに進みますが、問題のデータ ブロック (i ノード i_block 配列でアドレス指定されている唯一のブロック、デバッグでは 240) にアクセスしようとすると、すべてのバイトが '0 に設定されます。 '。誰でもこれで私を助けることができますか?それは本当に重要です。注:マップされたメモリを使用する以外の方法では作成できません。実際のディスクを開いているのではなく、.disk Linuxファイルを開いています。コマンドラインで作成されました

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; 
}
4

1 に答える 1

1

問題を解決しました。ブロック n は n データ ブロックであると仮定しましたが、オフセットにはすべてのブロックが含まれていました。getblock 関数を次のように変更しました

void *getblock(int idx){

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

そして働きました!

于 2012-05-16T03:42:47.727 に答える