You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2020/01/09 12:38:43 UTC
[incubator-nuttx] 06/07: drivers: mtd: smart: Fix duplicate sector
selection in SmartFS
This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch pr66
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 60927c5fb6a353994341601f55071c618e97682b
Author: Alin Jerpelea <al...@sony.com>
AuthorDate: Thu Dec 28 18:27:21 2017 +0900
drivers: mtd: smart: Fix duplicate sector selection in SmartFS
Add care for 16-bit sequence without CRC.
---
drivers/mtd/smart.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/smart.c b/drivers/mtd/smart.c
index e011195..f9c9b2a 100644
--- a/drivers/mtd/smart.c
+++ b/drivers/mtd/smart.c
@@ -1874,6 +1874,7 @@ static int smart_scan(FAR struct smart_struct_s *dev)
uint32_t offset;
uint16_t seq1;
uint16_t seq2;
+ uint16_t seqwrap;
struct smart_sect_header_s header;
#ifdef CONFIG_MTD_SMART_MINIMIZE_RAM
int dupsector;
@@ -2179,7 +2180,8 @@ static int smart_scan(FAR struct smart_struct_s *dev)
*/
#if SMART_STATUS_VERSION == 1
- if (header.status & SMART_STATUS_CRC)
+ if ((header.status & SMART_STATUS_CRC) !=
+ (CONFIG_SMARTFS_ERASEDSTATE & SMART_STATUS_CRC))
{
seq2 = header.seq;
}
@@ -2266,21 +2268,25 @@ static int smart_scan(FAR struct smart_struct_s *dev)
}
#if SMART_STATUS_VERSION == 1
- if (header.status & SMART_STATUS_CRC)
+ if ((header.status & SMART_STATUS_CRC) !=
+ (CONFIG_SMARTFS_ERASEDSTATE & SMART_STATUS_CRC))
{
seq1 = header.seq;
+ seqwrap = 0xf0;
}
else
{
seq1 = *((FAR uint16_t *) &header.seq);
+ seqwrap = 0xfff0;
}
#else
seq1 = header.seq;
+ seqwrap = 0xf0;
#endif
/* Now determine who wins */
- if ((seq1 > 0xfff0 && seq2 < 10) || seq2 > seq1)
+ if ((seq1 > seqwrap && seq2 < 10) || seq2 > seq1)
{
/* Seq 2 is the winner ... bigger or it wrapped */
@@ -3222,7 +3228,8 @@ static int smart_relocate_sector(FAR struct smart_struct_s *dev,
/* Increment the sequence number and clear the "commit" flag */
#if SMART_STATUS_VERSION == 1
- if (header->status & SMART_STATUS_CRC)
+ if ((header->status & SMART_STATUS_CRC) !=
+ (CONFIG_SMARTFS_ERASEDSTATE & SMART_STATUS_CRC))
{
#endif
/* Using 8-bit sequence */
@@ -4571,7 +4578,8 @@ static int smart_writesector(FAR struct smart_struct_s *dev,
/* Update the sequence number to indicate the sector was moved */
#if SMART_STATUS_VERSION == 1
- if (header->status & SMART_STATUS_CRC)
+ if ((header->status & SMART_STATUS_CRC) !=
+ (CONFIG_SMARTFS_ERASEDSTATE & SMART_STATUS_CRC))
{
#endif
header->seq++;