1

我正在为我的大学制作一个远程文件系统服务器,但在读取根目录时遇到了一些问题……事情是这样的:我已经读取了根 inode(inode 2)并且它具有一致的数据,我的意思是,例如,所有者用户 ID 字段设置为“1000”。然后我继续读取 inode 数据块的内容,但是当我尝试访问有问题的数据块(inode 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 回答