Author: dannf
Date: Mon Jul 30 17:23:35 2007
New Revision: 9232

Log:
* [hppa] Use generic compat_sys_getdents (closes: #431773)

Added:
   dists/sid/linux-2.6/debian/patches/bugfix/hppa/
   
dists/sid/linux-2.6/debian/patches/bugfix/hppa/use-generic-compat_sys_getdents.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/4

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog        (original)
+++ dists/sid/linux-2.6/debian/changelog        Mon Jul 30 17:23:35 2007
@@ -1,8 +1,12 @@
 linux-2.6 (2.6.22-4) UNRELEASED; urgency=low
 
+  [ Sven Luther ]
   * [powerpc] Added Genesi Efika support.
 
- -- Sven Luther <[EMAIL PROTECTED]>  Sun, 29 Jul 2007 15:11:31 +0200
+  [ dann frazier ]
+  * [hppa] Use generic compat_sys_getdents (closes: #431773)
+
+ -- dann frazier <[EMAIL PROTECTED]>  Mon, 30 Jul 2007 11:23:31 -0600
 
 linux-2.6 (2.6.22-3) unstable; urgency=low
 

Added: 
dists/sid/linux-2.6/debian/patches/bugfix/hppa/use-generic-compat_sys_getdents.patch
==============================================================================
--- (empty file)
+++ 
dists/sid/linux-2.6/debian/patches/bugfix/hppa/use-generic-compat_sys_getdents.patch
        Mon Jul 30 17:23:35 2007
@@ -0,0 +1,184 @@
+From 0deea67e075b5152d427426583500b8d9cf0a56c Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <[EMAIL PROTECTED]>
+Date: Fri, 29 Jun 2007 03:38:10 -0400
+Subject: [PARISC] Use compat_sys_getdents
+
+Switch to using the generic compat_sys_getdents instead of a
+homebrew one.
+
+Signed-off-by: Kyle McMartin <[EMAIL PROTECTED]>
+---
+ arch/parisc/kernel/sys_parisc32.c  |  141 ------------------------------------
+ arch/parisc/kernel/syscall_table.S |    4 +-
+ 2 files changed, 1 insertions(+), 144 deletions(-)
+
+diff --git a/arch/parisc/kernel/sys_parisc32.c 
b/arch/parisc/kernel/sys_parisc32.c
+index bb23ff7..2989c66 100644
+--- a/arch/parisc/kernel/sys_parisc32.c
++++ b/arch/parisc/kernel/sys_parisc32.c
+@@ -285,147 +285,6 @@ int cp_compat_stat(struct kstat *stat, struct 
compat_stat __user *statbuf)
+       return err;
+ }
+ 
+-struct linux32_dirent {
+-      u32             d_ino;
+-      compat_off_t    d_off;
+-      u16             d_reclen;
+-      char            d_name[1];
+-};
+-
+-struct old_linux32_dirent {
+-      u32     d_ino;
+-      u32     d_offset;
+-      u16     d_namlen;
+-      char    d_name[1];
+-};
+-
+-struct getdents32_callback {
+-      struct linux32_dirent __user * current_dir;
+-      struct linux32_dirent __user * previous;
+-      int count;
+-      int error;
+-};
+-
+-struct readdir32_callback {
+-      struct old_linux32_dirent __user * dirent;
+-      int count;
+-};
+-
+-#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
+-static int filldir32 (void *__buf, const char *name, int namlen,
+-                      loff_t offset, u64 ino, unsigned int d_type)
+-{
+-      struct linux32_dirent __user * dirent;
+-      struct getdents32_callback * buf = (struct getdents32_callback *) __buf;
+-      int reclen = ALIGN(NAME_OFFSET(dirent) + namlen + 1, 4);
+-      u32 d_ino;
+-
+-      buf->error = -EINVAL;   /* only used if we fail.. */
+-      if (reclen > buf->count)
+-              return -EINVAL;
+-      d_ino = ino;
+-      if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
+-              return -EOVERFLOW;
+-      dirent = buf->previous;
+-      if (dirent)
+-              put_user(offset, &dirent->d_off);
+-      dirent = buf->current_dir;
+-      buf->previous = dirent;
+-      put_user(d_ino, &dirent->d_ino);
+-      put_user(reclen, &dirent->d_reclen);
+-      copy_to_user(dirent->d_name, name, namlen);
+-      put_user(0, dirent->d_name + namlen);
+-      dirent = ((void __user *)dirent) + reclen;
+-      buf->current_dir = dirent;
+-      buf->count -= reclen;
+-      return 0;
+-}
+-
+-asmlinkage long
+-sys32_getdents (unsigned int fd, void __user * dirent, unsigned int count)
+-{
+-      struct file * file;
+-      struct linux32_dirent __user * lastdirent;
+-      struct getdents32_callback buf;
+-      int error;
+-
+-      error = -EFAULT;
+-      if (!access_ok(VERIFY_WRITE, dirent, count))
+-              goto out;
+-
+-      error = -EBADF;
+-      file = fget(fd);
+-      if (!file)
+-              goto out;
+-
+-      buf.current_dir = (struct linux32_dirent __user *) dirent;
+-      buf.previous = NULL;
+-      buf.count = count;
+-      buf.error = 0;
+-
+-      error = vfs_readdir(file, filldir32, &buf);
+-      if (error < 0)
+-              goto out_putf;
+-      error = buf.error;
+-      lastdirent = buf.previous;
+-      if (lastdirent) {
+-              if (put_user(file->f_pos, &lastdirent->d_off))
+-                      error = -EFAULT;
+-              else
+-                      error = count - buf.count;
+-      }
+-
+-out_putf:
+-      fput(file);
+-out:
+-      return error;
+-}
+-
+-static int fillonedir32(void * __buf, const char * name, int namlen,
+-                      loff_t offset, u64 ino, unsigned int d_type)
+-{
+-      struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
+-      struct old_linux32_dirent __user * dirent;
+-      u32 d_ino;
+-
+-      if (buf->count)
+-              return -EINVAL;
+-      d_ino = ino;
+-      if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
+-              return -EOVERFLOW;
+-      buf->count++;
+-      dirent = buf->dirent;
+-      put_user(d_ino, &dirent->d_ino);
+-      put_user(offset, &dirent->d_offset);
+-      put_user(namlen, &dirent->d_namlen);
+-      copy_to_user(dirent->d_name, name, namlen);
+-      put_user(0, dirent->d_name + namlen);
+-      return 0;
+-}
+-
+-asmlinkage long
+-sys32_readdir (unsigned int fd, void __user * dirent, unsigned int count)
+-{
+-      int error;
+-      struct file * file;
+-      struct readdir32_callback buf;
+-
+-      error = -EBADF;
+-      file = fget(fd);
+-      if (!file)
+-              goto out;
+-
+-      buf.count = 0;
+-      buf.dirent = dirent;
+-
+-      error = vfs_readdir(file, fillonedir32, &buf);
+-      if (error >= 0)
+-              error = buf.count;
+-      fput(file);
+-out:
+-      return error;
+-}
+-
+ /*** copied from mips64 ***/
+ /*
+  * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
+diff --git a/arch/parisc/kernel/syscall_table.S 
b/arch/parisc/kernel/syscall_table.S
+index 627f3c2..2540786 100644
+--- a/arch/parisc/kernel/syscall_table.S
++++ b/arch/parisc/kernel/syscall_table.S
+@@ -222,9 +222,7 @@
+       ENTRY_SAME(setfsgid)
+       /* I think this might work */
+       ENTRY_SAME(llseek)              /* 140 */
+-      /* struct linux_dirent has longs, like 'unsigned long d_ino' which
+-       * almost definitely should be 'ino_t d_ino' but it's too late now */
+-      ENTRY_DIFF(getdents)
++      ENTRY_COMP(getdents)
+       /* it is POSSIBLE that select will be OK because even though fd_set
+        * contains longs, the macros and sizes are clever. */
+       ENTRY_COMP(select)
+-- 
+1.5.2.1
+

Modified: dists/sid/linux-2.6/debian/patches/series/4
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/4 (original)
+++ dists/sid/linux-2.6/debian/patches/series/4 Mon Jul 30 17:23:35 2007
@@ -25,3 +25,4 @@
 + features/powerpc/efika/11675_mpc5200_rtc_driver.patch
 + features/powerpc/efika/11861_mpc52xx_sparse_fixes.patch
 + 
features/powerpc/efika/12626_mpx5200_uart_drop_port_lock_across_tty_flip_buffer_call.patch
++ bugfix/hppa/use-generic-compat_sys_getdents.patch

_______________________________________________
Kernel-svn-changes mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/kernel-svn-changes

Reply via email to