This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit a2fa740c2ecea2916889e74c72edb529a1a7c93e
Author: chao an <[email protected]>
AuthorDate: Wed Nov 4 09:58:08 2026 +0800

    drivers/misc: Preserve flush retry and passthrough
    
    Keep dirty rwbuffer data retryable after asynchronous flush failures and 
preserve the FTL BIOC_FLUSH passthrough on successful buffer flushes.
    
    Signed-off-by: chao an <[email protected]>
---
 drivers/misc/rwbuffer.c | 18 ++++++++++++++++--
 drivers/mtd/ftl.c       |  7 ++++++-
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/drivers/misc/rwbuffer.c b/drivers/misc/rwbuffer.c
index 7480a5996af..da5dfffc1b9 100644
--- a/drivers/misc/rwbuffer.c
+++ b/drivers/misc/rwbuffer.c
@@ -64,6 +64,9 @@
 
 static ssize_t rwb_read_(FAR struct rwbuffer_s *rwb, off_t startblock,
                          size_t nblocks, FAR uint8_t *rdbuffer);
+#ifdef CONFIG_DRVR_WRITEBUFFER
+static void rwb_wrstarttimeout(FAR struct rwbuffer_s *rwb);
+#endif
 
 /****************************************************************************
  * Private Functions
@@ -199,6 +202,7 @@ static void rwb_wrtimeout(FAR void *arg)
   /* The following assumes that the size of a pointer is 4-bytes or less */
 
   FAR struct rwbuffer_s *rwb = (FAR struct rwbuffer_s *)arg;
+  int ret;
 
   DEBUGASSERT(rwb != NULL);
 
@@ -209,8 +213,18 @@ static void rwb_wrtimeout(FAR void *arg)
    * worker thread.
    */
 
-  rwb_lock(&rwb->wrlock);
-  rwb_wrflush(rwb);
+  ret = rwb_lock(&rwb->wrlock);
+  if (ret < 0)
+    {
+      return;
+    }
+
+  ret = rwb_wrflush(rwb);
+  if (ret < 0)
+    {
+      rwb_wrstarttimeout(rwb);
+    }
+
   rwb_unlock(&rwb->wrlock);
 }
 #endif
diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c
index 24d85119020..aff7f13926c 100644
--- a/drivers/mtd/ftl.c
+++ b/drivers/mtd/ftl.c
@@ -797,6 +797,7 @@ static ssize_t ftl_write(FAR struct inode *inode,
   if (dev->oflags & O_DIRECT)
     {
       ssize_t ret = ftl_flush(dev, buffer, start_sector, nsectors);
+
       return ret < 0 ? ret : nsectors;
     }
 
@@ -870,7 +871,11 @@ static int ftl_ioctl(FAR struct inode *inode, int cmd, 
unsigned long arg)
   if (cmd == BIOC_FLUSH)
     {
 #ifdef CONFIG_FTL_WRITEBUFFER
-      return rwb_flush(&dev->rwb);
+      ret = rwb_flush(&dev->rwb);
+      if (ret < 0)
+        {
+          return ret;
+        }
 #endif
     }
 

Reply via email to