Merge branch 'feature/fsync' into 'master'
vfs,fat: add fsync to VFS interface, implement it for fatfs See merge request !1412
This commit is contained in:
commit
2e8441df9e
3 changed files with 36 additions and 0 deletions
|
@ -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_close(void* ctx, int fd);
|
||||||
static int vfs_fat_fstat(void* ctx, int fd, struct stat * st);
|
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_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_link(void* ctx, const char* n1, const char* n2);
|
||||||
static int vfs_fat_unlink(void* ctx, const char *path);
|
static int vfs_fat_unlink(void* ctx, const char *path);
|
||||||
static int vfs_fat_rename(void* ctx, const char *src, const char *dst);
|
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,
|
.close_p = &vfs_fat_close,
|
||||||
.fstat_p = &vfs_fat_fstat,
|
.fstat_p = &vfs_fat_fstat,
|
||||||
.stat_p = &vfs_fat_stat,
|
.stat_p = &vfs_fat_stat,
|
||||||
|
.fsync_p = &vfs_fat_fsync,
|
||||||
.link_p = &vfs_fat_link,
|
.link_p = &vfs_fat_link,
|
||||||
.unlink_p = &vfs_fat_unlink,
|
.unlink_p = &vfs_fat_unlink,
|
||||||
.rename_p = &vfs_fat_rename,
|
.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;
|
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)
|
static int vfs_fat_close(void* ctx, int fd)
|
||||||
{
|
{
|
||||||
vfs_fat_ctx_t* fat_ctx = (vfs_fat_ctx_t*) ctx;
|
vfs_fat_ctx_t* fat_ctx = (vfs_fat_ctx_t*) ctx;
|
||||||
|
|
|
@ -162,6 +162,10 @@ typedef struct
|
||||||
int (*ioctl_p)(void* ctx, int fd, int cmd, va_list args);
|
int (*ioctl_p)(void* ctx, int fd, int cmd, va_list args);
|
||||||
int (*ioctl)(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;
|
} esp_vfs_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -534,3 +534,17 @@ int ioctl(int fd, int cmd, ...)
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue