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 }
