From: Waldemar Kozaczuk <jwkozac...@gmail.com> Committer: Nadav Har'El <n...@scylladb.com> Branch: master
syscalls: expose statx Nadav Har'EL added basic implementation of statx at vfs layer. This patch exposes it as a syscall. Signed-off-by: Waldemar Kozaczuk <jwkozac...@gmail.com> Closes #1250 --- diff --git a/fs/vfs/main.cc b/fs/vfs/main.cc --- a/fs/vfs/main.cc +++ b/fs/vfs/main.cc @@ -37,6 +37,7 @@ #include <sys/param.h> #include <sys/statvfs.h> #include <sys/stat.h> +#include <sys/statx.h> #include <sys/time.h> #include <sys/sendfile.h> @@ -1322,42 +1323,6 @@ int stat(const char *pathname, struct stat *st) return __xstat(1, pathname, st); } -// Our <sys/stat.h> (from Musl) doesn't yet declare statx(), struct statx, -// or the various STATX_* constants. So we need to do it here for now. -// Eventually, when we update Musl or modify it manually to include these -// definitions, they should be removed from here: -struct statx_timestamp -{ - int64_t tv_sec; - uint32_t tv_nsec; - int32_t statx_timestamp_pad1[1]; -}; -struct statx { - uint32_t stx_mask; - uint32_t stx_blksize; - uint64_t stx_attributes; - uint32_t stx_nlink; - uint32_t stx_uid; - uint32_t stx_gid; - uint16_t stx_mode; - uint16_t __statx_pad1[1]; - uint64_t stx_ino; - uint64_t stx_size; - uint64_t stx_blocks; - uint64_t stx_attributes_mask; - struct statx_timestamp stx_atime; - struct statx_timestamp stx_btime; - struct statx_timestamp stx_ctime; - struct statx_timestamp stx_mtime; - uint32_t stx_rdev_major; - uint32_t stx_rdev_minor; - uint32_t stx_dev_major; - uint32_t stx_dev_minor; - uint64_t __statx_pad2[14]; -}; -extern "C" int statx(int dirfd, const char* pathname, int flags, unsigned int mask, struct statx *buf); -#define STATX_BASIC_STATS 0x000007ffU - OSV_LIBC_API int statx(int dirfd, const char* pathname, int flags, unsigned int mask, struct statx *buf) diff --git a/include/api/sys/statx.h b/include/api/sys/statx.h --- a/include/api/sys/statx.h +++ b/include/api/sys/statx.h @@ -0,0 +1,45 @@ +#ifndef _SYS_STATX_H +#define _SYS_STATX_H +#ifdef __cplusplus +extern "C" { +#endif + +#define STATX_BASIC_STATS 0x000007ffU + +struct statx_timestamp +{ + int64_t tv_sec; + uint32_t tv_nsec; + int32_t statx_timestamp_pad1[1]; +}; + +struct statx { + uint32_t stx_mask; + uint32_t stx_blksize; + uint64_t stx_attributes; + uint32_t stx_nlink; + uint32_t stx_uid; + uint32_t stx_gid; + uint16_t stx_mode; + uint16_t __statx_pad1[1]; + uint64_t stx_ino; + uint64_t stx_size; + uint64_t stx_blocks; + uint64_t stx_attributes_mask; + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + uint32_t stx_rdev_major; + uint32_t stx_rdev_minor; + uint32_t stx_dev_major; + uint32_t stx_dev_minor; + uint64_t __statx_pad2[14]; +}; + +extern "C" int statx(int dirfd, const char* pathname, int flags, unsigned int mask, struct statx *buf); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/api/x64/bits/syscall.h b/include/api/x64/bits/syscall.h --- a/include/api/x64/bits/syscall.h +++ b/include/api/x64/bits/syscall.h @@ -313,6 +313,7 @@ #define __NR_kcmp 312 #define __NR_finit_module 313 #define __NR_getrandom 318 +#define __NR_statx 332 #undef __NR_fstatat #undef __NR_pread @@ -642,6 +643,7 @@ #define SYS_process_vm_writev 311 #define SYS_kcmp 312 #define SYS_finit_module 313 +#define SYS_statx 332 #undef SYS_fstatat #undef SYS_pread diff --git a/linux.cc b/linux.cc --- a/linux.cc +++ b/linux.cc @@ -33,6 +33,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <sys/stat.h> +#include <sys/statx.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/file.h> @@ -565,6 +566,7 @@ OSV_LIBC_API long syscall(long number, ...) SYSCALL4(renameat, int, const char *, int, const char *); SYSCALL1(sys_brk, void *); SYSCALL4(clock_nanosleep, clockid_t, int, const struct timespec *, struct timespec *); + SYSCALL5(statx, int, const char *, int, unsigned int, struct statx *); } debug_always("syscall(): unimplemented system call %d\n", number); -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to osv-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/000000000000872a8a06031d0ffd%40google.com.