ufabc-bcc / 2019.Q1.SO.BrisaFS

Projeto de Programação - BrisaFS
3 stars 5 forks source link

Implementação de alocação encadeada #6

Open lucaszane opened 5 years ago

lucaszane commented 5 years ago

Professor,

Estamos pensando na implementação de alocação encadeada da seguinte forma:

typedef struct {
    int16_t next_block;
    byte data[4094];
} node;

node* disco;

O senhor encorajaria uma implementação deste tipo? Será que é a melhor forma de fazermos ou você poderia nos dar alguma outra indicação?

Estamos tendo algumas dificuldades com relação a essa estrutura.

Obrigado, Lucas Zane

francesquini commented 5 years ago

Essa implementação é a encadeada tradicional. E tem, portanto, todas as vantagens e desvantagens que o próprio livro cita.

É uma implementação muito melhor que a contígua.

Você chegou a dar uma olhada na implementação FAT? O livre a descreve em detalhes. Ela é quase a mesma coisa que a encadeada mas você guarda os ponteiros no superbloco. Assim você economiza o espaço no bloco (4 bytes) propriamente dito.

Que tipo de problemas vocês estão enfrentando?

lucaszane commented 5 years ago

Obrigado, professor! Na verdade queríamos confirmar se estavamos no caminho certo.

Agora estamos enfrentando um problema com a leitura e armazenamento de múltiplos bocos no buffer "buf" que recebemos do fuse na função "read_brisafs". A ideia é que leiamos o conteúdo de todos os blocos nesse buffer, iterando sobre cada bloco encadeado da seguinte forma:

// readed_size -> Tamanho já lido de outros blocos;
// size_to_read -> Tamanho a ler no bloco atual;
memcpy(buf + readed_size, disco[bloco].data, size_to_read);

O problema é que não estamos conseguindo copiar todos os blocos para o buffer desta maneira, ele está copiando o conteúdo somente do primeiro bloco. Não conseguimos alocar mais memória nele também. Será que existe alguma questão específica para esse buffer que o fuse envia?

Obrigado.

francesquini commented 5 years ago

O buffer enviado pelo fuse é um vetor de bytes sem nenhum detalhe escondido.

Note que a função que efetua a leitura precisa devolver o total de bytes lidos. Talvez o retorno da sua função não esteja sendo atualizado após a leitura do último bloco?

lucaszane commented 5 years ago

Obrigado pela dica, mas não é isso. Conferimos o retorno da função e bate com o total de bytes lidos em todos os blocos :(