Skip to contentSkip to conversation

- stable review

PATCH In review Greg KH 4 participants 28 messages Nov 9, 2005 – Dec 23, 2005

Subsystems (9)
Networking Network drivers VFS USB +5 more subsystems
lore
Share & tools
lore

Greg KH

author
#0 lore raw

cover - stable review

This is the start of the stable review cycle for the 2.6.14.2 release. There are 11 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a signed-off-by: line to the patch, please respond with it.

These patches are sent out with a number of different people on the Cc:
line. If you wish to be a reviewer, please email [email protected] to add your name to the list. If you want to be off the reviewer list, also email us.

Responses should be made by Saturday, November 12, 18:00:00 UTC Anything received after that time, might be too late.

thanks,

the -stable release team

author
#1 lore raw

PATCH 1/11 prism54 : Fix frame length

From: Roger While <[email protected]>

prism54 is leaking information when passing transmits to the firmware. There is no requirement to adjust the length to >= ETH_ZLEN. Just pass the skb length (after possible adjustment).

---
 drivers/net/wireless/prism54/islpci_eth.c |    7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/net/wireless/prism54/islpci_eth.c +1 -6
@@ -97,12 +97,6 @@ islpci_eth_transmit(struct sk_buff *skb,
 	/* lock the driver code */
 	spin_lock_irqsave(&priv->slock, flags);
 
-	/* determine the amount of fragments needed to store the frame */
-
-	frame_size = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
-	if (init_wds)
-		frame_size += 6;
-
 	/* check whether the destination queue has enough fragments for the frame */
 	curr_frag = le32_to_cpu(cb->driver_curr_frag[ISL38XX_CB_TX_DATA_LQ]);
 	if (unlikely(curr_frag - priv->free_data_tx >= ISL38XX_CB_TX_QSIZE)) {
@@ -213,6 +207,7 @@ islpci_eth_transmit(struct sk_buff *skb,
 	/* store the skb address for future freeing  */
 	priv->data_low_tx[index] = skb;
 	/* set the proper fragment start address and size information */
+	frame_size = skb->len;
 	fragment->size = cpu_to_le16(frame_size);
 	fragment->flags = cpu_to_le16(0);	/* set to 1 if more fragments */
 	fragment->address = cpu_to_le32(pci_map_address);

--

author
#2 lore raw

PATCH 2/11 fix XFS_QUOTA for modular XFS

In reply to Greg KH

From: Dimitri Puzin <[email protected]>

This patch by Dimitri Puzin submitted through kernel Bugzilla #5514 fixes the following issue:

Cannot build XFS filesystem support as module with quota support. It works only when the XFS filesystem support is compiled into the kernel. Menuconfig prevents from setting CONFIG_XFS_FS=m and CONFIG_XFS_QUOTA=y.

How to reproduce: configure the XFS filesystem with quota support as module. The resulting kernel won't have quota support compiled into xfs.ko.

Fix: Changing the fs/xfs/Kconfig file from tristate to bool lets you configure the quota support to be compiled into the XFS module. The Makefile-linux-2.6 checks only for CONFIG_XFS_QUOTA=y.

---
 fs/xfs/Kconfig |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/xfs/Kconfig +1 -1
@@ -24,7 +24,7 @@ config XFS_EXPORT
 	default y
 
 config XFS_QUOTA
-	tristate "XFS Quota support"
+	bool "XFS Quota support"
 	depends on XFS_FS
 	help
 	  If you say Y here, you will be able to set limits for disk usage on

--

author
#3 lore raw

PATCH 3/11 Oops on suspend after on-the-fly switch to anticipatory i/o scheduler - PowerBook5, 4

In reply to Greg KH

From: Jens Axboe <[email protected]>

Quoted 27 lines · Paul Collins

I boot with elevator=cfq (wanted to try the ionice stuff, never got around to it). Having decided to go back to the anticipatory scheduler, I did the following:

# echo anticipatory > /sys/block/hda/queue/scheduler
# echo anticipatory > /sys/block/hdc/queue/scheduler

A while later I did 'sudo snooze', which produced the Oops below.

Booting with elevator=as and then changing to cfq, sleep works fine. But if I resume and change back to anticipatory I get a similar Oops on the next 'sudo snooze'.

 Oops: kernel access of bad area, sig: 11 [#1]
 NIP: C01E1948 LR: C01D6A60 SP: EFBC5C20 REGS: efbc5b70 TRAP: 0300    

Not tainted
MSR: 00001032 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11
DAR: 00000020, DSISR: 40000000
TASK = efb012c0[1213] 'pmud' THREAD: efbc4000
Last syscall: 54 GPR00: 00080000 EFBC5C20 EFB012C0 EFE9E044
EFBC5CE8 00000002 00000000 C03B0000 GPR08: C046E5D8 00000000
C03B47C8 E6A58360 22042422 1001E4DC 10010000 10000000 GPR16:
10000000 10000000 10000000 7FE4EB40 10000000 10000000 10010000
C0400000 GPR24: C0380000 00000002 00000002 C046E0C0 00000000
00000002 00000000 EFBC5CE8 NIP [c01e1948] as_insert_request+0xa8/0x6b0
LR [c01d6a60] __elv_add_request+0xa0/0x100

Quoted 12 lines
 Call trace:
  [c01d6a60] __elv_add_request+0xa0/0x100
  [c01ffb84] ide_do_drive_cmd+0xb4/0x190
  [c01fc1c0] generic_ide_suspend+0x80/0xa0
  [c01d4574] suspend_device+0x104/0x160
  [c01d47c0] device_suspend+0x120/0x330
  [c03f3b50] pmac_suspend_devices+0x50/0x1b0
  [c03f4294] pmu_ioctl+0x344/0x9b0
  [c0082aa4] do_ioctl+0x84/0x90
  [c0082b3c] vfs_ioctl+0x8c/0x460
  [c0082f50] sys_ioctl+0x40/0x80
  [c0004850] ret_from_syscall+0x0/0x4c

Don't clear ->elevator_data on exit, if we are switching queues we are overwriting the data of the new io scheduler.

---
 drivers/block/cfq-iosched.c |    4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/block/cfq-iosched.c +1 -3
@@ -2260,10 +2260,8 @@ static void cfq_put_cfqd(struct cfq_data
 	if (!atomic_dec_and_test(&cfqd->ref))
 		return;
 
-	blk_put_queue(q);
-
 	cfq_shutdown_timer_wq(cfqd);
-	q->elevator->elevator_data = NULL;
+	blk_put_queue(q);
 
 	mempool_destroy(cfqd->crq_pool);
 	kfree(cfqd->crq_hash);

--

author
#4 lore raw

PATCH 4/11 USB: always export interface information for modalias

In reply to Greg KH

From: Greg Kroah-Hartman <[email protected]>

This fixes a problem with some cdc acm devices that were not getting automatically loaded as the module alias was not being reported properly.

This check was for back in the days when we only reported hotplug events for the main usb device, not the interfaces. We should always give the interface information for MODALIAS/modalias as it can be needed.

---
 drivers/usb/core/sysfs.c |   33 +++++++++---------------
 drivers/usb/core/usb.c   |   63 +++++++++++++++++------------------------------
 2 files changed, 36 insertions(+), 60 deletions(-)
drivers/usb/core/sysfs.c +13 -20
@@ -292,30 +292,23 @@ static ssize_t show_modalias(struct devi
 {
 	struct usb_interface *intf;
 	struct usb_device *udev;
-	int len;
+	struct usb_host_interface *alt;
 
 	intf = to_usb_interface(dev);
 	udev = interface_to_usbdev(intf);
+	alt = intf->cur_altsetting;
 
-	len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic",
-			       le16_to_cpu(udev->descriptor.idVendor),
-			       le16_to_cpu(udev->descriptor.idProduct),
-			       le16_to_cpu(udev->descriptor.bcdDevice),
-			       udev->descriptor.bDeviceClass,
-			       udev->descriptor.bDeviceSubClass,
-			       udev->descriptor.bDeviceProtocol);
-	buf += len;
-
-	if (udev->descriptor.bDeviceClass == 0) {
-		struct usb_host_interface *alt = intf->cur_altsetting;
-
-		return len + sprintf(buf, "%02Xisc%02Xip%02X\n",
-			       alt->desc.bInterfaceClass,
-			       alt->desc.bInterfaceSubClass,
-			       alt->desc.bInterfaceProtocol);
- 	} else {
-		return len + sprintf(buf, "*isc*ip*\n");
-	}
+	return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
+			"ic%02Xisc%02Xip%02X\n",
+			le16_to_cpu(udev->descriptor.idVendor),
+			le16_to_cpu(udev->descriptor.idProduct),
+			le16_to_cpu(udev->descriptor.bcdDevice),
+			udev->descriptor.bDeviceClass,
+			udev->descriptor.bDeviceSubClass,
+			udev->descriptor.bDeviceProtocol,
+			alt->desc.bInterfaceClass,
+			alt->desc.bInterfaceSubClass,
+			alt->desc.bInterfaceProtocol);
 }
 static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);
 
drivers/usb/core/usb.c +23 -40

82 lines not on this page · raw message

--

author
#5 lore raw

PATCH 5/11 tcp: BIC max increment too large

In reply to Greg KH

From: Stephen Hemminger <[email protected]>

The max growth of BIC TCP is too large. Original code was based on BIC 1.0 and the default there was 32. Later code (2.6.13) included compensation for delayed acks, and should have reduced the default value to 16; since normally TCP gets one ack for every two packets sent.

The current value of 32 makes BIC too aggressive and unfair to other flows.

---
 net/ipv4/tcp_bic.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_bic.c +1 -1
@@ -27,7 +27,7 @@
 					  */
 
 static int fast_convergence = 1;
-static int max_increment = 32;
+static int max_increment = 16;
 static int low_window = 14;
 static int beta = 819;		/* = 819/1024 (BICTCP_BETA_SCALE) */
 static int low_utilization_threshold = 153;

--

author
#6 lore raw

PATCH 6/11 airo.c/airo_cs.c: correct prototypes

In reply to Greg KH

From: Adrian Bunk <[email protected]>

This patch creates a file airo.h containing prototypes of the global functions in airo.c used by airo_cs.c .

If you got strange problems with either airo_cs devices or in any other completely unrelated part of the kernel shortly or long after a airo_cs device was detected by the kernel, this might have been caused by the fact that caller and callee disagreed regarding the size of the first argument to init_airo_card()...

---
 drivers/net/wireless/airo.c    |    2 ++
 drivers/net/wireless/airo.h    |    9 +++++++++
 drivers/net/wireless/airo_cs.c |    6 ++----
 3 files changed, 13 insertions(+), 4 deletions(-)
drivers/net/wireless/airo.h new file +9 -0
@@ -0,0 +1,9 @@
+#ifndef _AIRO_H_
+#define _AIRO_H_
+
+struct net_device *init_airo_card(unsigned short irq, int port, int is_pcmcia,
+				  struct device *dmdev);
+int reset_airo_card(struct net_device *dev);
+void stop_airo_card(struct net_device *dev, int freeres);
+
+#endif  /*  _AIRO_H_  */
drivers/net/wireless/airo.c +2 -0
@@ -46,6 +46,8 @@
 #include <linux/pci.h>
 #include <asm/uaccess.h>
 
+#include "airo.h"
+
 #ifdef CONFIG_PCI
 static struct pci_device_id card_ids[] = {
 	{ 0x14b9, 1, PCI_ANY_ID, PCI_ANY_ID, },
drivers/net/wireless/airo_cs.c +2 -4
@@ -42,6 +42,8 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
+#include "airo.h"
+
 /*
    All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
    you do not define PCMCIA_DEBUG at all, all the debug code will be
@@ -78,10 +80,6 @@ MODULE_SUPPORTED_DEVICE("Aironet 4500, 4
    event handler. 
 */
 
-struct net_device *init_airo_card( int, int, int, struct device * );
-void stop_airo_card( struct net_device *, int );
-int reset_airo_card( struct net_device * );
-
 static void airo_config(dev_link_t *link);
 static void airo_release(dev_link_t *link);
 static int airo_event(event_t event, int priority,

--

author
#7 lore raw

PATCH 7/11 NET: Fix zero-size datagram reception

In reply to Greg KH

From: Herbert Xu <[email protected]>

The recent rewrite of skb_copy_datagram_iovec broke the reception of zero-size datagrams. This patch fixes it.

---
 net/core/datagram.c |    4 ++++
 1 file changed, 4 insertions(+)
net/core/datagram.c +4 -0
@@ -213,6 +213,10 @@ int skb_copy_datagram_iovec(const struct
 {
 	int i, err, fraglen, end = 0;
 	struct sk_buff *next = skb_shinfo(skb)->frag_list;
+
+	if (!len)
+		return 0;
+
 next_skb:
 	fraglen = skb_headlen(skb);
 	i = -1;

--

author
#8 lore raw

PATCH 8/11 - fix signal->live leak in copy_process()

In reply to Greg KH

From: Oleg Nesterov <[email protected]>

exit_signal() (called from copy_process's error path) should decrement ->signal->live, otherwise forking process will miss 'group_dead' in do_exit().

---
 kernel/signal.c |    2 ++
 1 file changed, 2 insertions(+)
kernel/signal.c +2 -0
@@ -406,6 +406,8 @@ void __exit_signal(struct task_struct *t
 
 void exit_signal(struct task_struct *tsk)
 {
+	atomic_dec(&tsk->signal->live);
+
 	write_lock_irq(&tasklist_lock);
 	__exit_signal(tsk);
 	write_unlock_irq(&tasklist_lock);

--

author
#9 lore raw

PATCH 9/11 fix de_thread() vs send_group_sigqueue() race

In reply to Greg KH

From: Oleg Nesterov <[email protected]>

When non-leader thread does exec, de_thread calls release_task(leader) before calling exit_itimers(). If local timer interrupt happens in between, it can oops in send_group_sigqueue() while taking ->sighand->siglock == NULL.

However, we can't change send_group_sigqueue() to check p->signal != NULL, because sys_timer_create() does get_task_struct() only in SIGEV_THREAD_ID case. So it is possible that this task_struct was already freed and we can't trust p->signal.

This patch changes de_thread() so that leader released after exit_itimers() call.

---
 fs/exec.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
fs/exec.c +7 -3
@@ -593,6 +593,7 @@ static inline int de_thread(struct task_
 	struct signal_struct *sig = tsk->signal;
 	struct sighand_struct *newsighand, *oldsighand = tsk->sighand;
 	spinlock_t *lock = &oldsighand->siglock;
+	struct task_struct *leader = NULL;
 	int count;
 
 	/*
@@ -668,7 +669,7 @@ static inline int de_thread(struct task_
 	 * and to assume its PID:
 	 */
 	if (!thread_group_leader(current)) {
-		struct task_struct *leader = current->group_leader, *parent;
+		struct task_struct *parent;
 		struct dentry *proc_dentry1, *proc_dentry2;
 		unsigned long exit_state, ptrace;
 
@@ -677,6 +678,7 @@ static inline int de_thread(struct task_
 		 * It should already be zombie at this point, most
 		 * of the time.
 		 */
+		leader = current->group_leader;
 		while (leader->exit_state != EXIT_ZOMBIE)
 			yield();
 
@@ -736,7 +738,6 @@ static inline int de_thread(struct task_
 		proc_pid_flush(proc_dentry2);
 
 		BUG_ON(exit_state != EXIT_ZOMBIE);
-		release_task(leader);
         }
 
 	/*
@@ -746,8 +747,11 @@ static inline int de_thread(struct task_
 	sig->flags = 0;
 
 no_thread_group:
-	BUG_ON(atomic_read(&sig->count) != 1);
 	exit_itimers(sig);
+	if (leader)
+		release_task(leader);
+
+	BUG_ON(atomic_read(&sig->count) != 1);
 
 	if (atomic_read(&oldsighand->count) == 1) {
 		/*

--

author
#10 lore raw

PATCH 10/11 ipvs: fix connection leak if expire_nodest_conn=1

In reply to Greg KH

From: Julian Anastasov <[email protected]>

There was a fix in 2.6.13 that changed the behaviour of ip_vs_conn_expire_now function not to put reference to connection, its callers should hold write lock or connection refcnt. But we forgot to convert one caller, when the real server for connection is unavailable caller should put the connection reference. It happens only when sysctl var expire_nodest_conn is set to 1 and such connections never expire. Thanks to Roberto Nibali who found the problem and tested a 2.4.32-rc2 patch, which is equal to this 2.6 version.

---
 net/ipv4/ipvs/ip_vs_core.c |    7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)
net/ipv4/ipvs/ip_vs_core.c +3 -4
@@ -1009,11 +1009,10 @@ ip_vs_in(unsigned int hooknum, struct sk
 		if (sysctl_ip_vs_expire_nodest_conn) {
 			/* try to expire the connection immediately */
 			ip_vs_conn_expire_now(cp);
-		} else {
-			/* don't restart its timer, and silently
-			   drop the packet. */
-			__ip_vs_conn_put(cp);
 		}
+		/* don't restart its timer, and silently
+		   drop the packet. */
+		__ip_vs_conn_put(cp);
 		return NF_DROP;
 	}
 

--

author
#11 lore raw

PATCH 11/11 fix alpha breakage

In reply to Greg KH

From: Ivan Kokshaysky <[email protected]>

barrier.h uses barrier() in non-SMP case. And doesn't include compiler.h.

---
 include/asm-alpha/barrier.h |    2 ++
 1 file changed, 2 insertions(+)
include/asm-alpha/barrier.h +2 -0
@@ -1,6 +1,8 @@
 #ifndef __BARRIER_H
 #define __BARRIER_H
 
+#include <asm/compiler.h>
+
 #define mb() \
 __asm__ __volatile__("mb": : :"memory")
 

--

author
#12 lore raw
In reply to Greg KH
Quoted 2 lines · Greg KH

Responses should be made by Saturday, November 12, 18:00:00 UTC Anything received after that time, might be too late.

In talking it over with others, this seems like a bit long. How about Friday, November 11, 06:00:00 UTC instead? Any objections?

thanks,

greg k-h

#13 lore raw
Quoted 6 lines · Greg KH
Quoted 2 lines · Greg KH

Responses should be made by Saturday, November 12, 18:00:00 UTC Anything received after that time, might be too late.

In talking it over with others, this seems like a bit long. How about Friday, November 11, 06:00:00 UTC instead? Any objections?

That only gives basically part of today and tomorrow, some people might have trouble getting round to checking within that time. I personally sometimes get upto 2 days behind on lkml even when i'm online.

#14 lore raw
In reply to Greg KH
Quoted 6 lines · * Greg KH ([email protected]) wrote:
Quoted 2 lines · Greg KH

Responses should be made by Saturday, November 12, 18:00:00 UTC Anything received after that time, might be too late.

In talking it over with others, this seems like a bit long. How about Friday, November 11, 06:00:00 UTC instead? Any objections?

None here, it's preferable.

author
#15 lore raw

cover - stable review

This is the start of the stable review cycle for the 2.6.14.2 release. There are 11 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a signed-off-by: line to the patch, please respond with it.

These patches are sent out with a number of different people on the Cc:
line. If you wish to be a reviewer, please email [email protected] to add your name to the list. If you want to be off the reviewer list, also email us.

Responses should be made by Saturday, November 12, 18:00:00 UTC Anything received after that time, might be too late.

thanks,

the -stable release team

author
#16 lore raw

PATCH 1/11 prism54 : Fix frame length

From: Roger While <[email protected]>

prism54 is leaking information when passing transmits to the firmware. There is no requirement to adjust the length to >= ETH_ZLEN. Just pass the skb length (after possible adjustment).

---
 drivers/net/wireless/prism54/islpci_eth.c |    7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/net/wireless/prism54/islpci_eth.c +1 -6
@@ -97,12 +97,6 @@ islpci_eth_transmit(struct sk_buff *skb,
 	/* lock the driver code */
 	spin_lock_irqsave(&priv->slock, flags);
 
-	/* determine the amount of fragments needed to store the frame */
-
-	frame_size = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
-	if (init_wds)
-		frame_size += 6;
-
 	/* check whether the destination queue has enough fragments for the frame */
 	curr_frag = le32_to_cpu(cb->driver_curr_frag[ISL38XX_CB_TX_DATA_LQ]);
 	if (unlikely(curr_frag - priv->free_data_tx >= ISL38XX_CB_TX_QSIZE)) {
@@ -213,6 +207,7 @@ islpci_eth_transmit(struct sk_buff *skb,
 	/* store the skb address for future freeing  */
 	priv->data_low_tx[index] = skb;
 	/* set the proper fragment start address and size information */
+	frame_size = skb->len;
 	fragment->size = cpu_to_le16(frame_size);
 	fragment->flags = cpu_to_le16(0);	/* set to 1 if more fragments */
 	fragment->address = cpu_to_le32(pci_map_address);

--

author
#17 lore raw

PATCH 2/11 fix XFS_QUOTA for modular XFS

In reply to Greg KH

From: Dimitri Puzin <[email protected]>

This patch by Dimitri Puzin submitted through kernel Bugzilla #5514 fixes the following issue:

Cannot build XFS filesystem support as module with quota support. It works only when the XFS filesystem support is compiled into the kernel. Menuconfig prevents from setting CONFIG_XFS_FS=m and CONFIG_XFS_QUOTA=y.

How to reproduce: configure the XFS filesystem with quota support as module. The resulting kernel won't have quota support compiled into xfs.ko.

Fix: Changing the fs/xfs/Kconfig file from tristate to bool lets you configure the quota support to be compiled into the XFS module. The Makefile-linux-2.6 checks only for CONFIG_XFS_QUOTA=y.

---
 fs/xfs/Kconfig |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/xfs/Kconfig +1 -1
@@ -24,7 +24,7 @@ config XFS_EXPORT
 	default y
 
 config XFS_QUOTA
-	tristate "XFS Quota support"
+	bool "XFS Quota support"
 	depends on XFS_FS
 	help
 	  If you say Y here, you will be able to set limits for disk usage on

--

author
#18 lore raw

PATCH 3/11 Oops on suspend after on-the-fly switch to anticipatory i/o scheduler - PowerBook5, 4

In reply to Greg KH

From: Jens Axboe <[email protected]>

Quoted 27 lines · Paul Collins

I boot with elevator=cfq (wanted to try the ionice stuff, never got around to it). Having decided to go back to the anticipatory scheduler, I did the following:

# echo anticipatory > /sys/block/hda/queue/scheduler
# echo anticipatory > /sys/block/hdc/queue/scheduler

A while later I did 'sudo snooze', which produced the Oops below.

Booting with elevator=as and then changing to cfq, sleep works fine. But if I resume and change back to anticipatory I get a similar Oops on the next 'sudo snooze'.

 Oops: kernel access of bad area, sig: 11 [#1]
 NIP: C01E1948 LR: C01D6A60 SP: EFBC5C20 REGS: efbc5b70 TRAP: 0300    

Not tainted
MSR: 00001032 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11
DAR: 00000020, DSISR: 40000000
TASK = efb012c0[1213] 'pmud' THREAD: efbc4000
Last syscall: 54 GPR00: 00080000 EFBC5C20 EFB012C0 EFE9E044
EFBC5CE8 00000002 00000000 C03B0000 GPR08: C046E5D8 00000000
C03B47C8 E6A58360 22042422 1001E4DC 10010000 10000000 GPR16:
10000000 10000000 10000000 7FE4EB40 10000000 10000000 10010000
C0400000 GPR24: C0380000 00000002 00000002 C046E0C0 00000000
00000002 00000000 EFBC5CE8 NIP [c01e1948] as_insert_request+0xa8/0x6b0
LR [c01d6a60] __elv_add_request+0xa0/0x100

Quoted 12 lines
 Call trace:
  [c01d6a60] __elv_add_request+0xa0/0x100
  [c01ffb84] ide_do_drive_cmd+0xb4/0x190
  [c01fc1c0] generic_ide_suspend+0x80/0xa0
  [c01d4574] suspend_device+0x104/0x160
  [c01d47c0] device_suspend+0x120/0x330
  [c03f3b50] pmac_suspend_devices+0x50/0x1b0
  [c03f4294] pmu_ioctl+0x344/0x9b0
  [c0082aa4] do_ioctl+0x84/0x90
  [c0082b3c] vfs_ioctl+0x8c/0x460
  [c0082f50] sys_ioctl+0x40/0x80
  [c0004850] ret_from_syscall+0x0/0x4c

Don't clear ->elevator_data on exit, if we are switching queues we are overwriting the data of the new io scheduler.

---
 drivers/block/cfq-iosched.c |    4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/block/cfq-iosched.c +1 -3
@@ -2260,10 +2260,8 @@ static void cfq_put_cfqd(struct cfq_data
 	if (!atomic_dec_and_test(&cfqd->ref))
 		return;
 
-	blk_put_queue(q);
-
 	cfq_shutdown_timer_wq(cfqd);
-	q->elevator->elevator_data = NULL;
+	blk_put_queue(q);
 
 	mempool_destroy(cfqd->crq_pool);
 	kfree(cfqd->crq_hash);

--

author
#19 lore raw

PATCH 4/11 USB: always export interface information for modalias

In reply to Greg KH

From: Greg Kroah-Hartman <[email protected]>

This fixes a problem with some cdc acm devices that were not getting automatically loaded as the module alias was not being reported properly.

This check was for back in the days when we only reported hotplug events for the main usb device, not the interfaces. We should always give the interface information for MODALIAS/modalias as it can be needed.

---
 drivers/usb/core/sysfs.c |   33 +++++++++---------------
 drivers/usb/core/usb.c   |   63 +++++++++++++++++------------------------------
 2 files changed, 36 insertions(+), 60 deletions(-)
drivers/usb/core/sysfs.c +13 -20
@@ -292,30 +292,23 @@ static ssize_t show_modalias(struct devi
 {
 	struct usb_interface *intf;
 	struct usb_device *udev;
-	int len;
+	struct usb_host_interface *alt;
 
 	intf = to_usb_interface(dev);
 	udev = interface_to_usbdev(intf);
+	alt = intf->cur_altsetting;
 
-	len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic",
-			       le16_to_cpu(udev->descriptor.idVendor),
-			       le16_to_cpu(udev->descriptor.idProduct),
-			       le16_to_cpu(udev->descriptor.bcdDevice),
-			       udev->descriptor.bDeviceClass,
-			       udev->descriptor.bDeviceSubClass,
-			       udev->descriptor.bDeviceProtocol);
-	buf += len;
-
-	if (udev->descriptor.bDeviceClass == 0) {
-		struct usb_host_interface *alt = intf->cur_altsetting;
-
-		return len + sprintf(buf, "%02Xisc%02Xip%02X\n",
-			       alt->desc.bInterfaceClass,
-			       alt->desc.bInterfaceSubClass,
-			       alt->desc.bInterfaceProtocol);
- 	} else {
-		return len + sprintf(buf, "*isc*ip*\n");
-	}
+	return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
+			"ic%02Xisc%02Xip%02X\n",
+			le16_to_cpu(udev->descriptor.idVendor),
+			le16_to_cpu(udev->descriptor.idProduct),
+			le16_to_cpu(udev->descriptor.bcdDevice),
+			udev->descriptor.bDeviceClass,
+			udev->descriptor.bDeviceSubClass,
+			udev->descriptor.bDeviceProtocol,
+			alt->desc.bInterfaceClass,
+			alt->desc.bInterfaceSubClass,
+			alt->desc.bInterfaceProtocol);
 }
 static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);
 
drivers/usb/core/usb.c +23 -40

82 lines not on this page · raw message

--

author
#20 lore raw

PATCH 5/11 tcp: BIC max increment too large

In reply to Greg KH

From: Stephen Hemminger <[email protected]>

The max growth of BIC TCP is too large. Original code was based on BIC 1.0 and the default there was 32. Later code (2.6.13) included compensation for delayed acks, and should have reduced the default value to 16; since normally TCP gets one ack for every two packets sent.

The current value of 32 makes BIC too aggressive and unfair to other flows.

---
 net/ipv4/tcp_bic.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_bic.c +1 -1
@@ -27,7 +27,7 @@
 					  */
 
 static int fast_convergence = 1;
-static int max_increment = 32;
+static int max_increment = 16;
 static int low_window = 14;
 static int beta = 819;		/* = 819/1024 (BICTCP_BETA_SCALE) */
 static int low_utilization_threshold = 153;

--

author
#21 lore raw

PATCH 6/11 airo.c/airo_cs.c: correct prototypes

In reply to Greg KH

From: Adrian Bunk <[email protected]>

This patch creates a file airo.h containing prototypes of the global functions in airo.c used by airo_cs.c .

If you got strange problems with either airo_cs devices or in any other completely unrelated part of the kernel shortly or long after a airo_cs device was detected by the kernel, this might have been caused by the fact that caller and callee disagreed regarding the size of the first argument to init_airo_card()...

---
 drivers/net/wireless/airo.c    |    2 ++
 drivers/net/wireless/airo.h    |    9 +++++++++
 drivers/net/wireless/airo_cs.c |    6 ++----
 3 files changed, 13 insertions(+), 4 deletions(-)
drivers/net/wireless/airo.h new file +9 -0
@@ -0,0 +1,9 @@
+#ifndef _AIRO_H_
+#define _AIRO_H_
+
+struct net_device *init_airo_card(unsigned short irq, int port, int is_pcmcia,
+				  struct device *dmdev);
+int reset_airo_card(struct net_device *dev);
+void stop_airo_card(struct net_device *dev, int freeres);
+
+#endif  /*  _AIRO_H_  */
drivers/net/wireless/airo.c +2 -0
@@ -46,6 +46,8 @@
 #include <linux/pci.h>
 #include <asm/uaccess.h>
 
+#include "airo.h"
+
 #ifdef CONFIG_PCI
 static struct pci_device_id card_ids[] = {
 	{ 0x14b9, 1, PCI_ANY_ID, PCI_ANY_ID, },
drivers/net/wireless/airo_cs.c +2 -4
@@ -42,6 +42,8 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
+#include "airo.h"
+
 /*
    All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
    you do not define PCMCIA_DEBUG at all, all the debug code will be
@@ -78,10 +80,6 @@ MODULE_SUPPORTED_DEVICE("Aironet 4500, 4
    event handler. 
 */
 
-struct net_device *init_airo_card( int, int, int, struct device * );
-void stop_airo_card( struct net_device *, int );
-int reset_airo_card( struct net_device * );
-
 static void airo_config(dev_link_t *link);
 static void airo_release(dev_link_t *link);
 static int airo_event(event_t event, int priority,

--

author
#22 lore raw

PATCH 7/11 NET: Fix zero-size datagram reception

In reply to Greg KH

From: Herbert Xu <[email protected]>

The recent rewrite of skb_copy_datagram_iovec broke the reception of zero-size datagrams. This patch fixes it.

---
 net/core/datagram.c |    4 ++++
 1 file changed, 4 insertions(+)
net/core/datagram.c +4 -0
@@ -213,6 +213,10 @@ int skb_copy_datagram_iovec(const struct
 {
 	int i, err, fraglen, end = 0;
 	struct sk_buff *next = skb_shinfo(skb)->frag_list;
+
+	if (!len)
+		return 0;
+
 next_skb:
 	fraglen = skb_headlen(skb);
 	i = -1;

--

author
#23 lore raw

PATCH 8/11 - fix signal->live leak in copy_process()

In reply to Greg KH

From: Oleg Nesterov <[email protected]>

exit_signal() (called from copy_process's error path) should decrement ->signal->live, otherwise forking process will miss 'group_dead' in do_exit().

---
 kernel/signal.c |    2 ++
 1 file changed, 2 insertions(+)
kernel/signal.c +2 -0
@@ -406,6 +406,8 @@ void __exit_signal(struct task_struct *t
 
 void exit_signal(struct task_struct *tsk)
 {
+	atomic_dec(&tsk->signal->live);
+
 	write_lock_irq(&tasklist_lock);
 	__exit_signal(tsk);
 	write_unlock_irq(&tasklist_lock);

--

author
#24 lore raw

PATCH 9/11 fix de_thread() vs send_group_sigqueue() race

In reply to Greg KH

From: Oleg Nesterov <[email protected]>

When non-leader thread does exec, de_thread calls release_task(leader) before calling exit_itimers(). If local timer interrupt happens in between, it can oops in send_group_sigqueue() while taking ->sighand->siglock == NULL.

However, we can't change send_group_sigqueue() to check p->signal != NULL, because sys_timer_create() does get_task_struct() only in SIGEV_THREAD_ID case. So it is possible that this task_struct was already freed and we can't trust p->signal.

This patch changes de_thread() so that leader released after exit_itimers() call.

---
 fs/exec.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
fs/exec.c +7 -3
@@ -593,6 +593,7 @@ static inline int de_thread(struct task_
 	struct signal_struct *sig = tsk->signal;
 	struct sighand_struct *newsighand, *oldsighand = tsk->sighand;
 	spinlock_t *lock = &oldsighand->siglock;
+	struct task_struct *leader = NULL;
 	int count;
 
 	/*
@@ -668,7 +669,7 @@ static inline int de_thread(struct task_
 	 * and to assume its PID:
 	 */
 	if (!thread_group_leader(current)) {
-		struct task_struct *leader = current->group_leader, *parent;
+		struct task_struct *parent;
 		struct dentry *proc_dentry1, *proc_dentry2;
 		unsigned long exit_state, ptrace;
 
@@ -677,6 +678,7 @@ static inline int de_thread(struct task_
 		 * It should already be zombie at this point, most
 		 * of the time.
 		 */
+		leader = current->group_leader;
 		while (leader->exit_state != EXIT_ZOMBIE)
 			yield();
 
@@ -736,7 +738,6 @@ static inline int de_thread(struct task_
 		proc_pid_flush(proc_dentry2);
 
 		BUG_ON(exit_state != EXIT_ZOMBIE);
-		release_task(leader);
         }
 
 	/*
@@ -746,8 +747,11 @@ static inline int de_thread(struct task_
 	sig->flags = 0;
 
 no_thread_group:
-	BUG_ON(atomic_read(&sig->count) != 1);
 	exit_itimers(sig);
+	if (leader)
+		release_task(leader);
+
+	BUG_ON(atomic_read(&sig->count) != 1);
 
 	if (atomic_read(&oldsighand->count) == 1) {
 		/*

--

author
#25 lore raw

PATCH 10/11 ipvs: fix connection leak if expire_nodest_conn=1

In reply to Greg KH

From: Julian Anastasov <[email protected]>

There was a fix in 2.6.13 that changed the behaviour of ip_vs_conn_expire_now function not to put reference to connection, its callers should hold write lock or connection refcnt. But we forgot to convert one caller, when the real server for connection is unavailable caller should put the connection reference. It happens only when sysctl var expire_nodest_conn is set to 1 and such connections never expire. Thanks to Roberto Nibali who found the problem and tested a 2.4.32-rc2 patch, which is equal to this 2.6 version.

---
 net/ipv4/ipvs/ip_vs_core.c |    7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)
net/ipv4/ipvs/ip_vs_core.c +3 -4
@@ -1009,11 +1009,10 @@ ip_vs_in(unsigned int hooknum, struct sk
 		if (sysctl_ip_vs_expire_nodest_conn) {
 			/* try to expire the connection immediately */
 			ip_vs_conn_expire_now(cp);
-		} else {
-			/* don't restart its timer, and silently
-			   drop the packet. */
-			__ip_vs_conn_put(cp);
 		}
+		/* don't restart its timer, and silently
+		   drop the packet. */
+		__ip_vs_conn_put(cp);
 		return NF_DROP;
 	}
 

--

author
#26 lore raw

PATCH 11/11 fix alpha breakage

In reply to Greg KH

From: Ivan Kokshaysky <[email protected]>

barrier.h uses barrier() in non-SMP case. And doesn't include compiler.h.

---
 include/asm-alpha/barrier.h |    2 ++
 1 file changed, 2 insertions(+)
include/asm-alpha/barrier.h +2 -0
@@ -1,6 +1,8 @@
 #ifndef __BARRIER_H
 #define __BARRIER_H
 
+#include <asm/compiler.h>
+
 #define mb() \
 __asm__ __volatile__("mb": : :"memory")
 

--

#27 lore raw
In reply to Greg KH
Quoted 1 line · Greg KH

This is the start of the stable review cycle for the 2.6.14.2 release.

Bah, that's what I get for eating too many cookies instead of lunch... The real announcement will go out next, sorry about that...

greg k-h