diff --git a/lfs.c b/lfs.c index eea7ae3..6088b4e 100644 --- a/lfs.c +++ b/lfs.c @@ -1403,7 +1403,9 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { return err; } - if ((file->flags & LFS_F_DIRTY) && !lfs_pairisnull(file->pair)) { + if ((file->flags & LFS_F_DIRTY) && + !(file->flags & LFS_F_ERRED) && + !lfs_pairisnull(file->pair)) { // update dir entry lfs_dir_t cwd; int err = lfs_dir_fetch(lfs, &cwd, file->pair); @@ -1537,6 +1539,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, file->head, file->size, file->pos-1, &file->block, &file->off); if (err) { + file->flags |= LFS_F_ERRED; return err; } @@ -1550,6 +1553,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, file->block, file->pos, &file->block, &file->off); if (err) { + file->flags |= LFS_F_ERRED; return err; } @@ -1565,6 +1569,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, if (err == LFS_ERR_CORRUPT) { goto relocate; } + file->flags |= LFS_F_ERRED; return err; } @@ -1572,6 +1577,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, relocate: err = lfs_file_relocate(lfs, file); if (err) { + file->flags |= LFS_F_ERRED; return err; } } @@ -1584,6 +1590,7 @@ relocate: lfs_alloc_ack(lfs); } + file->flags &= ~LFS_F_ERRED; return size; } diff --git a/lfs.h b/lfs.h index e4aab0e..815c7d7 100644 --- a/lfs.h +++ b/lfs.h @@ -75,6 +75,7 @@ enum lfs_open_flags { LFS_F_DIRTY = 0x10000, // File does not match storage LFS_F_WRITING = 0x20000, // File has been written since last flush LFS_F_READING = 0x40000, // File has been read since last flush + LFS_F_ERRED = 0x80000, // An error occured during write }; // File seek flags diff --git a/tests/test_alloc.sh b/tests/test_alloc.sh index 630be2a..aaae655 100755 --- a/tests/test_alloc.sh +++ b/tests/test_alloc.sh @@ -121,6 +121,7 @@ tests/test.py << TEST size = strlen("exhaustion"); memcpy(buffer, "exhaustion", size); lfs_file_write(&lfs, &file[0], buffer, size) => size; + lfs_file_sync(&lfs, &file[0]) => 0; size = strlen("blahblahblahblah"); memcpy(buffer, "blahblahblahblah", size); @@ -142,6 +143,7 @@ tests/test.py << TEST lfs_mount(&lfs, &cfg) => 0; lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_RDONLY); size = strlen("exhaustion"); + lfs_file_size(&lfs, &file[0]) => size; lfs_file_read(&lfs, &file[0], buffer, size) => size; memcmp(buffer, "exhaustion", size) => 0; lfs_file_close(&lfs, &file[0]) => 0; @@ -166,6 +168,7 @@ tests/test.py << TEST size = strlen("exhaustion"); memcpy(buffer, "exhaustion", size); lfs_file_write(&lfs, &file[0], buffer, size) => size; + lfs_file_sync(&lfs, &file[0]) => 0; size = strlen("blahblahblahblah"); memcpy(buffer, "blahblahblahblah", size); @@ -187,6 +190,7 @@ tests/test.py << TEST lfs_mount(&lfs, &cfg) => 0; lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_RDONLY); size = strlen("exhaustion"); + lfs_file_size(&lfs, &file[0]) => size; lfs_file_read(&lfs, &file[0], buffer, size) => size; memcmp(buffer, "exhaustion", size) => 0; lfs_file_close(&lfs, &file[0]) => 0; @@ -196,14 +200,14 @@ TEST echo "--- Dir exhaustion test ---" tests/test.py << TEST lfs_mount(&lfs, &cfg) => 0; - lfs_stat(&lfs, "exhaustion", &info) => 0; - lfs_size_t fullsize = info.size; lfs_remove(&lfs, "exhaustion") => 0; lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); size = strlen("blahblahblahblah"); memcpy(buffer, "blahblahblahblah", size); - for (lfs_size_t i = 0; i < fullsize - 2*512; i += size) { + for (lfs_size_t i = 0; + i < (cfg.block_count-6)*(cfg.block_size-8); + i += size) { lfs_file_write(&lfs, &file[0], buffer, size) => size; } lfs_file_close(&lfs, &file[0]) => 0; @@ -214,7 +218,11 @@ tests/test.py << TEST lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_APPEND); size = strlen("blahblahblahblah"); memcpy(buffer, "blahblahblahblah", size); - lfs_file_write(&lfs, &file[0], buffer, size) => size; + for (lfs_size_t i = 0; + i < (cfg.block_size-8); + i += size) { + lfs_file_write(&lfs, &file[0], buffer, size) => size; + } lfs_file_close(&lfs, &file[0]) => 0; lfs_mkdir(&lfs, "exhaustiondir") => LFS_ERR_NOSPC; @@ -224,14 +232,14 @@ TEST echo "--- Chained dir exhaustion test ---" tests/test.py << TEST lfs_mount(&lfs, &cfg) => 0; - lfs_stat(&lfs, "exhaustion", &info) => 0; - lfs_size_t fullsize = info.size; - lfs_remove(&lfs, "exhaustion") => 0; + lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); size = strlen("blahblahblahblah"); memcpy(buffer, "blahblahblahblah", size); - for (lfs_size_t i = 0; i < fullsize - 19*512; i += size) { + for (lfs_size_t i = 0; + i < (cfg.block_count-24)*(cfg.block_size-8); + i += size) { lfs_file_write(&lfs, &file[0], buffer, size) => size; } lfs_file_close(&lfs, &file[0]) => 0; @@ -247,7 +255,9 @@ tests/test.py << TEST lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); size = strlen("blahblahblahblah"); memcpy(buffer, "blahblahblahblah", size); - for (lfs_size_t i = 0; i < fullsize - 20*512; i += size) { + for (lfs_size_t i = 0; + i < (cfg.block_count-26)*(cfg.block_size-8); + i += size) { lfs_file_write(&lfs, &file[0], buffer, size) => size; } lfs_file_close(&lfs, &file[0]) => 0;