qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Fix getdents* syscalls


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH] Fix getdents* syscalls
Date: Mon, 13 Oct 2008 14:48:25 +0200
User-agent: Mutt/1.5.13 (2006-08-11)

Are you usingi cron to send those patches?

More seriously this is the third time you send the patch series in two
weeks. We do *not* have any *explanations*, so we don't know if it is a
new version or only a resend. I have some of your patches in my local
tree and I don't feel checking once more if the patches are the same or
not. Too bad if we miss some important changes.

I agree we are not merging patch very fast, but please be patient. 
Resending patches too often and without giving any details only annoys
people and won't help to get your patches applied earlier.

Ping (for a big series) or resend (with the appropriate tag in the
subject) are welcome if we forget a patch. But please be patient.


On Mon, Oct 13, 2008 at 01:10:29PM +0300, Kirill A. Shutemov wrote:
> glibc's structs dirent and dirent64 is different from in-kernel dirent
> and dirent64. Kernel headers doesn't provide structs dirent(64) any
> more. So we should add it to qemu headers.
> 
> To avoid conflict with glibc it called struct linux_dirent(64).
> 
> Signed-off-by: Kirill A. Shutemov <address@hidden>
> ---
>  linux-user/syscall.c      |   27 +++++++++++++--------------
>  linux-user/syscall_defs.h |   15 +++++++++++++++
>  2 files changed, 28 insertions(+), 14 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index dc7e561..40e985a 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -28,7 +28,6 @@
>  #include <fcntl.h>
>  #include <time.h>
>  #include <limits.h>
> -#include <dirent.h>
>  #include <sys/types.h>
>  #include <sys/ipc.h>
>  #include <sys/msg.h>
> @@ -94,8 +93,8 @@
>  #endif
>  
>  //#include <linux/msdos_fs.h>
> -#define      VFAT_IOCTL_READDIR_BOTH         _IOR('r', 1, struct dirent [2])
> -#define      VFAT_IOCTL_READDIR_SHORT        _IOR('r', 2, struct dirent [2])
> +#define      VFAT_IOCTL_READDIR_BOTH         _IOR('r', 1, struct 
> linux_dirent [2])
> +#define      VFAT_IOCTL_READDIR_SHORT        _IOR('r', 2, struct 
> linux_dirent [2])
>  
>  
>  #undef _syscall0
> @@ -216,10 +215,10 @@ _syscall3(int,sys_futimesat,int,dirfd,const char 
> *,pathname,
>  #endif
>  _syscall2(int,sys_getcwd1,char *,buf,size_t,size)
>  #if TARGET_ABI_BITS == 32
> -_syscall3(int, sys_getdents, uint, fd, struct dirent *, dirp, uint, count);
> +_syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, 
> count);
>  #endif
>  #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
> -_syscall3(int, sys_getdents64, uint, fd, struct dirent64 *, dirp, uint, 
> count);
> +_syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, 
> uint, count);
>  #endif
>  _syscall2(int, sys_getpriority, int, which, int, who);
>  #if !defined (__x86_64__)
> @@ -4879,7 +4878,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  #elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
>          {
>              struct target_dirent *target_dirp;
> -            struct dirent *dirp;
> +            struct linux_dirent *dirp;
>              abi_long count = arg3;
>  
>           dirp = malloc(count);
> @@ -4890,7 +4889,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  
>              ret = get_errno(sys_getdents(arg1, dirp, count));
>              if (!is_error(ret)) {
> -                struct dirent *de;
> +                struct linux_dirent *de;
>               struct target_dirent *tde;
>                  int len = ret;
>                  int reclen, treclen;
> @@ -4912,7 +4911,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>                          tnamelen = 256;
>                      /* XXX: may not be correct */
>                   strncpy(tde->d_name, de->d_name, tnamelen);
> -                    de = (struct dirent *)((char *)de + reclen);
> +                    de = (struct linux_dirent *)((char *)de + reclen);
>                      len -= reclen;
>                      tde = (struct target_dirent *)((char *)tde + treclen);
>                   count1 += treclen;
> @@ -4924,14 +4923,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>          }
>  #else
>          {
> -            struct dirent *dirp;
> +            struct linux_dirent *dirp;
>              abi_long count = arg3;
>  
>              if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
>                  goto efault;
>              ret = get_errno(sys_getdents(arg1, dirp, count));
>              if (!is_error(ret)) {
> -                struct dirent *de;
> +                struct linux_dirent *de;
>                  int len = ret;
>                  int reclen;
>                  de = dirp;
> @@ -4942,7 +4941,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>                      de->d_reclen = tswap16(reclen);
>                      tswapls(&de->d_ino);
>                      tswapls(&de->d_off);
> -                    de = (struct dirent *)((char *)de + reclen);
> +                    de = (struct linux_dirent *)((char *)de + reclen);
>                      len -= reclen;
>                  }
>              }
> @@ -4953,13 +4952,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
>      case TARGET_NR_getdents64:
>          {
> -            struct dirent64 *dirp;
> +            struct linux_dirent64 *dirp;
>              abi_long count = arg3;
>              if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
>                  goto efault;
>              ret = get_errno(sys_getdents64(arg1, dirp, count));
>              if (!is_error(ret)) {
> -                struct dirent64 *de;
> +                struct linux_dirent64 *de;
>                  int len = ret;
>                  int reclen;
>                  de = dirp;
> @@ -4970,7 +4969,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>                      de->d_reclen = tswap16(reclen);
>                      tswap64s((uint64_t *)&de->d_ino);
>                      tswap64s((uint64_t *)&de->d_off);
> -                    de = (struct dirent64 *)((char *)de + reclen);
> +                    de = (struct linux_dirent64 *)((char *)de + reclen);
>                      len -= reclen;
>                  }
>              }
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index c30bb15..5a58010 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -1963,6 +1963,21 @@ struct target_sysinfo {
>      char _f[20-2*sizeof(abi_long)-sizeof(int)]; /* Padding: libc5 uses 
> this.. */
>  };
>  
> +struct linux_dirent {
> +    long            d_ino;
> +    unsigned long   d_off;
> +    unsigned short  d_reclen;
> +    char            d_name[256]; /* We must not include limits.h! */
> +};
> +
> +struct linux_dirent64 {
> +    uint64_t        d_ino;
> +    int64_t         d_off;
> +    unsigned short  d_reclen;
> +    unsigned char   d_type;
> +    char            d_name[256];
> +};
> +
>  #include "socket.h"
>  
>  #include "errno_defs.h"
> -- 
> 1.5.6.5.GIT
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno             | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   address@hidden         | address@hidden
   `-    people.debian.org/~aurel32 | www.aurel32.net




reply via email to

[Prev in Thread] Current Thread [Next in Thread]