From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=49866 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PKBk8-00070M-Ew for qemu-devel@nongnu.org; Sun, 21 Nov 2010 10:22:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PKBk7-0004rp-7I for qemu-devel@nongnu.org; Sun, 21 Nov 2010 10:22:16 -0500 Received: from mail-yx0-f173.google.com ([209.85.213.173]:62893) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PKBk6-0004rj-UB for qemu-devel@nongnu.org; Sun, 21 Nov 2010 10:22:15 -0500 Received: by yxs7 with SMTP id 7so770242yxs.4 for ; Sun, 21 Nov 2010 07:22:14 -0800 (PST) Message-ID: <4CE93923.4050303@codemonkey.ws> Date: Sun, 21 Nov 2010 09:22:11 -0600 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH v3] virtio-9p: fix build on !CONFIG_UTIMENSAT References: <4CB56715.7080605@jp.fujitsu.com> <4CB64FF6.5080906@jp.fujitsu.com> <20101104170303.GE15211@sequoia.sous-sol.org> <4CD3A513.2010102@jp.fujitsu.com> <20101114055822.GE25164@sequoia.sous-sol.org> <4CE0969D.5070703@jp.fujitsu.com> <4CE097C4.3070700@jp.fujitsu.com> In-Reply-To: <4CE097C4.3070700@jp.fujitsu.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Hidetoshi Seto Cc: Chris Wright , "kvm@vger.kernel.org" , Jes.Sorensen@redhat.com, "Hao, Xudong" , "qemu-devel@nongnu.org" , Blue Swirl , mohan@in.ibm.com, Avi Kivity 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); >