|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 1/3] lib/vfscore: Enable timestamp and time access functions
Reviewed-by: Stefan Teodorescu <stefanl.teodorescu@xxxxxxxxx>
On Tue, Nov 26, 2019 at 7:18 PM Costin Lupu <costin.lupu@xxxxxxxxx> wrote:
>
> These functions were here before, they were just waiting to get
> resurrected. These functions are: futimesat(), utimensat(), futimens(),
> utimes() and lutimes(). We also brought back futimes() and the tracepoints
> from OsV.
>
> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
> ---
> lib/vfscore/exportsyms.uk | 6 +++
> lib/vfscore/main.c | 15 +++++-
> lib/vfscore/syscalls.c | 109 ++++++++++++++++++++------------------
> 3 files changed, 76 insertions(+), 54 deletions(-)
>
> diff --git a/lib/vfscore/exportsyms.uk b/lib/vfscore/exportsyms.uk
> index 70392721..b2957cc6 100644
> --- a/lib/vfscore/exportsyms.uk
> +++ b/lib/vfscore/exportsyms.uk
> @@ -110,3 +110,9 @@ vn_stat
> vn_unlock
> vfs_busy
> pipe
> +futimes
> +futimesat
> +utimensat
> +futimens
> +utimes
> +lutimes
> diff --git a/lib/vfscore/main.c b/lib/vfscore/main.c
> index c4740304..4e99911f 100644
> --- a/lib/vfscore/main.c
> +++ b/lib/vfscore/main.c
> @@ -1754,7 +1754,15 @@ int fallocate(int fd, int mode, loff_t offset, loff_t
> len)
>
> LFS64(fallocate);
>
> -#if 0
> +UK_TRACEPOINT(trace_vfs_utimes, "\"%s\"", const char*);
> +UK_TRACEPOINT(trace_vfs_utimes_ret, "");
> +UK_TRACEPOINT(trace_vfs_utimes_err, "%d", int);
> +
> +int futimes(int fd, const struct timeval times[2])
> +{
> + return futimesat(fd, NULL, times);
> +}
> +
> int futimesat(int dirfd, const char *pathname, const struct timeval times[2])
> {
> struct stat st;
> @@ -1814,9 +1822,11 @@ UK_TRACEPOINT(trace_vfs_utimensat_err, "%d", int);
>
> int utimensat(int dirfd, const char *pathname, const struct timespec
> times[2], int flags)
> {
> + int error;
> +
> trace_vfs_utimensat(pathname);
>
> - auto error = sys_utimensat(dirfd, pathname, times, flags);
> + error = sys_utimensat(dirfd, pathname, times, flags);
>
> if (error) {
> trace_vfs_utimensat_err(error);
> @@ -1881,6 +1891,7 @@ int lutimes(const char *pathname, const struct timeval
> times[2])
> return do_utimes(pathname, times, AT_SYMLINK_NOFOLLOW);
> }
>
> +#if 0
> int utime(const char *pathname, const struct utimbuf *t)
> {
> using namespace std::chrono;
> diff --git a/lib/vfscore/syscalls.c b/lib/vfscore/syscalls.c
> index d375774a..11813dbb 100644
> --- a/lib/vfscore/syscalls.c
> +++ b/lib/vfscore/syscalls.c
> @@ -1257,7 +1257,6 @@ sys_readlink(char *path, char *buf, size_t bufsize,
> ssize_t *size)
> return (0);
> }
>
> -#if 0
> /*
> * Check the validity of the members of a struct timeval.
> */
> @@ -1270,13 +1269,13 @@ static int is_timeval_valid(const struct timeval
> *time)
> /*
> * Convert a timeval struct to a timespec one.
> */
> -static void convert_timeval(struct timespec &to, const struct timeval *from)
> +static void convert_timeval(struct timespec *to, const struct timeval *from)
> {
> if (from) {
> - to.tv_sec = from->tv_sec;
> - to.tv_nsec = from->tv_usec * 1000; // Convert microseconds to
> nanoseconds
> + to->tv_sec = from->tv_sec;
> + to->tv_nsec = from->tv_usec * 1000; // Convert microseconds
> to nanoseconds
> } else {
> - clock_gettime(CLOCK_REALTIME, &to);
> + clock_gettime(CLOCK_REALTIME, to);
> }
> }
>
> @@ -1293,8 +1292,8 @@ sys_utimes(char *path, const struct timeval times[2],
> int flags)
> return EINVAL;
>
> // Convert each element of timeval array to the timespec type
> - convert_timeval(timespec_times[0], times ? times + 0 : NULL);
> - convert_timeval(timespec_times[1], times ? times + 1 : NULL);
> + convert_timeval(×pec_times[0], times ? times + 0 : NULL);
> + convert_timeval(×pec_times[1], times ? times + 1 : NULL);
>
> if (flags & AT_SYMLINK_NOFOLLOW) {
> struct dentry *ddp;
> @@ -1329,21 +1328,21 @@ sys_utimes(char *path, const struct timeval times[2],
> int flags)
> /*
> * Check the validity of members of a struct timespec
> */
> -static int is_timespec_valid(const struct timespec &time)
> +static int is_timespec_valid(const struct timespec *time)
> {
> - return (time.tv_sec >= 0) &&
> - ((time.tv_nsec >= 0 && time.tv_nsec <= 999999999) ||
> - time.tv_nsec == UTIME_NOW ||
> - time.tv_nsec == UTIME_OMIT);
> + return (time->tv_sec >= 0) &&
> + ((time->tv_nsec >= 0 && time->tv_nsec <= 999999999) ||
> + time->tv_nsec == UTIME_NOW ||
> + time->tv_nsec == UTIME_OMIT);
> }
>
> -void init_timespec(struct timespec &_times, const struct timespec *times)
> +void init_timespec(struct timespec *_times, const struct timespec *times)
> {
> if (times == NULL || times->tv_nsec == UTIME_NOW) {
> - clock_gettime(CLOCK_REALTIME, &_times);
> + clock_gettime(CLOCK_REALTIME, _times);
> } else {
> - _times.tv_sec = times->tv_sec;
> - _times.tv_nsec = times->tv_nsec;
> + _times->tv_sec = times->tv_sec;
> + _times->tv_nsec = times->tv_nsec;
> }
> return;
> }
> @@ -1352,7 +1351,7 @@ int
> sys_utimensat(int dirfd, const char *pathname, const struct timespec
> times[2], int flags)
> {
> int error;
> - std::string ap;
> + char *ap;
> struct timespec timespec_times[2];
> extern struct task *main_task;
> struct dentry *dp;
> @@ -1364,44 +1363,51 @@ sys_utimensat(int dirfd, const char *pathname, const
> struct timespec times[2], i
> if (flags && !(flags & AT_SYMLINK_NOFOLLOW))
> return EINVAL;
>
> - if (times && (!is_timespec_valid(times[0]) ||
> !is_timespec_valid(times[1])))
> + if (times && (!is_timespec_valid(×[0]) ||
> !is_timespec_valid(×[1])))
> return EINVAL;
>
> - init_timespec(timespec_times[0], times ? times + 0 : NULL);
> - init_timespec(timespec_times[1], times ? times + 1 : NULL);
> + init_timespec(×pec_times[0], times ? times + 0 : NULL);
> + init_timespec(×pec_times[1], times ? times + 1 : NULL);
>
> if (pathname && pathname[0] == '/') {
> - ap = pathname;
> + ap = strdup(pathname);
> + if (!ap)
> + return ENOMEM;
> +
> } else if (dirfd == AT_FDCWD) {
> - if (!pathname)
> - return EFAULT;
> - ap = std::string(main_task->t_cwd) + "/" + pathname;
> + if (!pathname)
> + return EFAULT;
> + error = asprintf(&ap, "%s/%s", main_task->t_cwd, pathname);
> + if (error || !ap)
> + return ENOMEM;
> +
> } else {
> struct vfscore_file *fp;
> - fileref f(fileref_from_fd(dirfd));
>
> - if (!f)
> - return EBADF;
> + fp = vfscore_get_file(dirfd);
> + if (!fp)
> + return EBADF;
>
> - fp = f.get();
> + if (!fp->f_dentry)
> + return EBADF;
>
> - if(!fp->f_dentry)
> - return EBADF;
> + if (!(fp->f_dentry->d_vnode->v_type & VDIR))
> + return ENOTDIR;
>
> - if (!(fp->f_dentry->d_vnode->v_type & VDIR))
> - return ENOTDIR;
> -
> - if (pathname)
> - ap = std::string(fp->f_dentry->d_path) + "/" + pathname;
> - else
> - ap = fp->f_dentry->d_path;
> -
> - ap = std::string(fp->f_dentry->d_mount->m_path) + "/" + ap;
> + if (pathname)
> + error = asprintf(&ap, "%s/%s/%s",
> fp->f_dentry->d_mount->m_path,
> + fp->f_dentry->d_path, pathname);
> + else
> + error = asprintf(&ap, "%s/%s",
> fp->f_dentry->d_mount->m_path,
> + fp->f_dentry->d_path);
> + if (error || !ap)
> + return ENOMEM;
> }
>
> /* FIXME: Add support for AT_SYMLINK_NOFOLLOW */
>
> - error = namei(ap.c_str(), &dp);
> + error = namei(ap, &dp);
> + free(ap);
>
> if (error)
> return error;
> @@ -1412,11 +1418,11 @@ sys_utimensat(int dirfd, const char *pathname, const
> struct timespec times[2], i
> if (vn_access(dp->d_vnode, VWRITE)) {
> return EACCES;
> }
> - if (times &&
> - (times[0].tv_nsec != UTIME_NOW || times[1].tv_nsec
> != UTIME_NOW) &&
> - (times[0].tv_nsec != UTIME_OMIT ||
> times[1].tv_nsec != UTIME_OMIT) &&
> - (!(dp->d_vnode->v_mode & ~VAPPEND)))
> - return EPERM;
> + if (times &&
> + (times[0].tv_nsec != UTIME_NOW || times[1].tv_nsec !=
> UTIME_NOW) &&
> + (times[0].tv_nsec != UTIME_OMIT || times[1].tv_nsec
> != UTIME_OMIT) &&
> + (!(dp->d_vnode->v_mode & ~VAPPEND)))
> + return EPERM;
> error = vn_settimes(dp->d_vnode, timespec_times);
> }
>
> @@ -1427,22 +1433,21 @@ sys_utimensat(int dirfd, const char *pathname, const
> struct timespec times[2], i
> int
> sys_futimens(int fd, const struct timespec times[2])
> {
> + int error;
> struct vfscore_file *fp;
> + char *pathname;
>
> - fileref f(fileref_from_fd(fd));
> - if (!f)
> + fp = vfscore_get_file(fd);
> + if (!fp)
> return EBADF;
>
> - fp = f.get();
> -
> if (!fp->f_dentry)
> return EBADF;
>
> - std::string pathname = fp->f_dentry->d_path;
> - auto error = sys_utimensat(AT_FDCWD, pathname.c_str(), times, 0);
> + pathname = fp->f_dentry->d_path;
> + error = sys_utimensat(AT_FDCWD, pathname, times, 0);
> return error;
> }
> -#endif
>
> int
> sys_fallocate(struct vfscore_file *fp, int mode, off_t offset, off_t len)
> --
> 2.20.1
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |