Page 1 of 1

FATFS memory leak when calling fopen

Posted: Mon Nov 30, 2020 11:53 am
by Wootsies
Hi everyone, I have implemented a FATFS for a partition on my flash memory and have been observing a strange behavior after awhile where I can no longer create a file using the command fopen(filepath, "wb"). The call to fopen returns null and the error code is 2.
Calling perror("error") returns: Error: No such file or directory. Then when I tried to get the current memory from f_getfree, I realised that my free sectors have been reduced down to 0. In my code typically i call fopen with the mode set to wb and each time before I write to the file, I will call the unlink method.

It is strange because I cannot seem to isolate the scenario where this will happen however it will trigger maybe after several days or weeks of developing on the ESP32. Additionally when I reflash my ESP32 my original assumptions were that it would clear/format the FATfs partition but it seems that given this is happening, it seems my assumption is incorrect.

During my testing when I run my code, the data that I am writing to the FATFS is typically always the same length and I have not touched this part of the code at all for quite awhile and it will trigger this issue without much warning after flashing/working on the code for a while.

Has anyone encountered this before or is able to give some input to identify where the issue could be coming from?


Note: Flash encryption is not enabled and I am writing to a partition on my external flash
An extract of the code I use to add the file:

Code: Select all

    
    // Remove file before adding
    unlink(filepath);

    // Open file to write
    FILE *f = fopen(filepath, "wb");
    if (f == NULL)
    {
        ESP_LOGE(TAG, "Failed to open file for writing. Error code: %d", errno);
        perror("Error");
        return ESP_FAIL;
    }
    else
    {
        // Write data to the file here
        if (fprintf(f, "%s", inBuffer) == EOF)
        {
            ESP_LOGE(TAG, "File Write Error, Memory Might be full");
            fclose(f);
            return ESP_FAIL;
        }
    }

    // Remember to close the file
    fclose(f);

How I mount my partition

Code: Select all

    
    const esp_vfs_fat_mount_config_t mount_config = {
        .max_files = 4,
        .format_if_mount_failed = true,
        .allocation_unit_size = CONFIG_WL_SECTOR_SIZE};

    esp_err_t err = esp_vfs_fat_spiflash_mount(ROOT, NAME, &mount_config, &s_wl_handle_FileStorage);
    if (err != ESP_OK)
    {
        ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err));
        return ESP_FAIL;
    }