From 502c3d02437a5ecc0b94a937076b51171f82d18d Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 17 Oct 2017 14:00:01 +0800 Subject: [PATCH] vfs,fat: add fsync to VFS interface, implement it for fatfs --- components/fatfs/src/vfs_fat.c | 18 ++++++++++++++++++ components/vfs/include/esp_vfs.h | 4 ++++ components/vfs/vfs.c | 14 ++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/components/fatfs/src/vfs_fat.c b/components/fatfs/src/vfs_fat.c index 9b33bd20e6..a0eaaa3b40 100644 --- a/components/fatfs/src/vfs_fat.c +++ b/components/fatfs/src/vfs_fat.c @@ -52,6 +52,7 @@ static int vfs_fat_open(void* ctx, const char * path, int flags, int mode); static int vfs_fat_close(void* ctx, int fd); static int vfs_fat_fstat(void* ctx, int fd, struct stat * st); static int vfs_fat_stat(void* ctx, const char * path, struct stat * st); +static int vfs_fat_fsync(void* ctx, int fd); static int vfs_fat_link(void* ctx, const char* n1, const char* n2); static int vfs_fat_unlink(void* ctx, const char *path); static int vfs_fat_rename(void* ctx, const char *src, const char *dst); @@ -109,6 +110,7 @@ esp_err_t esp_vfs_fat_register(const char* base_path, const char* fat_drive, siz .close_p = &vfs_fat_close, .fstat_p = &vfs_fat_fstat, .stat_p = &vfs_fat_stat, + .fsync_p = &vfs_fat_fsync, .link_p = &vfs_fat_link, .unlink_p = &vfs_fat_unlink, .rename_p = &vfs_fat_rename, @@ -322,6 +324,22 @@ static ssize_t vfs_fat_read(void* ctx, int fd, void * dst, size_t size) return read; } +static int vfs_fat_fsync(void* ctx, int fd) +{ + vfs_fat_ctx_t* fat_ctx = (vfs_fat_ctx_t*) ctx; + _lock_acquire(&fat_ctx->lock); + FIL* file = &fat_ctx->files[fd]; + FRESULT res = f_sync(file); + int rc = 0; + if (res != FR_OK) { + ESP_LOGD(TAG, "%s: fresult=%d", __func__, res); + errno = fresult_to_errno(res); + rc = -1; + } + _lock_release(&fat_ctx->lock); + return rc; +} + static int vfs_fat_close(void* ctx, int fd) { vfs_fat_ctx_t* fat_ctx = (vfs_fat_ctx_t*) ctx; diff --git a/components/vfs/include/esp_vfs.h b/components/vfs/include/esp_vfs.h index bd1cf322c2..9cd8e5e569 100644 --- a/components/vfs/include/esp_vfs.h +++ b/components/vfs/include/esp_vfs.h @@ -162,6 +162,10 @@ typedef struct int (*ioctl_p)(void* ctx, int fd, int cmd, va_list args); int (*ioctl)(int fd, int cmd, va_list args); }; + union { + int (*fsync_p)(void* ctx, int fd); + int (*fsync)(int fd); + }; } esp_vfs_t; diff --git a/components/vfs/vfs.c b/components/vfs/vfs.c index 24fde2e306..92f60b6029 100644 --- a/components/vfs/vfs.c +++ b/components/vfs/vfs.c @@ -534,3 +534,17 @@ int ioctl(int fd, int cmd, ...) va_end(args); return ret; } + +int fsync(int fd) +{ + const vfs_entry_t* vfs = get_vfs_for_fd(fd); + struct _reent* r = __getreent(); + if (vfs == NULL) { + __errno_r(r) = EBADF; + return -1; + } + int local_fd = translate_fd(vfs, fd); + int ret; + CHECK_AND_CALL(ret, r, vfs, fsync, local_fd); + return ret; +}