statx
static void statx_to_hostfs(const struct statx *buf, struct hostfs_stat *p)
struct statx buf;
if ((statx(fd, path, flags, STATX_BASIC_STATS | STATX_BTIME, &buf)) < 0)
unsigned int mask, struct statx __user *buffer);
struct statx __user *buffer);
cp_statx(const struct kstat *stat, struct statx __user *buffer)
struct statx tmp;
unsigned int mask, struct statx __user *buffer)
struct statx __user *buffer)
SYSCALL_DEFINE5(statx,
struct statx __user *, buffer)
struct statx;
unsigned mask, struct statx __user *buffer);
struct statx __user *buffer;
struct statx stx;
ret = statx(AT_FDCWD, *argv, atflag, mask, &stx);
struct statx;
unsigned int mask, struct statx *buffer)
static void dump_statx(struct statx *stx)
int sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
struct statx statx;
ret = __sysret(sys_statx(fd, path, flag | AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx));
buf->st_dev = ((statx.stx_dev_minor & 0xff)
| (statx.stx_dev_major << 8)
| ((statx.stx_dev_minor & ~0xff) << 12));
buf->st_ino = statx.stx_ino;
buf->st_mode = statx.stx_mode;
buf->st_nlink = statx.stx_nlink;
buf->st_uid = statx.stx_uid;
buf->st_gid = statx.stx_gid;
buf->st_rdev = ((statx.stx_rdev_minor & 0xff)
| (statx.stx_rdev_major << 8)
| ((statx.stx_rdev_minor & ~0xff) << 12));
buf->st_size = statx.stx_size;
buf->st_blksize = statx.stx_blksize;
buf->st_blocks = statx.stx_blocks;
buf->st_atim.tv_sec = statx.stx_atime.tv_sec;
buf->st_atim.tv_nsec = statx.stx_atime.tv_nsec;
buf->st_mtim.tv_sec = statx.stx_mtime.tv_sec;
buf->st_mtim.tv_nsec = statx.stx_mtime.tv_nsec;
buf->st_ctim.tv_sec = statx.stx_ctime.tv_sec;
buf->st_ctim.tv_nsec = statx.stx_ctime.tv_nsec;
struct statx stx, mstx;
if (statx(fd, "", AT_EMPTY_PATH | AT_STATX_SYNC_AS_STAT, STATX_INO, &stx))
static long get_file_dev_and_inode(void *addr, struct statx *stx)
ret = statx(AT_FDCWD, path, 0, mask, &sx);
struct statx sx;
ret = statx(AT_FDCWD, "/", 0, 0, &sx);
struct statx sx;
struct statx sx;
ret = statx(AT_FDCWD, path, 0, STATX_MNT_ID_UNIQUE, &sx);
struct statx stx;
ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_subdir, "B", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_subdir, "B/BB", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target1/B", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target1/B/BB", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target2", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target2/A", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA/B", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA/B/BB", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target2/B", 0, 0, &stx), 0);
struct statx stx;
ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0);
struct statx stx;
ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0);
struct statx stx;
ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0);
struct statx stx;
ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_subdir, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_subdir, "", AT_EMPTY_PATH, 0, &stx), 0);
struct statx stx;
ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_subdir, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_subdir, "", AT_EMPTY_PATH, STATX_MNT_ID_UNIQUE, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, STATX_MNT_ID_UNIQUE, &stx), 0);
struct statx stx;
ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(fd_tree_subdir, "BB", 0, 0, &stx), 0);
struct statx stx;
ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx), 0);
ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, 0, &stx), 0);
struct statx stx1, stx2, stx3, stx4;
ASSERT_EQ(statx(-EBADF, "/mnt/A", 0, 0, &stx1), 0);
ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx2), 0);
ASSERT_EQ(statx(-EBADF, "/mnt/A", 0, 0, &stx3), 0);
ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx4), 0);