History: fs_exfat

This page describes all changes made to the fs_exfat package, exFAT File System, since its release. This also covers the fs_exfat_safe package, SafeexFAT.


2.1 (2020-05-14, 13:02):

  • Unique file ID can be retrieved with exfat_stat() and exfat_fstat().
  • Members of t_exfat_space were renamed.

1.19 (2020-03-30, 14:46):

  • Added exfat_set_last_free_cluster() and exfat_get_last_cluster().

1.18 (2020-03-18, 10:50):

  • Bugfix: exfat_delvolume() could de-reference NULL-pointer if called multiple times.
  • Following functions could de-reference NULL pointer if it was called on non-initialized volume: exfat_getlabel()exfat_setlabel(), exfat_get_volume_info(), exfat_getfreespace(), exfat_opendir(), exfat_move(), exfat_exists(), exfat_remove()exfat_rename(), exfat_repair(), exfat_open(), exfat_open_nonsafe()exfat_mkdir(), exfat_rmdir(), exfat_chdir(), exfat_getattr()exfat_setattr(), exfat_settimestamp(), exfat_gettimestamp()exfat_truncate(), exfat_is_directory(), exfat_is_file(), exfat_filelength(), exfat_getcwd(), and exfat_getdcwd().

1.17 (2020-01-10, 09:47):

  • Code made compatible with MISRA-C:2012/AMD1/.
  • EXFAT_ENABLE_LAST_ACCESS_UPDATE results in a build error when safe mode is enabled as currently it is not possible to use this feature in safe mode.
  • Moved  sector and cache buffers to PSP. This means they can be aligned or placed in non-cacheable memory.

1.16 (2019-10-24, 10:37):

  • Bugfix: PSP_ASSERT() was executed when media error occured in exfat_mkdir().

1.15 (2019-09-24, 13:12):

  • Removed EXFAT_SYSTEM_ARCH_64BIT configuration option: it was used to optimize performance but turned out to bring no additional benefit.
  • Bugfix: cross-linked clusters could appear when media was almost full or free clusters fragmented.
  • Bugfix: exfat_flush() could produce cross linked clusters in safe mode if file's content was overwritten in "r+"/"w+" mode.
  • Bugfix: EXFAT_REPAIR_NEEDED error could occur after exfat_format() if EXFAT_REPAIR_NEEDED state was earlier.

1.14 (2019-09-10, 14:10):

  • Bugfix: exfat_initvolume() failed when media has different sector size than earlier.
  • Eliminated compiler error which occurred when EXFAT_ENABLE_SAFE=0.

1.13 (2019-09-04, 14:19):

  • Safe exfat_remove_content() clears clusters even when operation is  interrupted.
  • Optimized cluster operations when file is overwritten using mode "r+" in safe mode.
  • Safe mode was implemented for exfat_setlabel().
  • exfat_format() is not writing default label.
  • Bugfix: filesystem may write data to wrong cluster when multiple volumes were used at the same time.

1.12 (2019-08-01, 12:59):

  • Added exfat_remove_content().
  • Bugfix: if file was opened for write ("r+") and for read ("r") with a different file handle, wrong data could be read with the second file handle in safe mode after overwriting the first cluster.

1.11 (2019-07-31, 08:22):

  • Implemented Safe mode for exfat_open() (..., "w"/"w+"/"r+") and exfat_write(), exfat_seek(), exfat_flush() and exfat_close() for the "w"/"w+"/"r+" modes.

1.10 (2019-07-11, 09:47):

  • Implemented Safe mode for exfat_mkdir(), exfat_rmdir(), exfat_remove(), exfat_move(), exfat_repair(), and exfat_ftruncate().
  • Safe exfat_ftruncate() works on file handles opened in append ("a" or "a+") mode.

1.9 (2019-07-09, 08:22):

  • Bugfix: exfat_mkdir() could create directory with cross-linked clusters when EXFAT_SAFE_ENABLED was 1. This caused that files or directories get lost in the parent directory and PSP_ASSERT macro was triggered.

1.8 (2019-07-03, 12:24):

  • Increased speed of exfat_format() and exfat_mkdir(). Size of sector buffer can be changed by using EXFAT_SECTOR_BUFFER_COUNT.

1.7 (2019-07-02, 07:16):

  • Bugfix: directory entries may have been written to wrong cluster if they were crossing cluster boundary, causing a created file to become unusable (read, erase, etc. failures).

1.6 (2019-06-27, 09:16):

  • Cluster sizes can be configured for exfat_format() in config_exfat.c.
  • Validity of FAT and first cluster of root directory is checked.
  • exfat_format() closes all opened files.
  • exfat_mkdir() returns EXFAT_ERR_MEDIA_WRITE_PROTECTED in write-protected state.
  • Implemented Safe mode for exfat_open(..., "a"/"a+"), exfat_write(), exfat_seek(), and exfat_close().
  • Introduced exfat_repair().

1.5 (2019-06-03, 10:57):

  • Module cannot be compiled with ISO C99 or older compilers due to Unicode string literals.
  • Upcase table parser reported error if upcase table contained 131072 bytes (current operating systems produce 5836 byte long upcase table).

1.4 (2019-04-25, 08:25):

  • When possible, multiple sector access is always used (previously it was only used when reading/writing more than a cluster size).

1.3 (2019-04-18, 06:36):

  • Compiler warning was eliminated: undefined macro was used.

1.2 (2019-03-28, 09:38):

  • exfat_getlabel(), exfat_setlabel(), exfat_getfreespace() check whether exfat_enter_task() was called.
  • Code optimized: old cache functions not compiled.
  • Calculations optimized: binary shifts used instead of division and multiplication.
  • FAT chain is always closed when extended.
  • Fixed calculation of file name's checksum: upcase letters are used.
  • Fixed upcase function's error handling: it could return error when no error occurred.
  • Not necessary to call exfat_enter_task() if EXFAT_MAX_TASK_COUNT is 1.


  • Initial release.