From b9c544d8984d0d3b7ad714f1984ec81a5fe662e6 Mon Sep 17 00:00:00 2001 From: chenjing Date: Wed, 21 Apr 2021 16:16:08 +0800 Subject: [PATCH 1/2] Description: [fix]ftruncate bugfix Bug: #I3NEVN Test: --- fs/fat/os_adapt/fatfs.c | 5 ++++- fs/fat/os_adapt/fatfs.h | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/fat/os_adapt/fatfs.c b/fs/fat/os_adapt/fatfs.c index 0ff14a06..8a671370 100644 --- a/fs/fat/os_adapt/fatfs.c +++ b/fs/fat/os_adapt/fatfs.c @@ -806,7 +806,10 @@ static FRESULT realloc_cluster(FILINFO *finfo, FFOBJID *obj, FSIZE_t size) if ((cclust == BAD_CLUSTER) || (cclust == DISK_ERROR)) { return FR_DISK_ERR; } - if (cclust != END_OF_FILE) { /* Remove extra cluster if existing */ + if ((obj->fs->fs_type == FS_FAT12 && cclust != FAT12_END_OF_FILE) || + (obj->fs->fs_type == FS_FAT16 && cclust != FAT16_END_OF_FILE) || + (obj->fs->fs_type == FS_FAT32 && cclust != FAT32_END_OF_FILE)) { + /* Remove extra cluster if existing */ result = remove_chain(obj, cclust, pclust); if (result != FR_OK) { return result; diff --git a/fs/fat/os_adapt/fatfs.h b/fs/fat/os_adapt/fatfs.h index 5610a3bd..f387a682 100644 --- a/fs/fat/os_adapt/fatfs.h +++ b/fs/fat/os_adapt/fatfs.h @@ -55,7 +55,9 @@ extern "C" { #define FAT32_MAXSIZE 0x100000000 #define BAD_CLUSTER 0x7FFFFFFF #define DISK_ERROR 0xFFFFFFFF -#define END_OF_FILE 0x0FFFFFFF +#define FAT12_END_OF_FILE 0x00000FFF +#define FAT16_END_OF_FILE 0x0000FFFF +#define FAT32_END_OF_FILE 0x0FFFFFFF #define FAT_ERROR (-1) /* MBR */ From 3027cfe5436a2d7802a9b264cc5e329ee5de116b Mon Sep 17 00:00:00 2001 From: JING Date: Thu, 22 Apr 2021 11:12:28 +0800 Subject: [PATCH 2/2] fix ftruncate --- fs/fat/os_adapt/fatfs.c | 18 ++++++++++++++---- fs/fat/os_adapt/fatfs.h | 6 +++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/fs/fat/os_adapt/fatfs.c b/fs/fat/os_adapt/fatfs.c index 8a671370..fd0f2210 100644 --- a/fs/fat/os_adapt/fatfs.c +++ b/fs/fat/os_adapt/fatfs.c @@ -171,6 +171,19 @@ int fatfs_2_vfs(int result) return status; } +static bool fatfs_is_last_cluster(FATFS *fs, DWORD cclust) +{ + switch (fs->fs_type) { + case FS_FAT12: + return (cclust == FAT12_END_OF_CLUSTER); + case FS_FAT16: + return (cclust == FAT16_END_OF_CLUSTER); + case FS_FAT32: + default: + return (cclust == FAT32_END_OF_CLUSTER); + } +} + static int fatfs_sync(unsigned long mountflags, FATFS *fs) { #ifdef LOSCFG_FS_FAT_CACHE @@ -806,10 +819,7 @@ static FRESULT realloc_cluster(FILINFO *finfo, FFOBJID *obj, FSIZE_t size) if ((cclust == BAD_CLUSTER) || (cclust == DISK_ERROR)) { return FR_DISK_ERR; } - if ((obj->fs->fs_type == FS_FAT12 && cclust != FAT12_END_OF_FILE) || - (obj->fs->fs_type == FS_FAT16 && cclust != FAT16_END_OF_FILE) || - (obj->fs->fs_type == FS_FAT32 && cclust != FAT32_END_OF_FILE)) { - /* Remove extra cluster if existing */ + if (!fatfs_is_last_cluster(obj->fs, cclust)) { /* Remove extra cluster if existing */ result = remove_chain(obj, cclust, pclust); if (result != FR_OK) { return result; diff --git a/fs/fat/os_adapt/fatfs.h b/fs/fat/os_adapt/fatfs.h index f387a682..a7f63089 100644 --- a/fs/fat/os_adapt/fatfs.h +++ b/fs/fat/os_adapt/fatfs.h @@ -55,9 +55,9 @@ extern "C" { #define FAT32_MAXSIZE 0x100000000 #define BAD_CLUSTER 0x7FFFFFFF #define DISK_ERROR 0xFFFFFFFF -#define FAT12_END_OF_FILE 0x00000FFF -#define FAT16_END_OF_FILE 0x0000FFFF -#define FAT32_END_OF_FILE 0x0FFFFFFF +#define FAT12_END_OF_CLUSTER 0x00000FFF +#define FAT16_END_OF_CLUSTER 0x0000FFFF +#define FAT32_END_OF_CLUSTER 0x0FFFFFFF #define FAT_ERROR (-1) /* MBR */