[kernel] r9629 - in dists/sid/linux-2.6/debian: . patches/bugfix patches/series

Maximilian Attems maks at alioth.debian.org
Wed Oct 10 21:35:01 UTC 2007


Author: maks
Date: Wed Oct 10 21:35:01 2007
New Revision: 9629

Log:
add stable 2.6.22.10


Added:
   dists/sid/linux-2.6/debian/patches/bugfix/2.6.22.10
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/5

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	(original)
+++ dists/sid/linux-2.6/debian/changelog	Wed Oct 10 21:35:01 2007
@@ -86,6 +86,21 @@
     - Fix ipv6 double-sock-release with MSG_CONFIRM
     - ACPI: Validate XSDT, use RSDT if XSDT fails
   * Update vserver patch to 2.2.0.4.
+  * Add stable release 2.6.22.10:
+    - i386: Use global flag to disable broken local apic timer on AMD CPUs.
+    - Fix timer_stats printout of events/sec
+    - libata: update drive blacklists
+    - i2c-algo-bit: Read block data bugfix
+    - scsi_transport_spi: fix domain validation failure from incorrect width
+      setting
+    - Fix SMP poweroff hangs
+    - Fix ppp_mppe kernel stack usage.
+    - sky2: reduce impact of watchdog timer
+    - sky2: fix VLAN receive processing
+    - sky2: fix transmit state on resume
+    - SELinux: clear parent death signal on SID transitions
+    - NLM: Fix a circular lock dependency in lockd
+    - NLM: Fix a memory leak in nlmsvc_testlock
 
   [ Martin Michlmayr ]
   * [mips] Add a fix so qemu NE2000 will work again.
@@ -106,7 +121,7 @@
   [ dann frazier ]
   * [ia64] Re-enable various unintentionally disabled config options
 
- -- dann frazier <dannf at debian.org>  Tue, 09 Oct 2007 13:53:17 -0600
+ -- maximilian attems <maks at debian.org>  Wed, 10 Oct 2007 23:32:02 +0200
 
 linux-2.6 (2.6.22-4) unstable; urgency=low
 

Added: dists/sid/linux-2.6/debian/patches/bugfix/2.6.22.10
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/2.6.22.10	Wed Oct 10 21:35:01 2007
@@ -0,0 +1,683 @@
+diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
+index 67824f3..a8ceb7a 100644
+--- a/arch/i386/kernel/apic.c
++++ b/arch/i386/kernel/apic.c
+@@ -61,8 +61,9 @@ static int enable_local_apic __initdata = 0;
+ 
+ /* Local APIC timer verification ok */
+ static int local_apic_timer_verify_ok;
+-/* Disable local APIC timer from the kernel commandline or via dmi quirk */
+-static int local_apic_timer_disabled;
++/* Disable local APIC timer from the kernel commandline or via dmi quirk
++   or using CPU MSR check */
++int local_apic_timer_disabled;
+ /* Local APIC timer works in C2 */
+ int local_apic_timer_c2_ok;
+ EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok);
+@@ -367,12 +368,9 @@ void __init setup_boot_APIC_clock(void)
+ 	long delta, deltapm;
+ 	int pm_referenced = 0;
+ 
+-	if (boot_cpu_has(X86_FEATURE_LAPIC_TIMER_BROKEN))
+-		local_apic_timer_disabled = 1;
+-
+ 	/*
+ 	 * The local apic timer can be disabled via the kernel
+-	 * commandline or from the test above. Register the lapic
++	 * commandline or from the CPU detection code. Register the lapic
+ 	 * timer as a dummy clock event source on SMP systems, so the
+ 	 * broadcast mechanism is used. On UP systems simply ignore it.
+ 	 */
+diff --git a/arch/i386/kernel/cpu/amd.c b/arch/i386/kernel/cpu/amd.c
+index 6f47eee..9d23390 100644
+--- a/arch/i386/kernel/cpu/amd.c
++++ b/arch/i386/kernel/cpu/amd.c
+@@ -3,6 +3,7 @@
+ #include <linux/mm.h>
+ #include <asm/io.h>
+ #include <asm/processor.h>
++#include <asm/apic.h>
+ 
+ #include "cpu.h"
+ 
+@@ -22,6 +23,7 @@
+ extern void vide(void);
+ __asm__(".align 4\nvide: ret");
+ 
++#ifdef CONFIG_X86_LOCAL_APIC
+ #define ENABLE_C1E_MASK         0x18000000
+ #define CPUID_PROCESSOR_SIGNATURE       1
+ #define CPUID_XFAM              0x0ff00000
+@@ -52,6 +54,7 @@ static __cpuinit int amd_apic_timer_broken(void)
+         }
+ 	return 0;
+ }
++#endif
+ 
+ int force_mwait __cpuinitdata;
+ 
+@@ -275,8 +278,10 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
+ 	if (cpuid_eax(0x80000000) >= 0x80000006)
+ 		num_cache_leaves = 3;
+ 
++#ifdef CONFIG_X86_LOCAL_APIC
+ 	if (amd_apic_timer_broken())
+-		set_bit(X86_FEATURE_LAPIC_TIMER_BROKEN, c->x86_capability);
++		local_apic_timer_disabled = 1;
++#endif
+ 
+ 	if (c->x86 == 0x10 && !force_mwait)
+ 		clear_bit(X86_FEATURE_MWAIT, c->x86_capability);
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 9ad8caf..e6e403f 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -3774,6 +3774,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
+ 	{ "SAMSUNG CD-ROM SN-124","N001",	ATA_HORKAGE_NODMA },
+ 	{ "Seagate STT20000A", NULL,		ATA_HORKAGE_NODMA },
+ 	{ "IOMEGA  ZIP 250       ATAPI", NULL,	ATA_HORKAGE_NODMA }, /* temporary fix */
++	{ "IOMEGA  ZIP 250       ATAPI       Floppy",
++				NULL,		ATA_HORKAGE_NODMA },
+ 
+ 	/* Weird ATAPI devices */
+ 	{ "TORiSAN DVD-ROM DRD-N216", NULL,	ATA_HORKAGE_MAX_SEC_128 },
+@@ -3787,7 +3789,13 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
+ 	{ "FUJITSU MHT2060BH",	NULL,		ATA_HORKAGE_NONCQ },
+ 	/* NCQ is broken */
+ 	{ "Maxtor 6L250S0",     "BANC1G10",     ATA_HORKAGE_NONCQ },
++	{ "Maxtor 6B200M0",	"BANC1BM0",	ATA_HORKAGE_NONCQ },
+ 	{ "Maxtor 6B200M0",	"BANC1B10",	ATA_HORKAGE_NONCQ },
++	{ "Maxtor 7B250S0",	"BANC1B70",	ATA_HORKAGE_NONCQ, },
++	{ "Maxtor 7B300S0",	"BANC1B70",	ATA_HORKAGE_NONCQ },
++	{ "Maxtor 7V300F0",	"VA111630",	ATA_HORKAGE_NONCQ },
++	{ "HITACHI HDS7250SASUN500G 0621KTAWSD", "K2AOAJ0AHITACHI",
++	 ATA_HORKAGE_NONCQ },
+ 	/* NCQ hard hangs device under heavier load, needs hard power cycle */
+ 	{ "Maxtor 6B250S0",	"BANC1B70",	ATA_HORKAGE_NONCQ },
+ 	/* Blacklist entries taken from Silicon Image 3124/3132
+@@ -3801,8 +3809,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
+ 	{ "Hitachi HTS541616J9SA00", "SB4OC70P", ATA_HORKAGE_NONCQ, },
+ 	{ "WDC WD740ADFD-00NLR1", NULL,		ATA_HORKAGE_NONCQ, },
+ 	{ "FUJITSU MHV2080BH",	"00840028",	ATA_HORKAGE_NONCQ, },
+-
+-	/* Devices with NCQ limits */
++	{ "ST9160821AS",	"3.CLF",	ATA_HORKAGE_NONCQ, },
++	{ "ST3160812AS",	"3.AD",		ATA_HORKAGE_NONCQ, },
++	{ "SAMSUNG HD401LJ",	"ZZ100-15",	ATA_HORKAGE_NONCQ, },
+ 
+ 	/* End Marker */
+ 	{ }
+diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
+index 8a5f582..7f0a0a6 100644
+--- a/drivers/i2c/algos/i2c-algo-bit.c
++++ b/drivers/i2c/algos/i2c-algo-bit.c
+@@ -357,13 +357,29 @@ static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+ 	return wrcount;
+ }
+ 
++static int acknak(struct i2c_adapter *i2c_adap, int is_ack)
++{
++	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
++
++	/* assert: sda is high */
++	if (is_ack)		/* send ack */
++		setsda(adap, 0);
++	udelay((adap->udelay + 1) / 2);
++	if (sclhi(adap) < 0) {	/* timeout */
++		dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n");
++		return -ETIMEDOUT;
++	}
++	scllo(adap);
++	return 0;
++}
++
+ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+ {
+ 	int inval;
+ 	int rdcount=0;   	/* counts bytes read */
+-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+ 	unsigned char *temp = msg->buf;
+ 	int count = msg->len;
++	const unsigned flags = msg->flags;
+ 
+ 	while (count > 0) {
+ 		inval = i2c_inb(i2c_adap);
+@@ -377,28 +393,12 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+ 		temp++;
+ 		count--;
+ 
+-		if (msg->flags & I2C_M_NO_RD_ACK) {
+-			bit_dbg(2, &i2c_adap->dev, "i2c_inb: 0x%02x\n",
+-				inval);
+-			continue;
+-		}
+-
+-		/* assert: sda is high */
+-		if (count)		/* send ack */
+-			setsda(adap, 0);
+-		udelay((adap->udelay + 1) / 2);
+-		bit_dbg(2, &i2c_adap->dev, "i2c_inb: 0x%02x %s\n", inval,
+-			count ? "A" : "NA");
+-		if (sclhi(adap)<0) {	/* timeout */
+-			dev_err(&i2c_adap->dev, "readbytes: timeout at ack\n");
+-			return -ETIMEDOUT;
+-		};
+-		scllo(adap);
+-
+ 		/* Some SMBus transactions require that we receive the
+ 		   transaction length as the first read byte. */
+-		if (rdcount == 1 && (msg->flags & I2C_M_RECV_LEN)) {
++		if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) {
+ 			if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) {
++				if (!(flags & I2C_M_NO_RD_ACK))
++					acknak(i2c_adap, 0);
+ 				dev_err(&i2c_adap->dev, "readbytes: invalid "
+ 					"block length (%d)\n", inval);
+ 				return -EREMOTEIO;
+@@ -409,6 +409,18 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+ 			count += inval;
+ 			msg->len += inval;
+ 		}
++
++		bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n",
++			inval,
++			(flags & I2C_M_NO_RD_ACK)
++				? "(no ack/nak)"
++				: (count ? "A" : "NA"));
++
++		if (!(flags & I2C_M_NO_RD_ACK)) {
++			inval = acknak(i2c_adap, count);
++			if (inval < 0)
++				return inval;
++		}
+ 	}
+ 	return rdcount;
+ }
+diff --git a/drivers/net/ppp_mppe.c b/drivers/net/ppp_mppe.c
+index d5bdd25..39e0e12 100644
+--- a/drivers/net/ppp_mppe.c
++++ b/drivers/net/ppp_mppe.c
+@@ -136,7 +136,7 @@ struct ppp_mppe_state {
+  * Key Derivation, from RFC 3078, RFC 3079.
+  * Equivalent to Get_Key() for MS-CHAP as described in RFC 3079.
+  */
+-static void get_new_key_from_sha(struct ppp_mppe_state * state, unsigned char *InterimKey)
++static void get_new_key_from_sha(struct ppp_mppe_state * state)
+ {
+ 	struct hash_desc desc;
+ 	struct scatterlist sg[4];
+@@ -153,8 +153,6 @@ static void get_new_key_from_sha(struct ppp_mppe_state * state, unsigned char *I
+ 	desc.flags = 0;
+ 
+ 	crypto_hash_digest(&desc, sg, nbytes, state->sha1_digest);
+-
+-	memcpy(InterimKey, state->sha1_digest, state->keylen);
+ }
+ 
+ /*
+@@ -163,21 +161,21 @@ static void get_new_key_from_sha(struct ppp_mppe_state * state, unsigned char *I
+  */
+ static void mppe_rekey(struct ppp_mppe_state * state, int initial_key)
+ {
+-	unsigned char InterimKey[MPPE_MAX_KEY_LEN];
+ 	struct scatterlist sg_in[1], sg_out[1];
+ 	struct blkcipher_desc desc = { .tfm = state->arc4 };
+ 
+-	get_new_key_from_sha(state, InterimKey);
++	get_new_key_from_sha(state);
+ 	if (!initial_key) {
+-		crypto_blkcipher_setkey(state->arc4, InterimKey, state->keylen);
+-		setup_sg(sg_in, InterimKey, state->keylen);
++		crypto_blkcipher_setkey(state->arc4, state->sha1_digest,
++					state->keylen);
++		setup_sg(sg_in, state->sha1_digest, state->keylen);
+ 		setup_sg(sg_out, state->session_key, state->keylen);
+ 		if (crypto_blkcipher_encrypt(&desc, sg_out, sg_in,
+ 					     state->keylen) != 0) {
+     		    printk(KERN_WARNING "mppe_rekey: cipher_encrypt failed\n");
+ 		}
+ 	} else {
+-		memcpy(state->session_key, InterimKey, state->keylen);
++		memcpy(state->session_key, state->sha1_digest, state->keylen);
+ 	}
+ 	if (state->keylen == 8) {
+ 		/* See RFC 3078 */
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index 2e76c4a..607b1a3 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -96,10 +96,6 @@ static int disable_msi = 0;
+ module_param(disable_msi, int, 0);
+ MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
+ 
+-static int idle_timeout = 100;
+-module_param(idle_timeout, int, 0);
+-MODULE_PARM_DESC(idle_timeout, "Watchdog timer for lost interrupts (ms)");
+-
+ static const struct pci_device_id sky2_id_table[] = {
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, /* SK-9Sxx */
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, /* SK-9Exx */
+@@ -835,6 +831,20 @@ static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2)
+ 	return le;
+ }
+ 
++static void tx_init(struct sky2_port *sky2)
++{
++	struct sky2_tx_le *le;
++
++	sky2->tx_prod = sky2->tx_cons = 0;
++	sky2->tx_tcpsum = 0;
++	sky2->tx_last_mss = 0;
++
++	le = get_tx_le(sky2);
++	le->addr = 0;
++	le->opcode = OP_ADDR64 | HW_OWNER;
++	sky2->tx_addr64 = 0;
++}
++
+ static inline struct tx_ring_info *tx_le_re(struct sky2_port *sky2,
+ 					    struct sky2_tx_le *le)
+ {
+@@ -1248,7 +1258,8 @@ static int sky2_up(struct net_device *dev)
+ 				GFP_KERNEL);
+ 	if (!sky2->tx_ring)
+ 		goto err_out;
+-	sky2->tx_prod = sky2->tx_cons = 0;
++
++	tx_init(sky2);
+ 
+ 	sky2->rx_le = pci_alloc_consistent(hw->pdev, RX_LE_BYTES,
+ 					   &sky2->rx_le_map);
+@@ -1693,6 +1704,8 @@ static void sky2_link_up(struct sky2_port *sky2)
+ 
+ 	netif_carrier_on(sky2->netdev);
+ 
++	mod_timer(&hw->watchdog_timer, jiffies + 1);
++
+ 	/* Turn on link LED */
+ 	sky2_write8(hw, SK_REG(port, LNK_LED_REG),
+ 		    LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF);
+@@ -2051,6 +2064,7 @@ static struct sk_buff *sky2_receive(struct net_device *dev,
+  	struct sky2_port *sky2 = netdev_priv(dev);
+ 	struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next;
+ 	struct sk_buff *skb = NULL;
++	u16 count;
+ 
+ 	if (unlikely(netif_msg_rx_status(sky2)))
+ 		printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n",
+@@ -2065,7 +2079,13 @@ static struct sk_buff *sky2_receive(struct net_device *dev,
+ 	if (!(status & GMR_FS_RX_OK))
+ 		goto resubmit;
+ 
+-	if (status >> 16 != length)
++	count = (status & GMR_FS_LEN) >> 16;
++#ifdef SKY2_VLAN_TAG_USED
++	/* Account for vlan tag */
++	if (sky2->vlgrp && (status & GMR_FS_VLAN))
++		count -= VLAN_HLEN;
++#endif
++	if (count != length)
+ 		goto len_mismatch;
+ 
+ 	if (length < copybreak)
+@@ -2384,25 +2404,25 @@ static void sky2_le_error(struct sky2_hw *hw, unsigned port,
+ 	sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_IRQ_CHK);
+ }
+ 
+-/* If idle then force a fake soft NAPI poll once a second
+- * to work around cases where sharing an edge triggered interrupt.
+- */
+-static inline void sky2_idle_start(struct sky2_hw *hw)
+-{
+-	if (idle_timeout > 0)
+-		mod_timer(&hw->idle_timer,
+-			  jiffies + msecs_to_jiffies(idle_timeout));
+-}
+-
+-static void sky2_idle(unsigned long arg)
++/* Force a fake soft NAPI poll to handle lost IRQ's */
++static void sky2_watchdog(unsigned long arg)
+ {
+ 	struct sky2_hw *hw = (struct sky2_hw *) arg;
+ 	struct net_device *dev = hw->dev[0];
++	int i, active = 0;
+ 
+ 	if (__netif_rx_schedule_prep(dev))
+ 		__netif_rx_schedule(dev);
+ 
+-	mod_timer(&hw->idle_timer, jiffies + msecs_to_jiffies(idle_timeout));
++	for (i = 0; i < hw->ports; i++) {
++		dev = hw->dev[i];
++		if (!netif_running(dev))
++			continue;
++		++active;
++	}
++
++	if (active)
++		mod_timer(&hw->watchdog_timer, round_jiffies(jiffies + HZ));
+ }
+ 
+ /* Hardware/software error handling */
+@@ -2692,8 +2712,6 @@ static void sky2_restart(struct work_struct *work)
+ 
+ 	dev_dbg(&hw->pdev->dev, "restarting\n");
+ 
+-	del_timer_sync(&hw->idle_timer);
+-
+ 	rtnl_lock();
+ 	sky2_write32(hw, B0_IMSK, 0);
+ 	sky2_read32(hw, B0_IMSK);
+@@ -2722,8 +2740,6 @@ static void sky2_restart(struct work_struct *work)
+ 		}
+ 	}
+ 
+-	sky2_idle_start(hw);
+-
+ 	rtnl_unlock();
+ }
+ 
+@@ -3713,11 +3729,9 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+ 			sky2_show_addr(dev1);
+ 	}
+ 
+-	setup_timer(&hw->idle_timer, sky2_idle, (unsigned long) hw);
++	setup_timer(&hw->watchdog_timer, sky2_watchdog, (unsigned long) hw);
+ 	INIT_WORK(&hw->restart_work, sky2_restart);
+ 
+-	sky2_idle_start(hw);
+-
+ 	pci_set_drvdata(pdev, hw);
+ 
+ 	return 0;
+@@ -3752,7 +3766,7 @@ static void __devexit sky2_remove(struct pci_dev *pdev)
+ 	if (!hw)
+ 		return;
+ 
+-	del_timer_sync(&hw->idle_timer);
++	del_timer_sync(&hw->watchdog_timer);
+ 
+ 	flush_scheduled_work();
+ 
+@@ -3796,7 +3810,7 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
+ 	if (!hw)
+ 		return 0;
+ 
+-	del_timer_sync(&hw->idle_timer);
++	del_timer_sync(&hw->watchdog_timer);
+ 	netif_poll_disable(hw->dev[0]);
+ 
+ 	for (i = 0; i < hw->ports; i++) {
+@@ -3862,7 +3876,7 @@ static int sky2_resume(struct pci_dev *pdev)
+ 	}
+ 
+ 	netif_poll_enable(hw->dev[0]);
+-	sky2_idle_start(hw);
++
+ 	return 0;
+ out:
+ 	dev_err(&pdev->dev, "resume failed (%d)\n", err);
+@@ -3879,7 +3893,6 @@ static void sky2_shutdown(struct pci_dev *pdev)
+ 	if (!hw)
+ 		return;
+ 
+-	del_timer_sync(&hw->idle_timer);
+ 	netif_poll_disable(hw->dev[0]);
+ 
+ 	for (i = 0; i < hw->ports; i++) {
+diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
+index b8c4a3b..a059e0a 100644
+--- a/drivers/net/sky2.h
++++ b/drivers/net/sky2.h
+@@ -1921,7 +1921,7 @@ struct sky2_hw {
+ 	u32		     st_idx;
+ 	dma_addr_t   	     st_dma;
+ 
+-	struct timer_list    idle_timer;
++	struct timer_list    watchdog_timer;
+ 	struct work_struct   restart_work;
+ 	int		     msi;
+ 	wait_queue_head_t    msi_wait;
+diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
+index 6f56f87..4df21c9 100644
+--- a/drivers/scsi/scsi_transport_spi.c
++++ b/drivers/scsi/scsi_transport_spi.c
+@@ -787,10 +787,12 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
+ 	struct scsi_target *starget = sdev->sdev_target;
+ 	struct Scsi_Host *shost = sdev->host;
+ 	int len = sdev->inquiry_len;
++	int min_period = spi_min_period(starget);
++	int max_width = spi_max_width(starget);
+ 	/* first set us up for narrow async */
+ 	DV_SET(offset, 0);
+ 	DV_SET(width, 0);
+-	
++
+ 	if (spi_dv_device_compare_inquiry(sdev, buffer, buffer, DV_LOOPS)
+ 	    != SPI_COMPARE_SUCCESS) {
+ 		starget_printk(KERN_ERR, starget, "Domain Validation Initial Inquiry Failed\n");
+@@ -798,9 +800,13 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
+ 		return;
+ 	}
+ 
++	if (!scsi_device_wide(sdev)) {
++		spi_max_width(starget) = 0;
++		max_width = 0;
++	}
++
+ 	/* test width */
+-	if (i->f->set_width && spi_max_width(starget) &&
+-	    scsi_device_wide(sdev)) {
++	if (i->f->set_width && max_width) {
+ 		i->f->set_width(starget, 1);
+ 
+ 		if (spi_dv_device_compare_inquiry(sdev, buffer,
+@@ -809,6 +815,11 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
+ 		    != SPI_COMPARE_SUCCESS) {
+ 			starget_printk(KERN_ERR, starget, "Wide Transfers Fail\n");
+ 			i->f->set_width(starget, 0);
++			/* Make sure we don't force wide back on by asking
++			 * for a transfer period that requires it */
++			max_width = 0;
++			if (min_period < 10)
++				min_period = 10;
+ 		}
+ 	}
+ 
+@@ -828,7 +839,8 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
+ 
+ 	/* now set up to the maximum */
+ 	DV_SET(offset, spi_max_offset(starget));
+-	DV_SET(period, spi_min_period(starget));
++	DV_SET(period, min_period);
++
+ 	/* try QAS requests; this should be harmless to set if the
+ 	 * target supports it */
+ 	if (scsi_device_qas(sdev)) {
+@@ -837,14 +849,14 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
+ 		DV_SET(qas, 0);
+ 	}
+ 
+-	if (scsi_device_ius(sdev) && spi_min_period(starget) < 9) {
++	if (scsi_device_ius(sdev) && min_period < 9) {
+ 		/* This u320 (or u640). Set IU transfers */
+ 		DV_SET(iu, 1);
+ 		/* Then set the optional parameters */
+ 		DV_SET(rd_strm, 1);
+ 		DV_SET(wr_flow, 1);
+ 		DV_SET(rti, 1);
+-		if (spi_min_period(starget) == 8)
++		if (min_period == 8)
+ 			DV_SET(pcomp_en, 1);
+ 	} else {
+ 		DV_SET(iu, 0);
+@@ -862,6 +874,10 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
+ 	} else {
+ 		DV_SET(dt, 1);
+ 	}
++	/* set width last because it will pull all the other
++	 * parameters down to required values */
++	DV_SET(width, max_width);
++
+ 	/* Do the read only INQUIRY tests */
+ 	spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len,
+ 		       spi_dv_device_compare_inquiry);
+diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
+index b3efa45..7b951a2 100644
+--- a/fs/lockd/svclock.c
++++ b/fs/lockd/svclock.c
+@@ -171,19 +171,14 @@ found:
+  * GRANTED_RES message by cookie, without having to rely on the client's IP
+  * address. --okir
+  */
+-static inline struct nlm_block *
+-nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_file *file,
+-		struct nlm_lock *lock, struct nlm_cookie *cookie)
++static struct nlm_block *
++nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_host *host,
++		    struct nlm_file *file, struct nlm_lock *lock,
++		    struct nlm_cookie *cookie)
+ {
+ 	struct nlm_block	*block;
+-	struct nlm_host		*host;
+ 	struct nlm_rqst		*call = NULL;
+ 
+-	/* Create host handle for callback */
+-	host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len);
+-	if (host == NULL)
+-		return NULL;
+-
+ 	call = nlm_alloc_call(host);
+ 	if (call == NULL)
+ 		return NULL;
+@@ -366,6 +361,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
+ 			struct nlm_lock *lock, int wait, struct nlm_cookie *cookie)
+ {
+ 	struct nlm_block	*block = NULL;
++	struct nlm_host		*host;
+ 	int			error;
+ 	__be32			ret;
+ 
+@@ -377,6 +373,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
+ 				(long long)lock->fl.fl_end,
+ 				wait);
+ 
++	/* Create host handle for callback */
++	host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len);
++	if (host == NULL)
++		return nlm_lck_denied_nolocks;
+ 
+ 	/* Lock file against concurrent access */
+ 	mutex_lock(&file->f_mutex);
+@@ -385,7 +385,8 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
+ 	 */
+ 	block = nlmsvc_lookup_block(file, lock);
+ 	if (block == NULL) {
+-		block = nlmsvc_create_block(rqstp, file, lock, cookie);
++		block = nlmsvc_create_block(rqstp, nlm_get_host(host), file,
++				lock, cookie);
+ 		ret = nlm_lck_denied_nolocks;
+ 		if (block == NULL)
+ 			goto out;
+@@ -449,6 +450,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
+ out:
+ 	mutex_unlock(&file->f_mutex);
+ 	nlmsvc_release_block(block);
++	nlm_release_host(host);
+ 	dprintk("lockd: nlmsvc_lock returned %u\n", ret);
+ 	return ret;
+ }
+@@ -477,10 +479,17 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
+ 
+ 	if (block == NULL) {
+ 		struct file_lock *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
++		struct nlm_host	*host;
+ 
+ 		if (conf == NULL)
+ 			return nlm_granted;
+-		block = nlmsvc_create_block(rqstp, file, lock, cookie);
++		/* Create host handle for callback */
++		host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len);
++		if (host == NULL) {
++			kfree(conf);
++			return nlm_lck_denied_nolocks;
++		}
++		block = nlmsvc_create_block(rqstp, host, file, lock, cookie);
+ 		if (block == NULL) {
+ 			kfree(conf);
+ 			return nlm_granted;
+diff --git a/include/asm-i386/apic.h b/include/asm-i386/apic.h
+index 1e8f6f2..4091b33 100644
+--- a/include/asm-i386/apic.h
++++ b/include/asm-i386/apic.h
+@@ -116,6 +116,8 @@ extern void enable_NMI_through_LVT0 (void * dummy);
+ extern int timer_over_8254;
+ extern int local_apic_timer_c2_ok;
+ 
++extern int local_apic_timer_disabled;
++
+ #else /* !CONFIG_X86_LOCAL_APIC */
+ static inline void lapic_shutdown(void) { }
+ 
+diff --git a/include/asm-i386/cpufeature.h b/include/asm-i386/cpufeature.h
+index f514e90..ddc2d7c 100644
+--- a/include/asm-i386/cpufeature.h
++++ b/include/asm-i386/cpufeature.h
+@@ -79,7 +79,7 @@
+ #define X86_FEATURE_ARCH_PERFMON (3*32+11) /* Intel Architectural PerfMon */
+ #define X86_FEATURE_PEBS	(3*32+12)  /* Precise-Event Based Sampling */
+ #define X86_FEATURE_BTS		(3*32+13)  /* Branch Trace Store */
+-#define X86_FEATURE_LAPIC_TIMER_BROKEN (3*32+ 14) /* lapic timer broken in C1 */
++/* 14 free */
+ #define X86_FEATURE_SYNC_RDTSC	(3*32+15)  /* RDTSC synchronizes the CPU */
+ 
+ /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
+diff --git a/kernel/sys.c b/kernel/sys.c
+index 28e8364..afd9b93 100644
+--- a/kernel/sys.c
++++ b/kernel/sys.c
+@@ -31,6 +31,7 @@
+ #include <linux/cn_proc.h>
+ #include <linux/getcpu.h>
+ #include <linux/task_io_accounting_ops.h>
++#include <linux/cpu.h>
+ 
+ #include <linux/compat.h>
+ #include <linux/syscalls.h>
+@@ -865,6 +866,7 @@ EXPORT_SYMBOL_GPL(kernel_halt);
+ void kernel_power_off(void)
+ {
+ 	kernel_shutdown_prepare(SYSTEM_POWER_OFF);
++	disable_nonboot_cpus();
+ 	printk(KERN_EMERG "Power down.\n");
+ 	machine_power_off();
+ }
+diff --git a/kernel/time/timer_stats.c b/kernel/time/timer_stats.c
+index 7bb561d..5717cfb 100644
+--- a/kernel/time/timer_stats.c
++++ b/kernel/time/timer_stats.c
+@@ -319,8 +319,9 @@ static int tstats_show(struct seq_file *m, void *v)
+ 		ms = 1;
+ 
+ 	if (events && period.tv_sec)
+-		seq_printf(m, "%ld total events, %ld.%ld events/sec\n", events,
+-			   events / period.tv_sec, events * 1000 / ms);
++		seq_printf(m, "%ld total events, %ld.%03ld events/sec\n",
++			   events, events * 1000 / ms,
++			   (events * 1000000 / ms) % 1000);
+ 	else
+ 		seq_printf(m, "%ld total events\n", events);
+ 
+diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
+index ad8dd4e..1ee7ca9 100644
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -1906,6 +1906,9 @@ static void selinux_bprm_post_apply_creds(struct linux_binprm *bprm)
+ 		spin_unlock_irq(&current->sighand->siglock);
+ 	}
+ 
++	/* Always clear parent death signal on SID transitions. */
++	current->pdeath_signal = 0;
++
+ 	/* Check whether the new SID can inherit resource limits
+ 	   from the old SID.  If not, reset all soft limits to
+ 	   the lower of the current task's hard limit and the init

Modified: dists/sid/linux-2.6/debian/patches/series/5
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/5	(original)
+++ dists/sid/linux-2.6/debian/patches/series/5	Wed Oct 10 21:35:01 2007
@@ -5,3 +5,4 @@
 + bugfix/2.6.22.7
 + bugfix/2.6.22.8
 + bugfix/2.6.22.9
++ bugfix/2.6.22.10



More information about the Kernel-svn-changes mailing list