mirror of
https://github.com/espressif/esp-idf
synced 2025-03-10 09:39:10 -04:00
Merge branch 'feat/spiffs_fsync' into 'master'
feat(spiffs): add fsync() support to SPIFFS VFS driver See merge request espressif/esp-idf!32420
This commit is contained in:
commit
9542d452bf
@ -58,6 +58,7 @@ static ssize_t vfs_spiffs_read(void* ctx, int fd, void * dst, size_t size);
|
|||||||
static int vfs_spiffs_close(void* ctx, int fd);
|
static int vfs_spiffs_close(void* ctx, int fd);
|
||||||
static off_t vfs_spiffs_lseek(void* ctx, int fd, off_t offset, int mode);
|
static off_t vfs_spiffs_lseek(void* ctx, int fd, off_t offset, int mode);
|
||||||
static int vfs_spiffs_fstat(void* ctx, int fd, struct stat * st);
|
static int vfs_spiffs_fstat(void* ctx, int fd, struct stat * st);
|
||||||
|
static int vfs_spiffs_fsync(void* ctx, int fd);
|
||||||
#ifdef CONFIG_VFS_SUPPORT_DIR
|
#ifdef CONFIG_VFS_SUPPORT_DIR
|
||||||
static int vfs_spiffs_stat(void* ctx, const char * path, struct stat * st);
|
static int vfs_spiffs_stat(void* ctx, const char * path, struct stat * st);
|
||||||
static int vfs_spiffs_unlink(void* ctx, const char *path);
|
static int vfs_spiffs_unlink(void* ctx, const char *path);
|
||||||
@ -426,6 +427,7 @@ esp_err_t esp_vfs_spiffs_register(const esp_vfs_spiffs_conf_t * conf)
|
|||||||
.open_p = &vfs_spiffs_open,
|
.open_p = &vfs_spiffs_open,
|
||||||
.close_p = &vfs_spiffs_close,
|
.close_p = &vfs_spiffs_close,
|
||||||
.fstat_p = &vfs_spiffs_fstat,
|
.fstat_p = &vfs_spiffs_fstat,
|
||||||
|
.fsync_p = &vfs_spiffs_fsync,
|
||||||
#ifdef CONFIG_VFS_SUPPORT_DIR
|
#ifdef CONFIG_VFS_SUPPORT_DIR
|
||||||
.stat_p = &vfs_spiffs_stat,
|
.stat_p = &vfs_spiffs_stat,
|
||||||
.link_p = &vfs_spiffs_link,
|
.link_p = &vfs_spiffs_link,
|
||||||
@ -617,6 +619,18 @@ static int vfs_spiffs_fstat(void* ctx, int fd, struct stat * st)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vfs_spiffs_fsync(void* ctx, int fd)
|
||||||
|
{
|
||||||
|
esp_spiffs_t * efs = (esp_spiffs_t *)ctx;
|
||||||
|
int res = SPIFFS_fflush(efs->fs, fd);
|
||||||
|
if (res < 0) {
|
||||||
|
errno = spiffs_res_to_errno(SPIFFS_errno(efs->fs));
|
||||||
|
SPIFFS_clearerr(efs->fs);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_VFS_SUPPORT_DIR
|
#ifdef CONFIG_VFS_SUPPORT_DIR
|
||||||
|
|
||||||
static int vfs_spiffs_stat(void* ctx, const char * path, struct stat * st)
|
static int vfs_spiffs_stat(void* ctx, const char * path, struct stat * st)
|
||||||
|
@ -285,6 +285,37 @@ static void test_spiffs_ftruncate(const char *filename)
|
|||||||
TEST_ASSERT_EQUAL(0, close(fd));
|
TEST_ASSERT_EQUAL(0, close(fd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_spiffs_fsync(const char *filename)
|
||||||
|
{
|
||||||
|
const char input[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
size_t expected_size = strlen(input);
|
||||||
|
|
||||||
|
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC);
|
||||||
|
TEST_ASSERT_NOT_EQUAL(-1, fd);
|
||||||
|
|
||||||
|
ssize_t wr = write(fd, input, expected_size);
|
||||||
|
TEST_ASSERT_NOT_EQUAL(-1, wr);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL(0, fsync(fd));
|
||||||
|
struct stat st;
|
||||||
|
TEST_ASSERT_EQUAL(0, stat(filename, &st));
|
||||||
|
TEST_ASSERT_EQUAL(wr, st.st_size);
|
||||||
|
|
||||||
|
ssize_t wr2 = write(fd, input, expected_size);
|
||||||
|
TEST_ASSERT_NOT_EQUAL(-1, wr2);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL(0, fsync(fd));
|
||||||
|
TEST_ASSERT_EQUAL(0, stat(filename, &st));
|
||||||
|
TEST_ASSERT_EQUAL(wr + wr2, st.st_size);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL(0, ftruncate(fd, wr));
|
||||||
|
TEST_ASSERT_EQUAL(0, fsync(fd));
|
||||||
|
TEST_ASSERT_EQUAL(0, stat(filename, &st));
|
||||||
|
TEST_ASSERT_EQUAL(wr, st.st_size);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL(0, close(fd));
|
||||||
|
}
|
||||||
|
|
||||||
static void test_spiffs_can_opendir(const char* path)
|
static void test_spiffs_can_opendir(const char* path)
|
||||||
{
|
{
|
||||||
char name_dir_file[64];
|
char name_dir_file[64];
|
||||||
@ -710,6 +741,13 @@ TEST_CASE("ftruncate a file", "[spiffs]")
|
|||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("fsync works correctly", "[spiffs]")
|
||||||
|
{
|
||||||
|
test_setup();
|
||||||
|
test_spiffs_fsync("/spiffs/fsync.txt");
|
||||||
|
test_teardown();
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("can opendir root directory of FS", "[spiffs]")
|
TEST_CASE("can opendir root directory of FS", "[spiffs]")
|
||||||
{
|
{
|
||||||
test_setup();
|
test_setup();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user