Skip to content

SPIFFS says, File is present but not able to Read/Write/Delete. #294

@Kalpesh1990

Description

@Kalpesh1990

Highlights of operations what we do in our system

Upon power up of embedded device, We are reading some configurations from file and writing some initial data(Reset Counter) immediately in file.

Steps to generate problem

  • When we power cycle device continuously, Sometime file goes in this state (File is present (We can open it) but we can't Read/Write/Delete it).

Initial Analysis

  • When file corrupts (Goes in above mentioned state), Page header flag value was 254 or 124 (1st bit from 0th location was present mean writing is not finalized/under modification or 7th bit was zero mean page deleted respectively, Ref File: spiffs_nucleus.h, Line No - 288).
  • Return with error SPIFFS_ERR_NOT_FINALIZED/SPIFFS_ERR_DELETED respectively while read from below line of code, File : spiffs_nucleus.c, Line No : 27
    SPIFFS_VALIDATE_DATA(ph, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, spix);
  • Same flag was 252 when file was healthy (Not corrupted).

In Depth Analysis to generate the issue manually in debug mode

Flow of execution related to busy writing flag under

  1. spiffs_object_modify (clearing busy writing flag and then deleting original page)
    // write all data
    // write partial data
    // copy unmodified data
    // Clear flag
    Manual Reset the system (In debug mode)
    p_hdr.flags &= ~SPIFFS_PH_FLAG_FINAL;
    // delete original data page
    => In the first case if we reset the system manually , File is not corrupting. So I am assuming it will take data from original page which we haven't deleted.

  2. spiffs_object_truncate (deleting original page first and then clearing busy writing flag)
    // delete last page, partially
    // allocate new page and copy unmodified data
    // delete original data page
    Manual Reset the system (In debug mode)
    p_hdr.flags &= ~SPIFFS_PH_FLAG_FINAL;
    => But in second case, If we do manual reset (In debug mode), As original page is deleted it will take data from new page and chance that file is being corrupted.

What we do to recover system

  • As file number/name is fixed, We have to erase the full chip.

So can you suggest any solution to get out from this situation.
What best I can think of is, Always remove busy flag when user close the file.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions