Message ID | 4CEC7A92.3080302@jp.fujitsu.com |
---|---|
State | New |
Headers | show |
On 11/24/10 03:38, Hidetoshi Seto wrote: > This patch introduce a fallback mechanism for old systems that do not > support utimensat(). This fix build failure with following warnings: > > hw/virtio-9p-local.c: In function 'local_utimensat': > hw/virtio-9p-local.c:479: warning: implicit declaration of function 'utimensat' > hw/virtio-9p-local.c:479: warning: nested extern declaration of 'utimensat' > > and: > > hw/virtio-9p.c: In function 'v9fs_setattr_post_chmod': > hw/virtio-9p.c:1410: error: 'UTIME_NOW' undeclared (first use in this function) > hw/virtio-9p.c:1410: error: (Each undeclared identifier is reported only once > hw/virtio-9p.c:1410: error: for each function it appears in.) > hw/virtio-9p.c:1413: error: 'UTIME_OMIT' undeclared (first use in this function) > hw/virtio-9p.c: In function 'v9fs_wstat_post_chmod': > hw/virtio-9p.c:2905: error: 'UTIME_OMIT' undeclared (first use in this function) > > [NOTE: At this time virtio-9p is only user of utimensat(), and is available > only when host is linux and CONFIG_VIRTFS is defined. So there are > no similar warning for win32. Please provide a wrapper for win32 in > oslib-win32.c if new user really requires it.] > > v5: > - Allow fallback on runtime > - Move qemu_utimensat() to oslib-posix.c > - Rebased on latest qemu.git > v4: > - Use tv_now.tv_usec > v3: > - Use better alternative handling for UTIME_NOW/OMIT > - Move qemu_utimensat() to cutils.c > V2: > - Introduce qemu_utimensat() > > Acked-by: Chris Wright <chrisw@sous-sol.org> > Acked-by: M. Mohan Kumar <mohan@in.ibm.com> > Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> > --- > hw/virtio-9p-local.c | 4 ++-- > oslib-posix.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ > qemu-os-posix.h | 12 ++++++++++++ > 3 files changed, 62 insertions(+), 2 deletions(-) Hi Hidetoshi, This looks good to me! Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com> Cheers, Jes
Ping. Maintainers, please tell me if still something is required for this patch before applying it. Thanks, H.Seto (2010/11/24 17:01), Jes Sorensen wrote: > On 11/24/10 03:38, Hidetoshi Seto wrote: >> This patch introduce a fallback mechanism for old systems that do not >> support utimensat(). This fix build failure with following warnings: >> >> hw/virtio-9p-local.c: In function 'local_utimensat': >> hw/virtio-9p-local.c:479: warning: implicit declaration of function 'utimensat' >> hw/virtio-9p-local.c:479: warning: nested extern declaration of 'utimensat' >> >> and: >> >> hw/virtio-9p.c: In function 'v9fs_setattr_post_chmod': >> hw/virtio-9p.c:1410: error: 'UTIME_NOW' undeclared (first use in this function) >> hw/virtio-9p.c:1410: error: (Each undeclared identifier is reported only once >> hw/virtio-9p.c:1410: error: for each function it appears in.) >> hw/virtio-9p.c:1413: error: 'UTIME_OMIT' undeclared (first use in this function) >> hw/virtio-9p.c: In function 'v9fs_wstat_post_chmod': >> hw/virtio-9p.c:2905: error: 'UTIME_OMIT' undeclared (first use in this function) >> >> [NOTE: At this time virtio-9p is only user of utimensat(), and is available >> only when host is linux and CONFIG_VIRTFS is defined. So there are >> no similar warning for win32. Please provide a wrapper for win32 in >> oslib-win32.c if new user really requires it.] >> >> v5: >> - Allow fallback on runtime >> - Move qemu_utimensat() to oslib-posix.c >> - Rebased on latest qemu.git >> v4: >> - Use tv_now.tv_usec >> v3: >> - Use better alternative handling for UTIME_NOW/OMIT >> - Move qemu_utimensat() to cutils.c >> V2: >> - Introduce qemu_utimensat() >> >> Acked-by: Chris Wright <chrisw@sous-sol.org> >> Acked-by: M. Mohan Kumar <mohan@in.ibm.com> >> Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> >> --- >> hw/virtio-9p-local.c | 4 ++-- >> oslib-posix.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ >> qemu-os-posix.h | 12 ++++++++++++ >> 3 files changed, 62 insertions(+), 2 deletions(-) > > Hi Hidetoshi, > > This looks good to me! > > Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com> > > Cheers, > Jes
On 11/30/2010 5:16 PM, Hidetoshi Seto wrote: > Ping. > > Maintainers, please tell me if still something is required for > this patch before applying it. With Jes's Ack it should be good to go. I will included it in my next pull request to Anthony..and during that time if I see any issues I will let you know. Thanks for working on it. JV. > > > Thanks, > H.Seto > > (2010/11/24 17:01), Jes Sorensen wrote: >> On 11/24/10 03:38, Hidetoshi Seto wrote: >>> This patch introduce a fallback mechanism for old systems that do not >>> support utimensat(). This fix build failure with following warnings: >>> >>> hw/virtio-9p-local.c: In function 'local_utimensat': >>> hw/virtio-9p-local.c:479: warning: implicit declaration of function 'utimensat' >>> hw/virtio-9p-local.c:479: warning: nested extern declaration of 'utimensat' >>> >>> and: >>> >>> hw/virtio-9p.c: In function 'v9fs_setattr_post_chmod': >>> hw/virtio-9p.c:1410: error: 'UTIME_NOW' undeclared (first use in this function) >>> hw/virtio-9p.c:1410: error: (Each undeclared identifier is reported only once >>> hw/virtio-9p.c:1410: error: for each function it appears in.) >>> hw/virtio-9p.c:1413: error: 'UTIME_OMIT' undeclared (first use in this function) >>> hw/virtio-9p.c: In function 'v9fs_wstat_post_chmod': >>> hw/virtio-9p.c:2905: error: 'UTIME_OMIT' undeclared (first use in this function) >>> >>> [NOTE: At this time virtio-9p is only user of utimensat(), and is available >>> only when host is linux and CONFIG_VIRTFS is defined. So there are >>> no similar warning for win32. Please provide a wrapper for win32 in >>> oslib-win32.c if new user really requires it.] >>> >>> v5: >>> - Allow fallback on runtime >>> - Move qemu_utimensat() to oslib-posix.c >>> - Rebased on latest qemu.git >>> v4: >>> - Use tv_now.tv_usec >>> v3: >>> - Use better alternative handling for UTIME_NOW/OMIT >>> - Move qemu_utimensat() to cutils.c >>> V2: >>> - Introduce qemu_utimensat() >>> >>> Acked-by: Chris Wright <chrisw@sous-sol.org> >>> Acked-by: M. Mohan Kumar <mohan@in.ibm.com> >>> Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> >>> --- >>> hw/virtio-9p-local.c | 4 ++-- >>> oslib-posix.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ >>> qemu-os-posix.h | 12 ++++++++++++ >>> 3 files changed, 62 insertions(+), 2 deletions(-) >> >> Hi Hidetoshi, >> >> This looks good to me! >> >> Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com> >> >> Cheers, >> Jes > >
diff --git a/hw/virtio-9p-local.c b/hw/virtio-9p-local.c index 0d52020..41603ea 100644 --- a/hw/virtio-9p-local.c +++ b/hw/virtio-9p-local.c @@ -480,9 +480,9 @@ static int local_chown(FsContext *fs_ctx, const char *path, FsCred *credp) } static int local_utimensat(FsContext *s, const char *path, - const struct timespec *buf) + const struct timespec *buf) { - return utimensat(AT_FDCWD, rpath(s, path), buf, AT_SYMLINK_NOFOLLOW); + return qemu_utimensat(AT_FDCWD, rpath(s, path), buf, AT_SYMLINK_NOFOLLOW); } static int local_remove(FsContext *ctx, const char *path) diff --git a/oslib-posix.c b/oslib-posix.c index 727dee1..edd4ddf 100644 --- a/oslib-posix.c +++ b/oslib-posix.c @@ -111,3 +111,51 @@ int qemu_pipe(int pipefd[2]) return ret; } + +int qemu_utimensat(int dirfd, const char *path, const struct timespec *times, + int flags) +{ + struct timeval tv[2], tv_now; + struct stat st; + int i; +#ifdef CONFIG_UTIMENSAT + int ret; + + ret = utimensat(dirfd, path, times, flags); + if (ret != -1 || errno != ENOSYS) { + return ret; + } +#endif + /* Fallback: use utimes() instead of utimensat() */ + + /* happy if special cases */ + if (times[0].tv_nsec == UTIME_OMIT && times[1].tv_nsec == UTIME_OMIT) { + return 0; + } + if (times[0].tv_nsec == UTIME_NOW && times[1].tv_nsec == UTIME_NOW) { + return utimes(path, NULL); + } + + /* prepare for hard cases */ + if (times[0].tv_nsec == UTIME_NOW || times[1].tv_nsec == UTIME_NOW) { + gettimeofday(&tv_now, NULL); + } + if (times[0].tv_nsec == UTIME_OMIT || times[1].tv_nsec == UTIME_OMIT) { + stat(path, &st); + } + + for (i = 0; i < 2; i++) { + if (times[i].tv_nsec == UTIME_NOW) { + tv[i].tv_sec = tv_now.tv_sec; + tv[i].tv_usec = tv_now.tv_usec; + } else if (times[i].tv_nsec == UTIME_OMIT) { + tv[i].tv_sec = (i == 0) ? st.st_atime : st.st_mtime; + tv[i].tv_usec = 0; + } else { + tv[i].tv_sec = times[i].tv_sec; + tv[i].tv_usec = times[i].tv_nsec / 1000; + } + } + + return utimes(path, &tv[0]); +} diff --git a/qemu-os-posix.h b/qemu-os-posix.h index 353f878..81fd9ab 100644 --- a/qemu-os-posix.h +++ b/qemu-os-posix.h @@ -39,4 +39,16 @@ void os_setup_post(void); typedef struct timeval qemu_timeval; #define qemu_gettimeofday(tp) gettimeofday(tp, NULL) +#ifndef CONFIG_UTIMENSAT +#ifndef UTIME_NOW +# define UTIME_NOW ((1l << 30) - 1l) +#endif +#ifndef UTIME_OMIT +# define UTIME_OMIT ((1l << 30) - 2l) +#endif +#endif +typedef struct timespec qemu_timespec; +int qemu_utimensat(int dirfd, const char *path, const qemu_timespec *times, + int flags); + #endif