Re: [Qemu-devel] [PATCH v3] virtio-9p: fix build on !CONFIG_UTIMENSAT
On 11/21/10 16:22, Anthony Liguori wrote: > On 11/14/2010 08:15 PM, 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) >> >> v3: >>- Use better alternative handling for UTIME_NOW/OMIT >>- Move qemu_utimensat() to cutils.c >> V2: >>- Introduce qemu_utimensat() >> >> Signed-off-by: Hidetoshi Seto >> > > Applied. Thanks. > > Regards, > > Anthony Liguori Anthony, Did you actually apply this one? I don't see it in the git tree. However if you did, that was a mistake, the qemu_utimensat() should not have gone into cutils.c as I pointed out earlier, it is inconsistent. Cheers, Jes
Re: [Qemu-devel] [PATCH v3] virtio-9p: fix build on !CONFIG_UTIMENSAT
On 11/14/2010 08:15 PM, 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) v3: - Use better alternative handling for UTIME_NOW/OMIT - Move qemu_utimensat() to cutils.c V2: - Introduce qemu_utimensat() Signed-off-by: Hidetoshi Seto Applied. Thanks. Regards, Anthony Liguori --- cutils.c | 43 +++ hw/virtio-9p-local.c |4 ++-- qemu-common.h| 10 ++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/cutils.c b/cutils.c index 536ee93..3c18941 100644 --- a/cutils.c +++ b/cutils.c @@ -288,3 +288,46 @@ int fcntl_setfl(int fd, int flag) } #endif +int qemu_utimensat(int dirfd, const char *path, const struct timespec *times, + int flags) +{ +#ifdef CONFIG_UTIMENSAT +return utimensat(dirfd, path, times, flags); +#else +/* Fallback: use utimes() instead of utimensat() */ +struct timeval tv[2], tv_now; +struct stat st; +int i; + +/* 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 = 0; +} 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]); +#endif +} 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/qemu-common.h b/qemu-common.h index 2fbc27f..7fe4c16 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -146,6 +146,16 @@ time_t mktimegm(struct tm *tm); int qemu_fls(int i); int qemu_fdatasync(int fd); int fcntl_setfl(int fd, int flag); +#ifndef CONFIG_UTIMENSAT +#ifndef UTIME_NOW +# define UTIME_NOW ((1l<< 30) - 1l) +#endif +#ifndef UTIME_OMIT +# define UTIME_OMIT((1l<< 30) - 2l) +#endif +#endif +int qemu_utimensat(int dirfd, const char *path, const struct timespec *times, +int flags); /* path.c */ void init_paths(const char *prefix);
[Qemu-devel] [PATCH v3] virtio-9p: fix build on !CONFIG_UTIMENSAT
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) v3: - Use better alternative handling for UTIME_NOW/OMIT - Move qemu_utimensat() to cutils.c V2: - Introduce qemu_utimensat() Signed-off-by: Hidetoshi Seto --- cutils.c | 43 +++ hw/virtio-9p-local.c |4 ++-- qemu-common.h| 10 ++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/cutils.c b/cutils.c index 536ee93..3c18941 100644 --- a/cutils.c +++ b/cutils.c @@ -288,3 +288,46 @@ int fcntl_setfl(int fd, int flag) } #endif +int qemu_utimensat(int dirfd, const char *path, const struct timespec *times, + int flags) +{ +#ifdef CONFIG_UTIMENSAT +return utimensat(dirfd, path, times, flags); +#else +/* Fallback: use utimes() instead of utimensat() */ +struct timeval tv[2], tv_now; +struct stat st; +int i; + +/* 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 = 0; +} 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]); +#endif +} 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/qemu-common.h b/qemu-common.h index 2fbc27f..7fe4c16 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -146,6 +146,16 @@ time_t mktimegm(struct tm *tm); int qemu_fls(int i); int qemu_fdatasync(int fd); int fcntl_setfl(int fd, int flag); +#ifndef CONFIG_UTIMENSAT +#ifndef UTIME_NOW +# define UTIME_NOW ((1l << 30) - 1l) +#endif +#ifndef UTIME_OMIT +# define UTIME_OMIT((1l << 30) - 2l) +#endif +#endif +int qemu_utimensat(int dirfd, const char *path, const struct timespec *times, +int flags); /* path.c */ void init_paths(const char *prefix); -- 1.7.3.1