fix: statfs can't get f_bfree and f_bavail of a FAT12/FAT16 partition

FAT12/FAT16 partition has no FSINFO sector storing the free cluster number,
so scanning the FAT is necessary to get the free clusters nums.

Close #I3Q0VS
This commit is contained in:
Far 2021-05-07 15:07:50 +08:00
parent 27ab6247a6
commit 9503c4a9fc
1 changed files with 13 additions and 1 deletions

View File

@ -1141,6 +1141,9 @@ int fatfs_umount(struct Mount *mnt, struct Vnode **blkdriver)
int fatfs_statfs(struct Mount *mnt, struct statfs *info)
{
FATFS *fs = (FATFS *)mnt->data;
DWORD nclst = 0;
FRESULT result = FR_OK;
int ret;
info->f_type = MSDOS_SUPER_MAGIC;
#if FF_MAX_SS != FF_MIN_SS
@ -1149,8 +1152,17 @@ int fatfs_statfs(struct Mount *mnt, struct statfs *info)
info->f_bsize = FF_MIN_SS * fs->csize;
#endif
info->f_blocks = fs->n_fatent;
ret = lock_fs(fs);
if (ret == FALSE) {
return -EBUSY;
}
/* free cluster is unavailable, update it */
if (fs->free_clst == DISK_ERROR) {
result = fat_count_free_entries(&nclst, fs);
}
info->f_bfree = fs->free_clst;
info->f_bavail = fs->free_clst;
unlock_fs(fs, result);
#if FF_USE_LFN
/* Maximum length of filenames */
@ -1166,7 +1178,7 @@ int fatfs_statfs(struct Mount *mnt, struct statfs *info)
info->f_ffree = 0;
info->f_flags = mnt->mountFlags;
return 0;
return -fatfs_2_vfs(result);
}
static inline int GET_SECONDS(WORD ftime)