Message ID | 4CE097C4.3070700@jp.fujitsu.com |
---|---|
State | New |
Headers | show |
* Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com) 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 <seto.hidetoshi@jp.fujitsu.com> Looks good to me (no strong opinion on the cutils vs oslib-posix that Jes mentioned). Acked-by: Chris Wright <chrisw@sous-sol.org>
> 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 <seto.hidetoshi@jp.fujitsu.com> Looks good to me. Acked-by: M. Mohan Kumar <mohan@in.ibm.com>
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<seto.hidetoshi@jp.fujitsu.com> > 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); >
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<seto.hidetoshi@jp.fujitsu.com> >> > > 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
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);
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 <seto.hidetoshi@jp.fujitsu.com> --- cutils.c | 43 +++++++++++++++++++++++++++++++++++++++++++ hw/virtio-9p-local.c | 4 ++-- qemu-common.h | 10 ++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-)