From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=35488 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PEFrK-0000Cc-NE for qemu-devel@nongnu.org; Fri, 05 Nov 2010 02:33:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PEFrJ-0003qY-C6 for qemu-devel@nongnu.org; Fri, 05 Nov 2010 02:33:10 -0400 Received: from fgwmail7.fujitsu.co.jp ([192.51.44.37]:45003) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PEFrI-0003qK-S5 for qemu-devel@nongnu.org; Fri, 05 Nov 2010 02:33:09 -0400 Received: from m3.gw.fujitsu.co.jp ([10.0.50.73]) by fgwmail7.fujitsu.co.jp (Fujitsu Gateway) with ESMTP id oA56X7de016307 for (envelope-from seto.hidetoshi@jp.fujitsu.com); Fri, 5 Nov 2010 15:33:07 +0900 Received: from smail (m3 [127.0.0.1]) by outgoing.m3.gw.fujitsu.co.jp (Postfix) with ESMTP id 1F47045DE50 for ; Fri, 5 Nov 2010 15:33:07 +0900 (JST) Received: from s3.gw.fujitsu.co.jp (s3.gw.fujitsu.co.jp [10.0.50.93]) by m3.gw.fujitsu.co.jp (Postfix) with ESMTP id CE5D645DE52 for ; Fri, 5 Nov 2010 15:33:06 +0900 (JST) Received: from s3.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s3.gw.fujitsu.co.jp (Postfix) with ESMTP id 22618E08004 for ; Fri, 5 Nov 2010 15:33:06 +0900 (JST) Received: from ml13.s.css.fujitsu.com (ml13.s.css.fujitsu.com [10.249.87.103]) by s3.gw.fujitsu.co.jp (Postfix) with ESMTP id 78D831DB8045 for ; Fri, 5 Nov 2010 15:33:05 +0900 (JST) Message-ID: <4CD3A513.2010102@jp.fujitsu.com> Date: Fri, 05 Nov 2010 15:32:51 +0900 From: Hidetoshi Seto MIME-Version: 1.0 References: <4CB56715.7080605@jp.fujitsu.com> <4CB64FF6.5080906@jp.fujitsu.com> <20101104170303.GE15211@sequoia.sous-sol.org> In-Reply-To: <20101104170303.GE15211@sequoia.sous-sol.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] virtio-9p: fix build on !CONFIG_UTIMENSAT v2 List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Chris Wright Cc: Blue Swirl , "Hao, Xudong" , "qemu-devel@nongnu.org" , "kvm@vger.kernel.org" , Avi Kivity This patch introduce a fallback mechanism for old systems that do not support utimensat. This will 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) Signed-off-by: Hidetoshi Seto --- hw/virtio-9p-local.c | 32 ++++++++++++++++++++++++++++++-- hw/virtio-9p.h | 10 ++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/hw/virtio-9p-local.c b/hw/virtio-9p-local.c index 0d52020..7811d2c 100644 --- a/hw/virtio-9p-local.c +++ b/hw/virtio-9p-local.c @@ -479,10 +479,38 @@ static int local_chown(FsContext *fs_ctx, const char *path, FsCred *credp) return -1; } +/* TODO: relocate this to proper file, and make it more generic */ +static 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(). + * See commit 74bc02b2d2272dc88fb98d43e631eb154717f517 for known problem. + */ + struct timeval tv[2]; + int i; + + for (i = 0; i < 2; i++) { + if (times[i].tv_nsec == UTIME_OMIT || times[i].tv_nsec == UTIME_NOW) { + tv[i].tv_sec = 0; + 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 +} + 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/hw/virtio-9p.h b/hw/virtio-9p.h index 6c23319..d448d8a 100644 --- a/hw/virtio-9p.h +++ b/hw/virtio-9p.h @@ -8,6 +8,16 @@ #include "file-op-9p.h" +/* TODO: relocate this to proper file */ +#ifndef CONFIG_UTIMENSAT +#ifndef UTIME_NOW +# define UTIME_NOW ((1l << 30) - 1l) +#endif +#ifndef UTIME_OMIT +# define UTIME_OMIT ((1l << 30) - 2l) +#endif +#endif + /* The feature bitmap for virtio 9P */ /* The mount point is specified in a config variable */ #define VIRTIO_9P_MOUNT_TAG 0 -- 1.7.3.1