MilanKosticKIT / BetriebssystemeUebung

The filesystem project for our class.
1 stars 2 forks source link

Fuse // read und write Methoden #65

Closed HannesIlly closed 5 years ago

HannesIlly commented 5 years ago

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.

HannesIlly commented 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.