UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fstat-2
+UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fsync-1
+UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fdatasync-1
+
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += fcntl-3
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_FDIO) += ioctl-3
endif
/* Ctl */
+UK_SYSCALL_R_DEFINE(int, fsync, int, fd)
+{
+ int r;
+ union uk_shim_file sf;
+
+ switch (uk_fdtab_shim_get(fd, &sf)) {
+ case UK_SHIM_OFILE:
+ r = uk_sys_fsync(sf.ofile);
+ uk_fdtab_ret(sf.ofile);
+ break;
+#if CONFIG_LIBVFSCORE
+ case UK_SHIM_LEGACY:
+ /* vfscore_fsync returns positive error codes */
+ r = -vfscore_fsync(sf.vfile);
+ fdrop(sf.vfile);
+ break;
+#endif /* CONFIG_LIBVFSCORE */
+ default:
+ r = -EBADF;
+ }
+ return r;
+}
+
+UK_SYSCALL_R_DEFINE(int, fdatasync, int, fd)
+{
+ int r;
+ union uk_shim_file sf;
+
+ switch (uk_fdtab_shim_get(fd, &sf)) {
+ case UK_SHIM_OFILE:
+ r = uk_sys_fdatasync(sf.ofile);
+ uk_fdtab_ret(sf.ofile);
+ break;
+#if CONFIG_LIBVFSCORE
+ case UK_SHIM_LEGACY:
+ /* vfscore has no separate fdatasync; use fsync */
+ /* vfscore_fsync returns positive error codes */
+ r = -vfscore_fsync(sf.vfile);
+ fdrop(sf.vfile);
+ break;
+#endif /* CONFIG_LIBVFSCORE */
+ default:
+ r = -EBADF;
+ }
+ return r;
+}
+
UK_LLSYSCALL_R_DEFINE(int, fcntl, int, fd,
unsigned int, cmd, unsigned long, arg)
{
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += rmdir-1
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += rename-2
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += renameat-4
-UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += fsync-1
-UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += fdatasync-1
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += umask-1
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += lstat-2
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += flock-2
mkdirat
uk_syscall_e_mkdirat
uk_syscall_r_mkdirat
-fsync
-uk_syscall_e_fsync
-uk_syscall_r_fsync
fstat
fstat64
uk_syscall_e_fstat
ioctl
uk_syscall_e_ioctl
uk_syscall_r_ioctl
-fdatasync
-uk_syscall_e_fdatasync
-uk_syscall_r_fdatasync
fdopendir
dirfd
rewinddir
vfscore_writev
vfscore_write
vfscore_lseek
+vfscore_fsync
vfscore_fstat
vfscore_fcntl
vfscore_ioctl
int vfscore_fstat(struct vfscore_file *fp, struct stat *st);
+int vfscore_fsync(struct vfscore_file *fp);
+
int vfscore_fcntl(struct vfscore_file *fp, unsigned int cmd, unsigned long arg);
int vfscore_ioctl(struct vfscore_file *fp, unsigned long request, void *buf);
return bytes;
}
-UK_TRACEPOINT(trace_vfs_fsync, "%d", int);
-UK_TRACEPOINT(trace_vfs_fsync_ret, "");
-UK_TRACEPOINT(trace_vfs_fsync_err, "%d", int);
-
-UK_SYSCALL_R_DEFINE(int, fsync, int, fd)
-{
- struct vfscore_file *fp;
- int error;
-
- trace_vfs_fsync(fd);
- error = fget(fd, &fp);
- if (error)
- goto out_error;
-
- error = sys_fsync(fp);
- fdrop(fp);
-
- if (error)
- goto out_error;
- trace_vfs_fsync_ret();
- return 0;
-
- out_error:
- trace_vfs_fsync_err(error);
- return -error;
-}
-
-UK_SYSCALL_R_DEFINE(int, fdatasync, int, fd)
-{
- // TODO: See if we can do less than fsync().
- return fsync(fd);
-}
-
static int __fxstatat_helper(int ver __unused, int dirfd, const char *pathname,
struct stat *st, int flags);
}
int
-sys_fsync(struct vfscore_file *fp)
+vfscore_fsync(struct vfscore_file *fp)
{
struct vnode *vp;
int error;
int sys_write(struct vfscore_file *fp, const struct iovec *iov, size_t niov,
off_t offset, size_t *count);
-
-/**
- * Synchronizes the in-core data referred by vfscore_file to the backing
- * store device.
- *
- * @param fp
- * Pointer to the vfscore_file structure
- * @return
- * - (0): Completed successfully
- * - (<0): Negative value with error code
- */
-int sys_fsync(struct vfscore_file *fp);
-
/**
* Gets the next directory entry in the directory stream.
*