<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LittleFS: File Open Err: -14</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/127885/littlefs-file-open-err--14</link><description>LittleFS Corruption Issue Report – nRF5340 (External QSPI Flash) 
 
 1. Introduction 
 This document outlines a filesystem corruption issue encountered while using LittleFS on an external QSPI flash (64 MiB) with the nRF5340 platform (Zephyr RTOS) . The</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 05 May 2026 12:43:38 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/127885/littlefs-file-open-err--14" /><item><title>RE: LittleFS: File Open Err: -14</title><link>https://devzone.nordicsemi.com/thread/565895?ContentTypeID=1</link><pubDate>Tue, 05 May 2026 12:43:38 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:53d56ca5-3c28-4750-8e23-ef6830319305</guid><dc:creator>AHaug</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span&gt;&lt;code&gt;-EFAULT&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;from&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;fs_*&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;here means&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;LFS_ERR_CORRUPT&lt;/code&gt;&lt;/span&gt;, per Zephyr’s errno mapping — not a literal invalid buffer address from your&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;dummy_data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;270 B vs 800 B+&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;split is very plausibly because&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;270 B is an inline file&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(≤&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;512 B&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;4 KiB&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;blocks and your&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;4096&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cache), while&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;800 B+&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;non-inline CTZ files&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;The failure around&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;~4000&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;iterations could be interpreted as&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;something going wrong that LittleFS classifies as corruption&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;inline-heavy metadata rewrite&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pattern — that may be real flash/QSPI readback mismatch (verify), marginal timing, power-down (&lt;code&gt;has-dpd&lt;/code&gt;), etc., or a structural/metadata edge case.&lt;span&gt;&amp;nbsp;EFAULT-14&amp;nbsp;&lt;/span&gt;&lt;span&gt;LittleFS corruption error mapped to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;-EFAULT&lt;/code&gt;&lt;/span&gt;, and the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;size threshold&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is consistent with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;inline vs non-inline file handling&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;given default geometry.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To confirm on your build, check the mount log line that prints&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;code&gt;block_size&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;code&gt;rd ; pr ; ca ; la&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;sizes (&lt;code&gt;littlefs_init_cfg&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;logs them): if&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;code&gt;block_size&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is 4096&lt;/span&gt;, the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;512 B inline cutoff&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;applies as above.&lt;/p&gt;
&lt;p&gt;Enabling&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;code&gt;CONFIG_FS_LOG_LEVEL_DBG&lt;/code&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(and LittleFS’s own logging if you use it) would narrow whether you’re hitting&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;verify mismatch&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;tag/CRC issues&lt;/span&gt;, or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;directory tail/cycle detection&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;— still without changing your application test logic.&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;br /&gt;Andreas&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: LittleFS: File Open Err: -14</title><link>https://devzone.nordicsemi.com/thread/565662?ContentTypeID=1</link><pubDate>Wed, 29 Apr 2026 08:24:59 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:1befc0cb-d5d8-47a5-aa1d-776ea2ff0648</guid><dc:creator>Musadiq</dc:creator><description>&lt;p&gt;&lt;strong&gt;Hi Nordic Team,&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I am following up on my previous post. I have done an isolated stress test on a fresh LittleFS sample project to narrow down the issue.&lt;/p&gt;
&lt;hr class="border-border-200 border-t-0.5 my-3 mx-1.5" /&gt;
&lt;p&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li class="whitespace-normal break-words pl-2"&gt;Board: nRF5340 custom PCB&lt;/li&gt;
&lt;li class="whitespace-normal break-words pl-2"&gt;SDK: nRF Connect SDK 3.0.2&lt;/li&gt;
&lt;li class="whitespace-normal break-words pl-2"&gt;External flash: MX25L51245GZ2I-08G (64MB NOR, QSPI)&lt;/li&gt;
&lt;li class="whitespace-normal break-words pl-2"&gt;Filesystem: LittleFS via Zephyr fstab&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class="border-border-200 border-t-0.5 my-3 mx-1.5" /&gt;
&lt;p&gt;&lt;strong&gt;What I am doing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I am writing the same single file in a loop of 10,000 iterations &amp;mdash; overwriting it every time. The file is always the same name and always the same size. Flash is fully erased before the test starts. Only&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;DATA_SIZE&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;changes between tests runs. Everything else is identical.&lt;/p&gt;
&lt;hr class="border-border-200 border-t-0.5 my-3 mx-1.5" /&gt;
&lt;p&gt;&lt;strong&gt;Observation&lt;/strong&gt;&lt;/p&gt;
&lt;div class="overflow-x-auto w-full px-2 mb-6"&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;table&gt;
&lt;thead class="text-left"&gt;
&lt;tr&gt;
&lt;th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col"&gt;DATA_SIZE&lt;/th&gt;
&lt;th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold" scope="col"&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;270 bytes&lt;/td&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;-14 (EFAULT) at ~4000 writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;800 bytes&lt;/td&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;No error at 10000 writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;1024 bytes&lt;/td&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;No error at 10000 writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;4000 bytes&lt;/td&gt;
&lt;td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top"&gt;No error at 10000 writes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;strong&gt;Question:&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;What is causing -14 (EFAULT) specifically when writing a 270 byte file repeatedly but not when writing the file with size 800, 1024 or 4000?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;amp;qspi {&lt;br /&gt;pinctrl-0 = &amp;lt;&amp;amp;qspi_default&amp;gt;;&lt;br /&gt;pinctrl-1 = &amp;lt;&amp;amp;qspi_sleep&amp;gt;;&lt;br /&gt;pinctrl-names = &amp;quot;default&amp;quot;, &amp;quot;sleep&amp;quot;;&lt;/p&gt;
&lt;p&gt;mx25l512: mx25l51245g@0 {&lt;br /&gt;compatible = &amp;quot;nordic,qspi-nor&amp;quot;;&lt;br /&gt;reg = &amp;lt;0&amp;gt;;&lt;br /&gt;writeoc = &amp;quot;pp4io&amp;quot;;&lt;br /&gt;readoc = &amp;quot;read4io&amp;quot;;&lt;br /&gt;sck-frequency = &amp;lt;8000000&amp;gt;;&lt;br /&gt;jedec-id = [c2 20 1a];&lt;br /&gt;sfdp-bfp = [&lt;br /&gt;e5 20 fb ff ff ff ff 1f 44 eb 08 6b 08 3b 04 bb&lt;br /&gt;fe ff ff ff ff ff 00 ff ff ff 44 eb 0c 20 0f 52&lt;br /&gt;10 d8 00 ff d6 49 c5 00 81 df 04 e3 44 03 67 38&lt;br /&gt;30 b0 30 b0 f7 bd d5 5c 4a 9e 29 ff f0 50 f9 85&lt;br /&gt;];&lt;br /&gt;size = &amp;lt;0x20000000&amp;gt;;&lt;br /&gt;has-dpd;&lt;br /&gt;t-enter-dpd = &amp;lt;10000&amp;gt;;&lt;br /&gt;t-exit-dpd = &amp;lt;30000&amp;gt;;&lt;br /&gt;external_partition: partition {&lt;br /&gt;label = &amp;quot;external&amp;quot;;&lt;br /&gt;};&lt;br /&gt;};&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;fstab {&lt;br /&gt;compatible = &amp;quot;zephyr,fstab&amp;quot;;&lt;br /&gt;lfs1: lfs1 {&lt;br /&gt;compatible = &amp;quot;zephyr,fstab,littlefs&amp;quot;;&lt;br /&gt;mount-point = &amp;quot;/external&amp;quot;;&lt;br /&gt;partition = &amp;lt;&amp;amp;external_partition&amp;gt;;&lt;br /&gt;read-size = &amp;lt;16&amp;gt;;&lt;br /&gt;prog-size = &amp;lt;256&amp;gt;;&lt;br /&gt;cache-size = &amp;lt;4096&amp;gt;;&lt;br /&gt;lookahead-size = &amp;lt;512&amp;gt;;&lt;br /&gt;block-cycles = &amp;lt;500&amp;gt;;&lt;br /&gt;};&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Proj.conf&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;span&gt;CONFIG_MAIN_STACK_SIZE&lt;/span&gt;&lt;span&gt;=10240&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_HEAP_MEM_POOL_SIZE&lt;/span&gt;&lt;span&gt;=20480&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_MBEDTLS_HEAP_SIZE&lt;/span&gt;&lt;span&gt;=18432&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_FS_LITTLEFS_FC_HEAP_SIZE&lt;/span&gt;&lt;span&gt;=16384&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span&gt;# Debug&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_DEBUG&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;# Logging &amp;mdash; use IMMEDIATE so logs aren&amp;#39;t buffered/lost on quick exit&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_LOG&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_LOG_MODE_IMMEDIATE&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_LOG_BACKEND_UART&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;# Console/Serial&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_SERIAL&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_UART_CONSOLE&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_PRINTK&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span&gt;# Storage&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_FLASH&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_FLASH_MAP&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_FILE_SYSTEM&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_FILE_SYSTEM_LITTLEFS&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_APP_LITTLEFS_STORAGE_FLASH&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_CONSOLE&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_REBOOT&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_SPI&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;CONFIG_FLASH_JESD216_API&lt;/span&gt;&lt;span&gt;=y&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Refer the code below&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;#define DATA_SIZE (270)&lt;/p&gt;
&lt;p&gt;int fs_write_bytes_to_file(struct fs_mount_t *fs_mount_point,&lt;br /&gt;const char *abs_path,&lt;br /&gt;const uint8_t *data,&lt;br /&gt;int len)&lt;br /&gt;{&lt;br /&gt;if (fs_mount_point == NULL || abs_path == NULL || data == NULL)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: NULL argument&amp;quot;, __func__);&lt;br /&gt;return -EINVAL;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;if (len &amp;lt;= 0)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: invalid length %d&amp;quot;, __func__, len);&lt;br /&gt;return -EINVAL;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;char fname[MAX_PATH_LEN];&lt;br /&gt;int path_len = snprintf(fname, sizeof(fname), &amp;quot;%s/%s&amp;quot;,&lt;br /&gt;fs_mount_point-&amp;gt;mnt_point, abs_path);&lt;/p&gt;
&lt;p&gt;if (path_len &amp;lt; 0 || path_len &amp;gt;= (int)sizeof(fname))&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: path too long (%s/%s)&amp;quot;,&lt;br /&gt;__func__, fs_mount_point-&amp;gt;mnt_point, abs_path);&lt;br /&gt;return -ENAMETOOLONG;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;struct fs_file_t file;&lt;br /&gt;fs_file_t_init(&amp;amp;file);&lt;/p&gt;
&lt;p&gt;int rc = fs_open(&amp;amp;file, fname, FS_O_CREATE | FS_O_RDWR);&lt;br /&gt;if (rc &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: fs_open failed (%s) rc=%d&amp;quot;, __func__, fname, rc);&lt;br /&gt;return rc;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;rc = fs_write(&amp;amp;file, data, len);&lt;br /&gt;if (rc &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: fs_write failed (%s) rc=%d&amp;quot;, __func__, fname, rc);&lt;br /&gt;goto cleanup;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;if (rc != len)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: partial write (%s) wrote=%d expected=%d&amp;quot;,&lt;br /&gt;__func__, fname, rc, len);&lt;br /&gt;rc = -EIO;&lt;br /&gt;goto cleanup;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;rc = fs_sync(&amp;amp;file);&lt;br /&gt;if (rc &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: fs_sync failed (%s) rc=%d&amp;quot;, __func__, fname, rc);&lt;br /&gt;goto cleanup;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;rc = len;&lt;/p&gt;
&lt;p&gt;cleanup:&lt;br /&gt;int close_rc = fs_close(&amp;amp;file);&lt;br /&gt;if (close_rc &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;%s: fs_close failed (%s) rc=%d&amp;quot;, __func__, fname, close_rc);&lt;br /&gt;if (rc &amp;gt;= 0)&lt;br /&gt;rc = close_rc;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;return rc;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;int fs_write_data_file(const uint8_t *data, int size)&lt;br /&gt;{&lt;br /&gt;return fs_write_bytes_to_file(fs_external_mount_point,&lt;br /&gt;LOCKER_RSA_PUB_KEY_FILE,&lt;br /&gt;data, size);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;static int little_fs_stress_test1(void)&lt;br /&gt;{&lt;br /&gt;uint8_t dummy_data[DATA_SIZE];&lt;br /&gt;for (size_t i = 0; i &amp;lt; DATA_SIZE; i++)&lt;br /&gt;{&lt;br /&gt;dummy_data[i] = (uint8_t)(i &amp;amp; 0xFF);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;for (int i = 0; i &amp;lt; 10000; i++)&lt;br /&gt;{&lt;br /&gt;LOG_INF(&amp;quot;Writing file counter =:: %d&amp;quot;, i);&lt;br /&gt;fs_write_data_file(dummy_data, DATA_SIZE);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;struct fs_statvfs sbuf;&lt;br /&gt;int rc;&lt;/p&gt;
&lt;p&gt;rc = littlefs_mount(fs_external_mount_point);&lt;br /&gt;if (rc &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;LOG_ERR(&amp;quot;FAIL: mount external flash: %d&amp;quot;, rc);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;rc = fs_statvfs(fs_external_mount_point-&amp;gt;mnt_point, &amp;amp;sbuf);&lt;br /&gt;if (rc &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;LOG_PRINTK(&amp;quot;FAIL: statvfs: %d\n&amp;quot;, rc);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;LOG_PRINTK(&amp;quot;%s: bsize=%lu frsize=%lu blocks=%lu bfree=%lu\n&amp;quot;,&lt;br /&gt;fs_external_mount_point-&amp;gt;mnt_point,&lt;br /&gt;sbuf.f_bsize, sbuf.f_frsize,&lt;br /&gt;sbuf.f_blocks, sbuf.f_bfree);&lt;/p&gt;
&lt;p&gt;fs_flash_area_erase(fs_external_mount_point);&lt;br /&gt;little_fs_stress_test1();&lt;/p&gt;
&lt;p&gt;return 0;&lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: LittleFS: File Open Err: -14</title><link>https://devzone.nordicsemi.com/thread/565394?ContentTypeID=1</link><pubDate>Thu, 23 Apr 2026 11:42:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e4f940e9-a2d0-45b4-aa89-ec7105426372</guid><dc:creator>AHaug</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;LittleFS is an Arm module that is within Zephyr. Have you reported the issue in upstream Zephyr?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Error -14:&lt;/strong&gt;&lt;br /&gt;In Zephyr’s LittleFS glue layer, LFS_ERR_CORRUPT is mapped to -EFAULT, and EFAULT is 14 in the minimal C library, so the application sees -14 (not a generic “-EIO for corruption”).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Relevant mapping:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;pre class="ui-code" data-mode="text"&gt;static int lfs_to_errno(int error)
{
	if (error &amp;gt;= 0) {
		return error;
	}

	switch (error) {
	default:
	case LFS_ERR_IO:        /* Error during device operation */
		return -EIO;
	case LFS_ERR_CORRUPT:   /* Corrupted */
		return -EFAULT;&lt;/pre&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;So your log line matches metadata validation failing inside lfs_dir_fetchmatch (in your tree the user-visible Corrupted dir pair is emitted when the directory walk does not find a valid tag and treats the directory pair as corrupt):&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;	}

    LFS_ERROR(&amp;quot;Corrupted dir pair at {0x%&amp;quot;PRIx32&amp;quot;, 0x%&amp;quot;PRIx32&amp;quot;}&amp;quot;,
            dir-&amp;gt;pair[0], dir-&amp;gt;pair[1]);
    return LFS_ERR_CORRUPT;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The pair {0x1, 0x0} is worth noting: a 0 block in a directory pair is atypical in a healthy, mounted volume (often one block is the superblock area / invalid as a mdir copy). So either the on-flash structure is really damaged, or something (driver, POR, DPD, bad sync, or wrong read/prog geometry) is returning inconsistent contents for that metadata.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A few comments&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;64 MiB capacity&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;– you are not running out of space; this is a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;metadata / coherency&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;class of failure, not a simple&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;ENOSPC&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;story.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;LittleFS “does not support many files”&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in an absolute sense – v2 is designed to scale, but&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;a single directory with thousands of small files&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is a stress case: more directory compaction, more tags, and more work per open/list. It can expose bugs,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;too-small caches&lt;/span&gt;, or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;concurrency&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;issues faster than a sharded layout.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Method 1) Application and mount consistency&lt;br /&gt;You set file.mp = fs_external_mount_point but build the path with fs_mount_point-&amp;gt;mnt_point. If those two are not the same fs_mount_t*, the VFS can open using one mount and the path from another, which is a direct route to “impossible” metadata. Those must match.&lt;/p&gt;
&lt;p&gt;Also, the block right after fs_open:&lt;/p&gt;
&lt;p&gt;On success, rc == 0, so if (rc != 0) { ... fs_seek error ... never runs; that branch looks like a copy-paste error and suggests the function was not carefully validated.&lt;br /&gt;The return return rc &amp;lt; 0; returns 0/1, not the negative errno—worth fixing if anything depends on the actual error code.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;CONFIG_FS_LITTLEFS_FC_HEAP_SIZE=8192&lt;br /&gt;For heavy metadata churn (thousands of files in one directory), 8 KiB can be tight. Bumping the flash-cache heap (in line with Nordics’ guidance and your cache-size) is a cheap experiment to rule out allocation pressure during compaction.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Your read size / prog size is 16B. Make sure that this aligns properly to the macronix part you&amp;#39;re using (most are 256B pages).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Action items on you:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span&gt;Shard files across many subdirectories&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(e.g. 100–500 files per dir by hash, date, or prefix). This is the classic fix for “single huge directory” stress and makes debugging much easier.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Verify exclusive FS access&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(no other subsystem touching the same&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;qspi&lt;/code&gt;/&lt;code&gt;flash&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;region; no OTA, logging, or settings to overlapping partitions).&lt;/li&gt;
&lt;li&gt;&lt;span&gt;A/B test: DPD off, higher lookahead, align prog to flash page, increase LittleFS cache/FC heap&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;– controlled one change at a time.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Fix the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span&gt;file.mp&lt;/span&gt;&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs path&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;mnt_point&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;mismatch&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and clean up the Method 1 return/branch logic, then re-run the stress test.&lt;/li&gt;
&lt;li&gt;If corruption persists, collect&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;one failing dump&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(raw read of the blocks reported in the pair) and post it here with the exact N&lt;span&gt;CS version&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;west manifest&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SHA—this becomes either a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;driver&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;issue or a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;LittleFS&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;corner case with enough evidence to act on.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kind regards,&lt;br /&gt;Andreas&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>