Patchwork [v5] virtio-9p: fix build on !CONFIG_UTIMENSAT

login
register
mail settings
Submitter Hidetoshi Seto
Date Nov. 24, 2010, 2:38 a.m.
Message ID <4CEC7A92.3080302@jp.fujitsu.com>
Download mbox | patch
Permalink /patch/72787/
State New
Headers show

Comments

Hidetoshi Seto - Nov. 24, 2010, 2:38 a.m.
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(-)
Jes Sorensen - Nov. 24, 2010, 8:01 a.m.
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
Hidetoshi Seto - Dec. 1, 2010, 1:16 a.m.
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
jvrao - Dec. 1, 2010, 6:17 p.m.
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
> 
>

Patch

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