提交 c89d5197 编写于 作者: O openharmony_ci 提交者: Gitee

!26 解决【轻内核子系统】集成测试fs模块storage下有失败用例问题

Merge pull request !26 from wanghao-free/OpenHarmony_1.0.1_release
...@@ -2893,6 +2893,24 @@ static FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ ...@@ -2893,6 +2893,24 @@ static FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */
return res; return res;
} }
#define FAT12_END_OF_CLUSTER 0x00000FFF
#define FAT16_END_OF_CLUSTER 0x0000FFFF
#define FAT32_END_OF_CLUSTER 0x0FFFFFFF
#define DISK_ERROR 0xFFFFFFFF
static DWORD get_end_of_cluster(FATFS *fs)
{
switch (fs->fs_type) {
case FS_FAT12:
return FAT12_END_OF_CLUSTER;
case FS_FAT16:
return FAT16_END_OF_CLUSTER;
case FS_FAT32:
return FAT32_END_OF_CLUSTER;
default:
return DISK_ERROR;
}
}
static static
UINT get_clustinfo(FIL* fp, UINT get_clustinfo(FIL* fp,
...@@ -2901,6 +2919,7 @@ UINT get_clustinfo(FIL* fp, ...@@ -2901,6 +2919,7 @@ UINT get_clustinfo(FIL* fp,
{ {
UINT count = 0; UINT count = 0;
DWORD fsclust = 0, val; DWORD fsclust = 0, val;
DWORD last_clust = get_end_of_cluster(fp->obj.fs);
if (fp->obj.sclust != 0) { if (fp->obj.sclust != 0) {
val = fp->obj.sclust; val = fp->obj.sclust;
...@@ -2908,7 +2927,7 @@ UINT get_clustinfo(FIL* fp, ...@@ -2908,7 +2927,7 @@ UINT get_clustinfo(FIL* fp,
fsclust = val; fsclust = val;
val = get_fat(&fp->obj, fsclust); val = get_fat(&fp->obj, fsclust);
count++; count++;
} while ((val != 0x0FFFFFFF) && (val != 1)); } while ((val != last_clust) && (val != 1));
} }
*fclust = fsclust; *fclust = fsclust;
return count; return count;
...@@ -3189,13 +3208,14 @@ FRESULT f_open ( ...@@ -3189,13 +3208,14 @@ FRESULT f_open (
if (res == FR_OK && (mode & ~FA_READ) && ISVIRPART(fs) && if (res == FR_OK && (mode & ~FA_READ) && ISVIRPART(fs) &&
(ISCHILD(fs) || (ISPARENT(fs) && fs->st_clst != 0xFFFFFFFF && fs->ct_clst != 0xFFFFFFFF))) { (ISCHILD(fs) || (ISPARENT(fs) && fs->st_clst != 0xFFFFFFFF && fs->ct_clst != 0xFFFFFFFF))) {
clst = fp->obj.sclust; clst = fp->obj.sclust;
cl = get_end_of_cluster(fs);
if (clst != 0) { if (clst != 0) {
while (1) { while (1) {
if (clst == 0xFFFFFFFF) { if (clst == 0xFFFFFFFF) {
res = FR_DISK_ERR; res = FR_DISK_ERR;
break; break;
} }
if (clst == 0x0FFFFFFF) { if (clst == cl) { /* ls the end of the cluster? */
res = FR_OK; res = FR_OK;
break; break;
} }
...@@ -3400,7 +3420,10 @@ FRESULT f_write ( ...@@ -3400,7 +3420,10 @@ FRESULT f_write (
clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */
} }
} }
if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ if (clst == 0) { /* Could not allocate a new cluster (disk full) */
res = FR_NO_SPACE_LEFT;
break;
}
if (clst == 1) ABORT(fs, FR_INT_ERR); if (clst == 1) ABORT(fs, FR_INT_ERR);
if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);
fp->clust = clst; /* Update current cluster */ fp->clust = clst; /* Update current cluster */
...@@ -3481,7 +3504,7 @@ FRESULT f_write ( ...@@ -3481,7 +3504,7 @@ FRESULT f_write (
fp->flag |= FA_MODIFIED; /* Set file change flag */ fp->flag |= FA_MODIFIED; /* Set file change flag */
LEAVE_FF(fs, FR_OK); LEAVE_FF(fs, res);
} }
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
...@@ -3848,7 +3871,9 @@ FRESULT f_lseek ( ...@@ -3848,7 +3871,9 @@ FRESULT f_lseek (
if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ if (fp->flag & FA_WRITE) { /* Check if in write mode or not */
clst = create_chain(&fp->obj, clst); /* Follow chain with forceed stretch */ clst = create_chain(&fp->obj, clst); /* Follow chain with forceed stretch */
if (clst == 0) { /* Clip file size in case of disk full */ if (clst == 0) { /* Clip file size in case of disk full */
ofs = 0; break; ofs = 0;
res = FR_NO_SPACE_LEFT;
break;
} }
} else } else
#endif #endif
...@@ -4198,7 +4223,7 @@ FRESULT f_truncate ( ...@@ -4198,7 +4223,7 @@ FRESULT f_truncate (
{ {
FRESULT res; FRESULT res;
FATFS *fs; FATFS *fs;
DWORD n, tcl, val, count, fclust = 0; DWORD n, tcl, val, count, fclust = 0, last_clust;
res = validate(&fp->obj, &fs); /* Check validity of the file object */ res = validate(&fp->obj, &fs); /* Check validity of the file object */
if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);
...@@ -4212,6 +4237,7 @@ FRESULT f_truncate ( ...@@ -4212,6 +4237,7 @@ FRESULT f_truncate (
n = (DWORD)fs->csize * SS(fs); /* Cluster size */ n = (DWORD)fs->csize * SS(fs); /* Cluster size */
tcl = (DWORD)(length / n) + ((length & (n - 1)) ? 1 : 0); /* Number of clusters required */ tcl = (DWORD)(length / n) + ((length & (n - 1)) ? 1 : 0); /* Number of clusters required */
val = fp->obj.sclust; val = fp->obj.sclust;
last_clust = get_end_of_cluster(fs);
count = 0; count = 0;
do { do {
fclust = val; fclust = val;
...@@ -4219,7 +4245,7 @@ FRESULT f_truncate ( ...@@ -4219,7 +4245,7 @@ FRESULT f_truncate (
count ++; count ++;
if (count == tcl) if (count == tcl)
break; break;
} while ((val != 0x0FFFFFFF) && (val != 1) && (val != 0xFFFFFFFF)); } while ((val != last_clust) && (val != 1) && (val != 0xFFFFFFFF));
res = FR_OK; res = FR_OK;
if (val == 0xFFFFFFFF) res = FR_DISK_ERR; if (val == 0xFFFFFFFF) res = FR_DISK_ERR;
...@@ -4273,6 +4299,7 @@ FRESULT f_unlink ( ...@@ -4273,6 +4299,7 @@ FRESULT f_unlink (
FRESULT res; FRESULT res;
DIR dj, sdj; DIR dj, sdj;
DWORD dclst = 0; DWORD dclst = 0;
DWORD last_clust = 1;
FATFS *fs; FATFS *fs;
#if FF_FS_REENTRANT #if FF_FS_REENTRANT
FATFS *fs_bak; FATFS *fs_bak;
...@@ -4318,6 +4345,7 @@ FRESULT f_unlink ( ...@@ -4318,6 +4345,7 @@ FRESULT f_unlink (
if (res == FR_OK && ISVIRPART(fs)) { if (res == FR_OK && ISVIRPART(fs)) {
dj.atrootdir = 0;rtclst = 2; dj.atrootdir = 0;rtclst = 2;
st_bak = PARENTFS(dj.obj.fs)->winsect; st_bak = PARENTFS(dj.obj.fs)->winsect;
last_clust = get_end_of_cluster(fs);
/* Follow the root directory cluster chain */ /* Follow the root directory cluster chain */
for (;;) { for (;;) {
#if FF_FS_REENTRANT #if FF_FS_REENTRANT
...@@ -4325,7 +4353,7 @@ FRESULT f_unlink ( ...@@ -4325,7 +4353,7 @@ FRESULT f_unlink (
#else #else
if (rtclst == 0xFFFFFFFF) LEAVE_FF(fs,FR_DISK_ERR); if (rtclst == 0xFFFFFFFF) LEAVE_FF(fs,FR_DISK_ERR);
#endif #endif
if (rtclst == 0x0FFFFFFF) break; if (rtclst == last_clust) break;
#if FF_FS_REENTRANT #if FF_FS_REENTRANT
if (rtclst < 2 || rtclst >= fs->n_fatent) LEAVE_FF(fs_bak,FR_INT_ERR); if (rtclst < 2 || rtclst >= fs->n_fatent) LEAVE_FF(fs_bak,FR_INT_ERR);
if (rtclst == 0 || rtclst == 1) LEAVE_FF(fs_bak,FR_INT_ERR); if (rtclst == 0 || rtclst == 1) LEAVE_FF(fs_bak,FR_INT_ERR);
...@@ -4563,6 +4591,7 @@ FRESULT f_rename ( ...@@ -4563,6 +4591,7 @@ FRESULT f_rename (
#ifdef LOSCFG_FS_FAT_VIRTUAL_PARTITION #ifdef LOSCFG_FS_FAT_VIRTUAL_PARTITION
DWORD rtclst = 0; DWORD rtclst = 0;
DWORD st_bak = 0; DWORD st_bak = 0;
DWORD last_clust = 0;
#endif #endif
DEF_NAMBUF DEF_NAMBUF
...@@ -4600,16 +4629,17 @@ FRESULT f_rename ( ...@@ -4600,16 +4629,17 @@ FRESULT f_rename (
if (res == FR_OK && ISVIRPART(fs)) { if (res == FR_OK && ISVIRPART(fs)) {
djo.atrootdir = 0;rtclst = 2; djo.atrootdir = 0;rtclst = 2;
st_bak = PARENTFS(djo.obj.fs)->winsect; st_bak = PARENTFS(djo.obj.fs)->winsect;
last_clust = get_end_of_cluster(fs);
/* Follow the root directory cluster chain */ /* Follow the root directory cluster chain */
for (;;) { for (;;) {
#if FF_FS_REENTRANT #if FF_FS_REENTRANT
if (rtclst == 0xFFFFFFFF) LEAVE_FF(fs_bak,FR_DISK_ERR); if (rtclst == 0xFFFFFFFF) LEAVE_FF(fs_bak,FR_DISK_ERR);
if (rtclst == 0x0FFFFFFF) break; if (rtclst == last_clust) break;
if (rtclst < 2 || rtclst >= fs->n_fatent) LEAVE_FF(fs_bak,FR_INT_ERR); if (rtclst < 2 || rtclst >= fs->n_fatent) LEAVE_FF(fs_bak,FR_INT_ERR);
if (rtclst == 0 || rtclst == 1) LEAVE_FF(fs_bak,FR_INT_ERR); if (rtclst == 0 || rtclst == 1) LEAVE_FF(fs_bak,FR_INT_ERR);
#else #else
if (rtclst == 0xFFFFFFFF) LEAVE_FF(fs,FR_DISK_ERR); if (rtclst == 0xFFFFFFFF) LEAVE_FF(fs,FR_DISK_ERR);
if (rtclst == 0x0FFFFFFF) break; if (rtclst == last_clust) break;
if (rtclst < 2 || rtclst >= fs->n_fatent) LEAVE_FF(fs,FR_INT_ERR); if (rtclst < 2 || rtclst >= fs->n_fatent) LEAVE_FF(fs,FR_INT_ERR);
if (rtclst == 0 || rtclst == 1) LEAVE_FF(fs,FR_INT_ERR); if (rtclst == 0 || rtclst == 1) LEAVE_FF(fs,FR_INT_ERR);
#endif #endif
...@@ -5111,13 +5141,14 @@ FRESULT f_expand ( ...@@ -5111,13 +5141,14 @@ FRESULT f_expand (
#endif #endif
} else { /* Reached error, remove the chain which built before */ } else { /* Reached error, remove the chain which built before */
clst = scl; clst = scl;
lclst = get_end_of_cluster(fs); /* Get the end of cluster chain */
for (;;) { for (;;) {
n = get_fat(&fp->obj, clst); n = get_fat(&fp->obj, clst);
if (n == 1 || n == 0) { res = FR_INT_ERR; break; } if (n == 1 || n == 0) { res = FR_INT_ERR; break; }
if (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } if (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; }
res = put_fat(fs, clst, 0); res = put_fat(fs, clst, 0);
if (res != FR_OK) break; if (res != FR_OK) break;
if (n == 0x0FFFFFFF) break; /* If the current cluster is the last cluster ,the finish this operation */ if (n == lclst) break; /* If the current cluster is the last cluster ,the finish this operation */
clst = n; clst = n;
} }
res = put_fat(fs, fclust, 0xFFFFFFFF); res = put_fat(fs, fclust, 0xFFFFFFFF);
...@@ -6187,7 +6218,7 @@ FRESULT f_fcheckfat(DIR_FILE* dir_info) ...@@ -6187,7 +6218,7 @@ FRESULT f_fcheckfat(DIR_FILE* dir_info)
res = FR_INT_ERR; res = FR_INT_ERR;
LEAVE_FF(fs, res); LEAVE_FF(fs, res);
} }
if (val == 0x0FFFFFFF) { if (val == get_end_of_cluster(fs)) {
res = FR_OK; res = FR_OK;
LEAVE_FF(fs, res); LEAVE_FF(fs, res);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册