Closed HannesIlly closed 5 years ago
Das Problem wurde gelöst:
Das ist der Bereich in der Read-Methode, in dem der Lesevorgang stattfindet: Der Vorgang ist aufgeteilt in 3 Schritte: 1.Block lesen, alle Blöcke zwischen 1. und letzten lesen und letzter Block lesen. 1.
if (blockOffset + size < BLOCK_SIZE) {
readSize = size;
} else {
readSize = BLOCK_SIZE - (size_t)blockOffset;
}
if (openFiles[fd].bufferBlockNumber == blocks[0]) {
memcpy(buf, openFiles[fd].buffer + blockOffset, readSize);
} else {
blockDevice->read(DATA_START + blocks[0], buffer);
memcpy(buf, buffer + blockOffset, readSize);
if (howManyBlocks == 1) {
memcpy(openFiles[fd].buffer, buffer, BLOCK_SIZE);
openFiles[fd].bufferBlockNumber = blocks[howManyBlocks - 1];
}
}
2.
for (int j = 1; j < howManyBlocks - 1; j++) {
//First read block size was BLOCK_SIZE - blockOffset. This value has to be added to the next read operations.
blockDevice->read(DATA_START + blocks[j], buf - blockOffset + BLOCK_SIZE * j);
LOGF("Block %d wird gelesen",blocks[j]);//new testing TODO delete
}
3.
if (howManyBlocks > 1) {
readSize = (size + blockOffset) % BLOCK_SIZE;
blockDevice->read(DATA_START + blocks[howManyBlocks - 1], buffer);
memcpy(buf - blockOffset + (howManyBlocks - 1) * BLOCK_SIZE, buffer, readSize);
memcpy(openFiles[fd].buffer, buffer, BLOCK_SIZE);
openFiles[fd].bufferBlockNumber = blocks[howManyBlocks - 1];
}
Im letzen Schritt gibt es den Fehler, dass wenn ein Block ein vielfaches von BLOCK_SIZE ist, nichts gelesen wird: readSize = (size + blockOffset) % BLOCK_SIZE;
Das wird behoben durch: if (readSize == 0) readSize = BLOCK_SIZE;
Fehler war in read und write gleich. Ist in beiden gefixt.
Die read und write Methoden funktionieren nicht. Beim Test mit mounten und öffnen der Dateien per Programm, kommt in regelmäßigen Abständen (ca. alle 8 Blocks oder so) ein Block an unlesbaren Zeichen. Danach ist alles wieder ok. Das passiert sowohl wenn die Datei per fuseWrite, als auch per mkfs.myfs kopiert wird.