[kernel] r8249 - in dists/sid/linux-2.6/debian: . patches/bugfix
patches/series
maximilian attems
maks-guest at alioth.debian.org
Wed Jan 31 16:18:56 UTC 2007
Author: maks-guest
Date: Wed Jan 31 17:18:55 2007
New Revision: 8249
Added:
dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.39
Modified:
dists/sid/linux-2.6/debian/changelog
dists/sid/linux-2.6/debian/patches/series/10
Log:
add interesting 2.6.16.39 bits
Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog (original)
+++ dists/sid/linux-2.6/debian/changelog Wed Jan 31 17:18:55 2007
@@ -36,11 +36,28 @@
* [PKTGEN]: Convert to kthread API. Thanks David Miller for patch.
* [IDE] Add driver for Jmicron JMB36x devices by Alan Cox.
Enable jmicron on i386 and amd64 archs.
+ * Hand-picked from stable release 2.6.16.39:
+ - atiixp: hang fix
+ - V4L/DVB: Flexcop-usb: fix debug printk
+ - V4L/DVB: Fix uninitialised variable in dvb_frontend_swzigzag
+ - read_zero_pagealigned() locking fix
+ - adfs: fix filename handling
+ - sparc32: add offset in pci_map_sg()
+ - cdrom: set default timeout to 7 seconds
+ - [SCSI] qla1280 command timeout
+ - [SCSI] qla1280 bus reset typo
+ - [Bluetooth] Check if DLC is still attached to the TTY
+ - [Bluetooth] Fix uninitialized return value for RFCOMM sendmsg()
+ - [Bluetooth] Return EINPROGRESS for non-blocking socket calls
+ - [Bluetooth] Handle command complete event for exit periodic inquiry
+ - [Bluetooth] Fix compat ioctl for BNEP, CMTP and HIDP
+ - [Bluetooth] Add locking for bt_proto array manipulation
+ - i386: fix CPU hotplug with 2GB VMSPLIT
[ dann frazier ]
* Fix raid1 recovery (closes: #406181)
- -- dann frazier <dannf at debian.org> Tue, 30 Jan 2007 15:16:28 -0700
+ -- maximilian attems <maks at sternwelten.at> Wed, 31 Jan 2007 17:08:50 +0100
linux-2.6 (2.6.18.dfsg.1-9) unstable; urgency=low
Added: dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.39
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/2.6.16.39 Wed Jan 31 17:18:55 2007
@@ -0,0 +1,887 @@
+diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
+index 7007e17..f04ff35 100644
+--- a/arch/i386/kernel/smpboot.c
++++ b/arch/i386/kernel/smpboot.c
+@@ -1054,7 +1054,7 @@ int __devinit smp_prepare_cpu(int cpu)
+
+ /* init low mem mapping */
+ clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
+- KERNEL_PGD_PTRS);
++ min_t(unsigned long, KERNEL_PGD_PTRS, USER_PGD_PTRS));
+ flush_tlb_all();
+ schedule_work(&task);
+ wait_for_completion(&done);
+diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
+index d39c9f2..aa07df5 100644
+--- a/arch/sparc/kernel/ioport.c
++++ b/arch/sparc/kernel/ioport.c
+@@ -581,7 +581,8 @@ int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents,
+ /* IIep is write-through, not flushing. */
+ for (n = 0; n < nents; n++) {
+ BUG_ON(page_address(sg->page) == NULL);
+- sg->dvma_address = virt_to_phys(page_address(sg->page));
++ sg->dvma_address =
++ virt_to_phys(page_address(sg->page)) + sg->offset;
+ sg->dvma_length = sg->length;
+ sg++;
+ }
+diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
+index e866df0..55e71b7 100644
+--- a/drivers/cdrom/cdrom.c
++++ b/drivers/cdrom/cdrom.c
+@@ -338,6 +338,12 @@ static const char *mrw_address_space[] = { "DMA", "GAA" };
+ /* used in the audio ioctls */
+ #define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret
+
++/*
++ * Another popular OS uses 7 seconds as the hard timeout for default
++ * commands, so it is a good choice for us as well.
++ */
++#define CDROM_DEF_TIMEOUT (7 * HZ)
++
+ /* Not-exported routines. */
+ static int open_for_data(struct cdrom_device_info * cdi);
+ static int check_for_audio_disc(struct cdrom_device_info * cdi,
+@@ -1528,7 +1534,7 @@ void init_cdrom_command(struct packet_command *cgc, void *buf, int len,
+ cgc->buffer = (char *) buf;
+ cgc->buflen = len;
+ cgc->data_direction = type;
+- cgc->timeout = 5*HZ;
++ cgc->timeout = CDROM_DEF_TIMEOUT;
+ }
+
+ /* DVD handling */
+diff --git a/drivers/char/mem.c b/drivers/char/mem.c
+index 29c41f4..3b50f44 100644
+--- a/drivers/char/mem.c
++++ b/drivers/char/mem.c
+@@ -613,7 +613,8 @@ static inline size_t read_zero_pagealigned(char __user * buf, size_t size)
+ count = size;
+
+ zap_page_range(vma, addr, count, NULL);
+- zeromap_page_range(vma, addr, count, PAGE_COPY);
++ if (zeromap_page_range(vma, addr, count, PAGE_COPY))
++ break;
+
+ size -= count;
+ buf += count;
+@@ -680,11 +681,14 @@ out:
+
+ static int mmap_zero(struct file * file, struct vm_area_struct * vma)
+ {
++ int err;
++
+ if (vma->vm_flags & VM_SHARED)
+ return shmem_zero_setup(vma);
+- if (zeromap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot))
+- return -EAGAIN;
+- return 0;
++ err = zeromap_page_range(vma, vma->vm_start,
++ vma->vm_end - vma->vm_start, vma->vm_page_prot);
++ BUG_ON(err == -EEXIST);
++ return err;
+ }
+ #else /* CONFIG_MMU */
+ static ssize_t read_zero(struct file * file, char * buf,
+diff --git a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c
+index df9ee9a..1684ae0 100644
+--- a/drivers/ide/pci/atiixp.c
++++ b/drivers/ide/pci/atiixp.c
+@@ -47,6 +47,8 @@ static atiixp_ide_timing mdma_timing[] = {
+
+ static int save_mdma_mode[4];
+
++static DEFINE_SPINLOCK(atiixp_lock);
++
+ /**
+ * atiixp_ratemask - compute rate mask for ATIIXP IDE
+ * @drive: IDE drive to compute for
+@@ -106,7 +108,7 @@ static int atiixp_ide_dma_host_on(ide_drive_t *drive)
+ unsigned long flags;
+ u16 tmp16;
+
+- spin_lock_irqsave(&ide_lock, flags);
++ spin_lock_irqsave(&atiixp_lock, flags);
+
+ pci_read_config_word(dev, ATIIXP_IDE_UDMA_CONTROL, &tmp16);
+ if (save_mdma_mode[drive->dn])
+@@ -115,7 +117,7 @@ static int atiixp_ide_dma_host_on(ide_drive_t *drive)
+ tmp16 |= (1 << drive->dn);
+ pci_write_config_word(dev, ATIIXP_IDE_UDMA_CONTROL, tmp16);
+
+- spin_unlock_irqrestore(&ide_lock, flags);
++ spin_unlock_irqrestore(&atiixp_lock, flags);
+
+ return __ide_dma_host_on(drive);
+ }
+@@ -126,13 +128,13 @@ static int atiixp_ide_dma_host_off(ide_drive_t *drive)
+ unsigned long flags;
+ u16 tmp16;
+
+- spin_lock_irqsave(&ide_lock, flags);
++ spin_lock_irqsave(&atiixp_lock, flags);
+
+ pci_read_config_word(dev, ATIIXP_IDE_UDMA_CONTROL, &tmp16);
+ tmp16 &= ~(1 << drive->dn);
+ pci_write_config_word(dev, ATIIXP_IDE_UDMA_CONTROL, tmp16);
+
+- spin_unlock_irqrestore(&ide_lock, flags);
++ spin_unlock_irqrestore(&atiixp_lock, flags);
+
+ return __ide_dma_host_off(drive);
+ }
+@@ -153,7 +155,7 @@ static void atiixp_tuneproc(ide_drive_t *drive, u8 pio)
+ u32 pio_timing_data;
+ u16 pio_mode_data;
+
+- spin_lock_irqsave(&ide_lock, flags);
++ spin_lock_irqsave(&atiixp_lock, flags);
+
+ pci_read_config_word(dev, ATIIXP_IDE_PIO_MODE, &pio_mode_data);
+ pio_mode_data &= ~(0x07 << (drive->dn * 4));
+@@ -166,7 +168,7 @@ static void atiixp_tuneproc(ide_drive_t *drive, u8 pio)
+ (pio_timing[pio].command_width << (timing_shift + 4));
+ pci_write_config_dword(dev, ATIIXP_IDE_PIO_TIMING, pio_timing_data);
+
+- spin_unlock_irqrestore(&ide_lock, flags);
++ spin_unlock_irqrestore(&atiixp_lock, flags);
+ }
+
+ /**
+@@ -190,7 +192,7 @@ static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed)
+
+ speed = ide_rate_filter(atiixp_ratemask(drive), xferspeed);
+
+- spin_lock_irqsave(&ide_lock, flags);
++ spin_lock_irqsave(&atiixp_lock, flags);
+
+ save_mdma_mode[drive->dn] = 0;
+ if (speed >= XFER_UDMA_0) {
+@@ -209,7 +211,7 @@ static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed)
+ }
+ }
+
+- spin_unlock_irqrestore(&ide_lock, flags);
++ spin_unlock_irqrestore(&atiixp_lock, flags);
+
+ if (speed >= XFER_SW_DMA_0)
+ pio = atiixp_dma_2_pio(speed);
+diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c
+index a6c91db..f182a7b 100644
+--- a/drivers/media/dvb/b2c2/flexcop-usb.c
++++ b/drivers/media/dvb/b2c2/flexcop-usb.c
+@@ -246,7 +246,7 @@ static int flexcop_usb_i2c_req(struct flexcop_usb *fc_usb,
+ wIndex = (chipaddr << 8 ) | addr;
+
+ deb_i2c("i2c %2d: %02x %02x %02x %02x %02x %02x\n",func,request_type,req,
+- ((wValue && 0xff) << 8),wValue >> 8,((wIndex && 0xff) << 8),wIndex >> 8);
++ wValue & 0xff, wValue >> 8, wIndex & 0xff, wIndex >> 8);
+
+ len = usb_control_msg(fc_usb->udev,pipe,
+ req,
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index 771f32d..b7a6bc3 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -329,7 +329,7 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra
+
+ static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
+ {
+- fe_status_t s;
++ fe_status_t s = 0;
+ struct dvb_frontend_private *fepriv = fe->frontend_priv;
+
+ /* if we've got no parameters, just keep idling */
+diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
+index e023024..6a229f1 100644
+--- a/drivers/scsi/qla1280.c
++++ b/drivers/scsi/qla1280.c
+@@ -955,11 +955,10 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action)
+
+ case BUS_RESET:
+ if (qla1280_verbose)
+- printk(KERN_INFO "qla1280(%ld:%d): Issuing BUS "
+- "DEVICE RESET\n", ha->host_no, bus);
+- if (qla1280_bus_reset(ha, bus == 0))
++ printk(KERN_INFO "qla1280(%ld:%d): Issued bus "
++ "reset.\n", ha->host_no, bus);
++ if (qla1280_bus_reset(ha, bus) == 0)
+ result = SUCCESS;
+-
+ break;
+
+ case ADAPTER_RESET:
+@@ -2886,7 +2885,7 @@ qla1280_64bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)
+ memset(((char *)pkt + 8), 0, (REQUEST_ENTRY_SIZE - 8));
+
+ /* Set ISP command timeout. */
+- pkt->timeout = cpu_to_le16(30);
++ pkt->timeout = cpu_to_le16(cmd->timeout_per_command/HZ);
+
+ /* Set device target ID and LUN */
+ pkt->lun = SCSI_LUN_32(cmd);
+@@ -3185,7 +3184,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)
+ memset(((char *)pkt + 8), 0, (REQUEST_ENTRY_SIZE - 8));
+
+ /* Set ISP command timeout. */
+- pkt->timeout = cpu_to_le16(30);
++ pkt->timeout = cpu_to_le16(cmd->timeout_per_command/HZ);
+
+ /* Set device target ID and LUN */
+ pkt->lun = SCSI_LUN_32(cmd);
+diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c
+index bbfc862..b9b2b27 100644
+--- a/fs/adfs/dir_f.c
++++ b/fs/adfs/dir_f.c
+@@ -53,7 +53,7 @@ static inline int adfs_readname(char *buf, char *ptr, int maxlen)
+ {
+ char *old_buf = buf;
+
+- while (*ptr >= ' ' && maxlen--) {
++ while ((unsigned char)*ptr >= ' ' && maxlen--) {
+ if (*ptr == '/')
+ *buf++ = '.';
+ else
+diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
+index b06a2d2..80a4c1b 100644
+--- a/include/net/bluetooth/hci.h
++++ b/include/net/bluetooth/hci.h
+@@ -329,6 +329,8 @@ struct hci_cp_inquiry {
+
+ #define OCF_INQUIRY_CANCEL 0x0002
+
++#define OCF_EXIT_PERIODIC_INQ 0x0004
++
+ #define OCF_LINK_KEY_REPLY 0x000B
+ struct hci_cp_link_key_reply {
+ bdaddr_t bdaddr;
+diff --git a/mm/memory.c b/mm/memory.c
+index a4caa2f..97f5ea3 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -1092,21 +1092,27 @@ static int zeromap_pte_range(struct mm_struct *mm, pmd_t *pmd,
+ {
+ pte_t *pte;
+ spinlock_t *ptl;
++ int err = 0;
+
+ pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
+ if (!pte)
+- return -ENOMEM;
++ return -EAGAIN;
+ do {
+ struct page *page = ZERO_PAGE(addr);
+ pte_t zero_pte = pte_wrprotect(mk_pte(page, prot));
++
++ if (unlikely(!pte_none(*pte))) {
++ err = -EEXIST;
++ pte++;
++ break;
++ }
+ page_cache_get(page);
+ page_add_file_rmap(page);
+ inc_mm_counter(mm, file_rss);
+- BUG_ON(!pte_none(*pte));
+ set_pte_at(mm, addr, pte, zero_pte);
+ } while (pte++, addr += PAGE_SIZE, addr != end);
+ pte_unmap_unlock(pte - 1, ptl);
+- return 0;
++ return err;
+ }
+
+ static inline int zeromap_pmd_range(struct mm_struct *mm, pud_t *pud,
+@@ -1114,16 +1120,18 @@ static inline int zeromap_pmd_range(struct mm_struct *mm, pud_t *pud,
+ {
+ pmd_t *pmd;
+ unsigned long next;
++ int err;
+
+ pmd = pmd_alloc(mm, pud, addr);
+ if (!pmd)
+- return -ENOMEM;
++ return -EAGAIN;
+ do {
+ next = pmd_addr_end(addr, end);
+- if (zeromap_pte_range(mm, pmd, addr, next, prot))
+- return -ENOMEM;
++ err = zeromap_pte_range(mm, pmd, addr, next, prot);
++ if (err)
++ break;
+ } while (pmd++, addr = next, addr != end);
+- return 0;
++ return err;
+ }
+
+ static inline int zeromap_pud_range(struct mm_struct *mm, pgd_t *pgd,
+@@ -1131,16 +1139,18 @@ static inline int zeromap_pud_range(struct mm_struct *mm, pgd_t *pgd,
+ {
+ pud_t *pud;
+ unsigned long next;
++ int err;
+
+ pud = pud_alloc(mm, pgd, addr);
+ if (!pud)
+- return -ENOMEM;
++ return -EAGAIN;
+ do {
+ next = pud_addr_end(addr, end);
+- if (zeromap_pmd_range(mm, pud, addr, next, prot))
+- return -ENOMEM;
++ err = zeromap_pmd_range(mm, pud, addr, next, prot);
++ if (err)
++ break;
+ } while (pud++, addr = next, addr != end);
+- return 0;
++ return err;
+ }
+
+ int zeromap_page_range(struct vm_area_struct *vma,
+diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
+index fb031fe..8587844 100644
+--- a/net/bluetooth/af_bluetooth.c
++++ b/net/bluetooth/af_bluetooth.c
+@@ -54,36 +54,51 @@
+ /* Bluetooth sockets */
+ #define BT_MAX_PROTO 8
+ static struct net_proto_family *bt_proto[BT_MAX_PROTO];
++static DEFINE_RWLOCK(bt_proto_lock);
+
+ int bt_sock_register(int proto, struct net_proto_family *ops)
+ {
++ int err = 0;
++
+ if (proto < 0 || proto >= BT_MAX_PROTO)
+ return -EINVAL;
+
++ write_lock(&bt_proto_lock);
++
+ if (bt_proto[proto])
+- return -EEXIST;
++ err = -EEXIST;
++ else
++ bt_proto[proto] = ops;
+
+- bt_proto[proto] = ops;
+- return 0;
++ write_unlock(&bt_proto_lock);
++
++ return err;
+ }
+ EXPORT_SYMBOL(bt_sock_register);
+
+ int bt_sock_unregister(int proto)
+ {
++ int err = 0;
++
+ if (proto < 0 || proto >= BT_MAX_PROTO)
+ return -EINVAL;
+
++ write_lock(&bt_proto_lock);
++
+ if (!bt_proto[proto])
+- return -ENOENT;
++ err = -ENOENT;
++ else
++ bt_proto[proto] = NULL;
+
+- bt_proto[proto] = NULL;
+- return 0;
++ write_unlock(&bt_proto_lock);
++
++ return err;
+ }
+ EXPORT_SYMBOL(bt_sock_unregister);
+
+ static int bt_sock_create(struct socket *sock, int proto)
+ {
+- int err = 0;
++ int err;
+
+ if (proto < 0 || proto >= BT_MAX_PROTO)
+ return -EINVAL;
+@@ -93,11 +108,18 @@ static int bt_sock_create(struct socket *sock, int proto)
+ request_module("bt-proto-%d", proto);
+ }
+ #endif
++
+ err = -EPROTONOSUPPORT;
++
++ read_lock(&bt_proto_lock);
++
+ if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
+ err = bt_proto[proto]->create(sock, proto);
+ module_put(bt_proto[proto]->owner);
+ }
++
++ read_unlock(&bt_proto_lock);
++
+ return err;
+ }
+
+@@ -274,7 +296,7 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
+ set_current_state(TASK_INTERRUPTIBLE);
+
+ if (!timeo) {
+- err = -EAGAIN;
++ err = -EINPROGRESS;
+ break;
+ }
+
+diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c
+index 2bfe796..e9b63e6 100644
+--- a/net/bluetooth/bnep/sock.c
++++ b/net/bluetooth/bnep/sock.c
+@@ -44,6 +44,7 @@
+ #include <linux/ioctl.h>
+ #include <linux/file.h>
+ #include <linux/init.h>
++#include <linux/compat.h>
+ #include <net/sock.h>
+
+ #include <asm/system.h>
+@@ -147,24 +148,56 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
+ return 0;
+ }
+
++#ifdef CONFIG_COMPAT
++static int bnep_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
++{
++ if (cmd == BNEPGETCONNLIST) {
++ struct bnep_connlist_req cl;
++ uint32_t uci;
++ int err;
++
++ if (get_user(cl.cnum, (uint32_t __user *) arg) ||
++ get_user(uci, (u32 __user *) (arg + 4)))
++ return -EFAULT;
++
++ cl.ci = compat_ptr(uci);
++
++ if (cl.cnum <= 0)
++ return -EINVAL;
++
++ err = bnep_get_connlist(&cl);
++
++ if (!err && put_user(cl.cnum, (uint32_t __user *) arg))
++ err = -EFAULT;
++
++ return err;
++ }
++
++ return bnep_sock_ioctl(sock, cmd, arg);
++}
++#endif
++
+ static const struct proto_ops bnep_sock_ops = {
+- .family = PF_BLUETOOTH,
+- .owner = THIS_MODULE,
+- .release = bnep_sock_release,
+- .ioctl = bnep_sock_ioctl,
+- .bind = sock_no_bind,
+- .getname = sock_no_getname,
+- .sendmsg = sock_no_sendmsg,
+- .recvmsg = sock_no_recvmsg,
+- .poll = sock_no_poll,
+- .listen = sock_no_listen,
+- .shutdown = sock_no_shutdown,
+- .setsockopt = sock_no_setsockopt,
+- .getsockopt = sock_no_getsockopt,
+- .connect = sock_no_connect,
+- .socketpair = sock_no_socketpair,
+- .accept = sock_no_accept,
+- .mmap = sock_no_mmap
++ .family = PF_BLUETOOTH,
++ .owner = THIS_MODULE,
++ .release = bnep_sock_release,
++ .ioctl = bnep_sock_ioctl,
++#ifdef CONFIG_COMPAT
++ .compat_ioctl = bnep_sock_compat_ioctl,
++#endif
++ .bind = sock_no_bind,
++ .getname = sock_no_getname,
++ .sendmsg = sock_no_sendmsg,
++ .recvmsg = sock_no_recvmsg,
++ .poll = sock_no_poll,
++ .listen = sock_no_listen,
++ .shutdown = sock_no_shutdown,
++ .setsockopt = sock_no_setsockopt,
++ .getsockopt = sock_no_getsockopt,
++ .connect = sock_no_connect,
++ .socketpair = sock_no_socketpair,
++ .accept = sock_no_accept,
++ .mmap = sock_no_mmap
+ };
+
+ static struct proto bnep_proto = {
+@@ -182,7 +215,7 @@ static int bnep_sock_create(struct socket *sock, int protocol)
+ if (sock->type != SOCK_RAW)
+ return -ESOCKTNOSUPPORT;
+
+- sk = sk_alloc(PF_BLUETOOTH, GFP_KERNEL, &bnep_proto, 1);
++ sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &bnep_proto, 1);
+ if (!sk)
+ return -ENOMEM;
+
+diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c
+index 8f8fad2..d29e870 100644
+--- a/net/bluetooth/cmtp/sock.c
++++ b/net/bluetooth/cmtp/sock.c
+@@ -35,6 +35,7 @@
+ #include <linux/socket.h>
+ #include <linux/ioctl.h>
+ #include <linux/file.h>
++#include <linux/compat.h>
+ #include <net/sock.h>
+
+ #include <linux/isdn/capilli.h>
+@@ -138,11 +139,43 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
+ return -EINVAL;
+ }
+
++#ifdef CONFIG_COMPAT
++static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
++{
++ if (cmd == CMTPGETCONNLIST) {
++ struct cmtp_connlist_req cl;
++ uint32_t uci;
++ int err;
++
++ if (get_user(cl.cnum, (uint32_t __user *) arg) ||
++ get_user(uci, (u32 __user *) (arg + 4)))
++ return -EFAULT;
++
++ cl.ci = compat_ptr(uci);
++
++ if (cl.cnum <= 0)
++ return -EINVAL;
++
++ err = cmtp_get_connlist(&cl);
++
++ if (!err && put_user(cl.cnum, (uint32_t __user *) arg))
++ err = -EFAULT;
++
++ return err;
++ }
++
++ return cmtp_sock_ioctl(sock, cmd, arg);
++}
++#endif
++
+ static const struct proto_ops cmtp_sock_ops = {
+ .family = PF_BLUETOOTH,
+ .owner = THIS_MODULE,
+ .release = cmtp_sock_release,
+ .ioctl = cmtp_sock_ioctl,
++#ifdef CONFIG_COMPAT
++ .compat_ioctl = cmtp_sock_compat_ioctl,
++#endif
+ .bind = sock_no_bind,
+ .getname = sock_no_getname,
+ .sendmsg = sock_no_sendmsg,
+@@ -173,7 +206,7 @@ static int cmtp_sock_create(struct socket *sock, int protocol)
+ if (sock->type != SOCK_RAW)
+ return -ESOCKTNOSUPPORT;
+
+- sk = sk_alloc(PF_BLUETOOTH, GFP_KERNEL, &cmtp_proto, 1);
++ sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &cmtp_proto, 1);
+ if (!sk)
+ return -ENOMEM;
+
+diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
+index eb64555..d02ff17 100644
+--- a/net/bluetooth/hci_event.c
++++ b/net/bluetooth/hci_event.c
+@@ -63,6 +63,7 @@ static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
+
+ switch (ocf) {
+ case OCF_INQUIRY_CANCEL:
++ case OCF_EXIT_PERIODIC_INQ:
+ status = *((__u8 *) skb->data);
+
+ if (status) {
+diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
+index 97bdec7..ed117db 100644
+--- a/net/bluetooth/hci_sock.c
++++ b/net/bluetooth/hci_sock.c
+@@ -619,7 +622,7 @@ static int hci_sock_create(struct socket *sock, int protocol)
+
+ sock->ops = &hci_sock_ops;
+
+- sk = sk_alloc(PF_BLUETOOTH, GFP_KERNEL, &hci_sk_proto, 1);
++ sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto, 1);
+ if (!sk)
+ return -ENOMEM;
+
+diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c
+index b8f6776..9ebab48 100644
+--- a/net/bluetooth/hidp/sock.c
++++ b/net/bluetooth/hidp/sock.c
+@@ -36,6 +36,7 @@
+ #include <linux/ioctl.h>
+ #include <linux/file.h>
+ #include <linux/init.h>
++#include <linux/compat.h>
+ #include <net/sock.h>
+
+ #include "hidp.h"
+@@ -144,11 +145,88 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
+ return -EINVAL;
+ }
+
++#ifdef CONFIG_COMPAT
++struct compat_hidp_connadd_req {
++ int ctrl_sock; // Connected control socket
++ int intr_sock; // Connteted interrupt socket
++ __u16 parser;
++ __u16 rd_size;
++ compat_uptr_t rd_data;
++ __u8 country;
++ __u8 subclass;
++ __u16 vendor;
++ __u16 product;
++ __u16 version;
++ __u32 flags;
++ __u32 idle_to;
++ char name[128];
++};
++
++static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
++{
++ if (cmd == HIDPGETCONNLIST) {
++ struct hidp_connlist_req cl;
++ uint32_t uci;
++ int err;
++
++ if (get_user(cl.cnum, (uint32_t __user *) arg) ||
++ get_user(uci, (u32 __user *) (arg + 4)))
++ return -EFAULT;
++
++ cl.ci = compat_ptr(uci);
++
++ if (cl.cnum <= 0)
++ return -EINVAL;
++
++ err = hidp_get_connlist(&cl);
++
++ if (!err && put_user(cl.cnum, (uint32_t __user *) arg))
++ err = -EFAULT;
++
++ return err;
++ } else if (cmd == HIDPCONNADD) {
++ struct compat_hidp_connadd_req ca;
++ struct hidp_connadd_req __user *uca;
++
++ uca = compat_alloc_user_space(sizeof(*uca));
++
++ if (copy_from_user(&ca, (void *) arg, sizeof(ca)))
++ return -EFAULT;
++
++ if (put_user(ca.ctrl_sock, &uca->ctrl_sock) ||
++ put_user(ca.intr_sock, &uca->intr_sock) ||
++ put_user(ca.parser, &uca->parser) ||
++ put_user(ca.rd_size, &uca->parser) ||
++ put_user(compat_ptr(ca.rd_data), &uca->rd_data) ||
++ put_user(ca.country, &uca->country) ||
++ put_user(ca.subclass, &uca->subclass) ||
++ put_user(ca.vendor, &uca->vendor) ||
++ put_user(ca.product, &uca->product) ||
++ put_user(ca.version, &uca->version) ||
++ put_user(ca.flags, &uca->flags) ||
++ put_user(ca.idle_to, &uca->idle_to) ||
++ copy_to_user(&uca->name[0], &ca.name[0], 128))
++ return -EFAULT;
++
++ arg = (unsigned long) uca;
++
++ /* Fall through. We don't actually write back any _changes_
++ to the structure anyway, so there's no need to copy back
++ into the original compat version */
++ }
++
++ return hidp_sock_ioctl(sock, cmd, arg);
++}
++#endif
++
+ static const struct proto_ops hidp_sock_ops = {
+ .family = PF_BLUETOOTH,
+ .owner = THIS_MODULE,
+ .release = hidp_sock_release,
+ .ioctl = hidp_sock_ioctl,
++#ifdef CONFIG_COMPAT
++ .compat_ioctl = hidp_sock_compat_ioctl,
++#endif
+ .bind = sock_no_bind,
+ .getname = sock_no_getname,
+ .sendmsg = sock_no_sendmsg,
+@@ -179,7 +257,7 @@ static int hidp_sock_create(struct socket *sock, int protocol)
+ if (sock->type != SOCK_RAW)
+ return -ESOCKTNOSUPPORT;
+
+- sk = sk_alloc(PF_BLUETOOTH, GFP_KERNEL, &hidp_proto, 1);
++ sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &hidp_proto, 1);
+ if (!sk)
+ return -ENOMEM;
+
+diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
+index f6b4a80..9d2d1d6 100644
+--- a/net/bluetooth/l2cap.c
++++ b/net/bluetooth/l2cap.c
+@@ -414,7 +414,7 @@ static int l2cap_sock_create(struct socket *sock, int protocol)
+
+ sock->ops = &l2cap_sock_ops;
+
+- sk = l2cap_sock_alloc(sock, protocol, GFP_KERNEL);
++ sk = l2cap_sock_alloc(sock, protocol, GFP_ATOMIC);
+ if (!sk)
+ return -ENOMEM;
+
+diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
+index 5b4253c..b9ec4c3 100644
+--- a/net/bluetooth/rfcomm/core.c
++++ b/net/bluetooth/rfcomm/core.c
+@@ -640,7 +640,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
+ addr.l2_family = AF_BLUETOOTH;
+ addr.l2_psm = htobs(RFCOMM_PSM);
+ *err = sock->ops->connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
+- if (*err == 0 || *err == -EAGAIN)
++ if (*err == 0 || *err == -EINPROGRESS)
+ return s;
+
+ rfcomm_session_del(s);
+diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
+index 757d2dd..54f2a7c 100644
+--- a/net/bluetooth/rfcomm/sock.c
++++ b/net/bluetooth/rfcomm/sock.c
+@@ -337,7 +337,8 @@ static int rfcomm_sock_create(struct socket *sock, int protocol)
+
+ sock->ops = &rfcomm_sock_ops;
+
+- if (!(sk = rfcomm_sock_alloc(sock, protocol, GFP_KERNEL)))
++ sk = rfcomm_sock_alloc(sock, protocol, GFP_ATOMIC);
++ if (!sk)
+ return -ENOMEM;
+
+ rfcomm_sock_init(sk, NULL);
+@@ -557,7 +558,6 @@ static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
+ struct sock *sk = sock->sk;
+ struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
+ struct sk_buff *skb;
+- int err;
+ int sent = 0;
+
+ if (msg->msg_flags & MSG_OOB)
+@@ -572,6 +572,7 @@ static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
+
+ while (len) {
+ size_t size = min_t(size_t, len, d->mtu);
++ int err;
+
+ skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
+ msg->msg_flags & MSG_DONTWAIT, &err);
+@@ -582,13 +583,16 @@ static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
+ err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
+ if (err) {
+ kfree_skb(skb);
+- sent = err;
++ if (sent == 0)
++ sent = err;
+ break;
+ }
+
+ err = rfcomm_dlc_send(d, skb);
+ if (err < 0) {
+ kfree_skb(skb);
++ if (sent == 0)
++ sent = err;
+ break;
+ }
+
+@@ -598,7 +602,7 @@ static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
+
+ release_sock(sk);
+
+- return sent ? sent : err;
++ return sent;
+ }
+
+ static long rfcomm_sock_data_wait(struct sock *sk, long timeo)
+diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
+index 74368f7..3685015 100644
+--- a/net/bluetooth/rfcomm/tty.c
++++ b/net/bluetooth/rfcomm/tty.c
+@@ -686,9 +686,13 @@ static int rfcomm_tty_write_room(struct tty_struct *tty)
+
+ BT_DBG("tty %p", tty);
+
++ if (!dev || !dev->dlc)
++ return 0;
++
+ room = rfcomm_room(dev->dlc) - atomic_read(&dev->wmem_alloc);
+ if (room < 0)
+ room = 0;
++
+ return room;
+ }
+
+@@ -901,12 +908,14 @@ static void rfcomm_tty_unthrottle(struct tty_struct *tty)
+ static int rfcomm_tty_chars_in_buffer(struct tty_struct *tty)
+ {
+ struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
+- struct rfcomm_dlc *dlc = dev->dlc;
+
+ BT_DBG("tty %p dev %p", tty, dev);
+
+- if (!skb_queue_empty(&dlc->tx_queue))
+- return dlc->mtu;
++ if (!dev || !dev->dlc)
++ return 0;
++
++ if (!skb_queue_empty(&dev->dlc->tx_queue))
++ return dev->dlc->mtu;
+
+ return 0;
+ }
+@@ -914,11 +923,12 @@ static int rfcomm_tty_chars_in_buffer(struct tty_struct *tty)
+ static void rfcomm_tty_flush_buffer(struct tty_struct *tty)
+ {
+ struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
+- if (!dev)
+- return;
+
+ BT_DBG("tty %p dev %p", tty, dev);
+
++ if (!dev || !dev->dlc)
++ return;
++
+ skb_queue_purge(&dev->dlc->tx_queue);
+
+ if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)
+@@ -938,11 +948,12 @@ static void rfcomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
+ static void rfcomm_tty_hangup(struct tty_struct *tty)
+ {
+ struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
+- if (!dev)
+- return;
+
+ BT_DBG("tty %p dev %p", tty, dev);
+
++ if (!dev)
++ return;
++
+ rfcomm_tty_flush_buffer(tty);
+
+ if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags))
+diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
+index 6b61323..d0ed101 100644
+--- a/net/bluetooth/sco.c
++++ b/net/bluetooth/sco.c
+@@ -455,7 +455,8 @@ static int sco_sock_create(struct socket *sock, int protocol)
+
+ sock->ops = &sco_sock_ops;
+
+- if (!(sk = sco_sock_alloc(sock, protocol, GFP_KERNEL)))
++ sk = sco_sock_alloc(sock, protocol, GFP_ATOMIC);
++ if (!sk)
+ return -ENOMEM;
+
+ sco_sock_init(sk, NULL);
Modified: dists/sid/linux-2.6/debian/patches/series/10
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/10 (original)
+++ dists/sid/linux-2.6/debian/patches/series/10 Wed Jan 31 17:18:55 2007
@@ -6,3 +6,4 @@
+ bugfix/net-pkgtgen-kthread.patch
+ features/ide-jmicron.patch
+ bugfix/raid1-repair-fix.patch
++ bugfix/2.6.16.39
More information about the Kernel-svn-changes
mailing list