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 */