diff --git a/fs/fat/os_adapt/fatfs.c b/fs/fat/os_adapt/fatfs.c index 0ff14a06..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,7 +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 (cclust != 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 5610a3bd..a7f63089 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_CLUSTER 0x00000FFF +#define FAT16_END_OF_CLUSTER 0x0000FFFF +#define FAT32_END_OF_CLUSTER 0x0FFFFFFF #define FAT_ERROR (-1) /* MBR */