diff options
| author | David S. Miller <davem@davemloft.net> | 2011-07-21 13:38:42 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-07-21 13:38:42 -0700 | 
| commit | 033b1142f4bd44a116d1356fe4a0510437ceddf9 (patch) | |
| tree | d2a971a7dc9f3a1af8035e38419c4c4ad8c22632 | |
| parent | f5caadbb3d8fc0b71533e880c684b2230bdb76ac (diff) | |
| parent | e6625fa48e6580a74b7e700efd7e6463e282810b (diff) | |
| download | olio-linux-3.10-033b1142f4bd44a116d1356fe4a0510437ceddf9.tar.xz olio-linux-3.10-033b1142f4bd44a116d1356fe4a0510437ceddf9.zip  | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
	net/bluetooth/l2cap_core.c
76 files changed, 486 insertions, 343 deletions
diff --git a/Documentation/filesystems/nilfs2.txt b/Documentation/filesystems/nilfs2.txt index d5c0cef38a7..873a2ab2e9f 100644 --- a/Documentation/filesystems/nilfs2.txt +++ b/Documentation/filesystems/nilfs2.txt @@ -40,7 +40,6 @@ Features which NILFS2 does not support yet:  	- POSIX ACLs  	- quotas  	- fsck -	- resize  	- defragmentation  Mount options diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index c67f684ee3e..09a87e61ffc 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c @@ -520,7 +520,7 @@ fail:  	 */  	if (have_imager()) {  		label = "HD imager"; -		mux |= 1; +		mux |= 2;  		/* externally mux MMC1/ENET/AIC33 to imager */  		mux |= BIT(6) | BIT(5) | BIT(3); @@ -540,7 +540,7 @@ fail:  		resets &= ~BIT(1);  		if (have_tvp7002()) { -			mux |= 2; +			mux |= 1;  			resets &= ~BIT(2);  			label = "tvp7002 HD";  		} else { diff --git a/arch/arm/mach-davinci/gpio.c b/arch/arm/mach-davinci/gpio.c index e7221398e5a..cafbe13a82a 100644 --- a/arch/arm/mach-davinci/gpio.c +++ b/arch/arm/mach-davinci/gpio.c @@ -254,8 +254,10 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)  {  	struct davinci_gpio_regs __iomem *g;  	u32 mask = 0xffff; +	struct davinci_gpio_controller *d; -	g = (__force struct davinci_gpio_regs __iomem *) irq_desc_get_handler_data(desc); +	d = (struct davinci_gpio_controller *)irq_desc_get_handler_data(desc); +	g = (struct davinci_gpio_regs __iomem *)d->regs;  	/* we only care about one bank */  	if (irq & 1) @@ -274,11 +276,14 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)  		if (!status)  			break;  		__raw_writel(status, &g->intstat); -		if (irq & 1) -			status >>= 16;  		/* now demux them to the right lowlevel handler */ -		n = (int)irq_get_handler_data(irq); +		n = d->irq_base; +		if (irq & 1) { +			n += 16; +			status >>= 16; +		} +  		while (status) {  			res = ffs(status);  			n += res; @@ -424,7 +429,13 @@ static int __init davinci_gpio_irq_setup(void)  		/* set up all irqs in this bank */  		irq_set_chained_handler(bank_irq, gpio_irq_handler); -		irq_set_handler_data(bank_irq, (__force void *)g); + +		/* +		 * Each chip handles 32 gpios, and each irq bank consists of 16 +		 * gpio irqs. Pass the irq bank's corresponding controller to +		 * the chained irq handler. +		 */ +		irq_set_handler_data(bank_irq, &chips[gpio / 32]);  		for (i = 0; i < 16 && gpio < ngpio; i++, irq++, gpio++) {  			irq_set_chip(irq, &gpio_irqchip); diff --git a/arch/arm/mach-davinci/irq.c b/arch/arm/mach-davinci/irq.c index d8c1af02593..952dc126c39 100644 --- a/arch/arm/mach-davinci/irq.c +++ b/arch/arm/mach-davinci/irq.c @@ -52,6 +52,12 @@ davinci_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)  	struct irq_chip_type *ct;  	gc = irq_alloc_generic_chip("AINTC", 1, irq_start, base, handle_edge_irq); +	if (!gc) { +		pr_err("%s: irq_alloc_generic_chip for IRQ %u failed\n", +		       __func__, irq_start); +		return; +	} +  	ct = gc->chip_types;  	ct->chip.irq_ack = irq_gc_ack_set_bit;  	ct->chip.irq_mask = irq_gc_mask_clr_bit; diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index 74ed81a3cb1..07772575d7a 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c @@ -419,14 +419,20 @@ static void notrace ixp4xx_update_sched_clock(void)  /*   * clocksource   */ + +static cycle_t ixp4xx_clocksource_read(struct clocksource *c) +{ +	return *IXP4XX_OSTS; +} +  unsigned long ixp4xx_timer_freq = IXP4XX_TIMER_FREQ;  EXPORT_SYMBOL(ixp4xx_timer_freq);  static void __init ixp4xx_clocksource_init(void)  {  	init_sched_clock(&cd, ixp4xx_update_sched_clock, 32, ixp4xx_timer_freq); -	clocksource_mmio_init(&IXP4XX_OSTS, "OSTS", ixp4xx_timer_freq, 200, 32, -			clocksource_mmio_readl_up); +	clocksource_mmio_init(NULL, "OSTS", ixp4xx_timer_freq, 200, 32, +			ixp4xx_clocksource_read);  }  /* diff --git a/arch/arm/mach-s3c64xx/dma.c b/arch/arm/mach-s3c64xx/dma.c index b197171e7d0..204bfafe4bf 100644 --- a/arch/arm/mach-s3c64xx/dma.c +++ b/arch/arm/mach-s3c64xx/dma.c @@ -113,7 +113,7 @@ found:  	return chan;  } -int s3c2410_dma_config(unsigned int channel, int xferunit) +int s3c2410_dma_config(enum dma_ch channel, int xferunit)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -297,7 +297,7 @@ static int s3c64xx_dma_flush(struct s3c2410_dma_chan *chan)  	return 0;  } -int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op) +int s3c2410_dma_ctrl(enum dma_ch channel, enum s3c2410_chan_op op)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -331,7 +331,7 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl);   *   */ -int s3c2410_dma_enqueue(unsigned int channel, void *id, +int s3c2410_dma_enqueue(enum dma_ch channel, void *id,  			dma_addr_t data, int size)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -415,7 +415,7 @@ err_buff:  EXPORT_SYMBOL(s3c2410_dma_enqueue); -int s3c2410_dma_devconfig(unsigned int channel, +int s3c2410_dma_devconfig(enum dma_ch channel,  			  enum s3c2410_dmasrc source,  			  unsigned long devaddr)  { @@ -463,7 +463,7 @@ int s3c2410_dma_devconfig(unsigned int channel,  EXPORT_SYMBOL(s3c2410_dma_devconfig); -int s3c2410_dma_getposition(unsigned int channel, +int s3c2410_dma_getposition(enum dma_ch channel,  			    dma_addr_t *src, dma_addr_t *dst)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -487,7 +487,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition);   * get control of an dma channel  */ -int s3c2410_dma_request(unsigned int channel, +int s3c2410_dma_request(enum dma_ch channel,  			struct s3c2410_dma_client *client,  			void *dev)  { @@ -533,7 +533,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);   * allowed to go through.  */ -int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client) +int s3c2410_dma_free(enum dma_ch channel, struct s3c2410_dma_client *client)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);  	unsigned long flags; diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index a79a8ccd25f..539bd0e3def 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c @@ -712,7 +712,7 @@ static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel);   * get control of an dma channel  */ -int s3c2410_dma_request(unsigned int channel, +int s3c2410_dma_request(enum dma_ch channel,  			struct s3c2410_dma_client *client,  			void *dev)  { @@ -783,7 +783,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);   * allowed to go through.  */ -int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client) +int s3c2410_dma_free(enum dma_ch channel, struct s3c2410_dma_client *client)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);  	unsigned long flags; @@ -974,7 +974,7 @@ static int s3c2410_dma_started(struct s3c2410_dma_chan *chan)  }  int -s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op) +s3c2410_dma_ctrl(enum dma_ch channel, enum s3c2410_chan_op op)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -1021,7 +1021,7 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl);   * xfersize:     size of unit in bytes (1,2,4)  */ -int s3c2410_dma_config(unsigned int channel, +int s3c2410_dma_config(enum dma_ch channel,  		       int xferunit)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -1100,7 +1100,7 @@ EXPORT_SYMBOL(s3c2410_dma_config);   * devaddr:   physical address of the source  */ -int s3c2410_dma_devconfig(unsigned int channel, +int s3c2410_dma_devconfig(enum dma_ch channel,  			  enum s3c2410_dmasrc source,  			  unsigned long devaddr)  { @@ -1173,7 +1173,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig);   * returns the current transfer points for the dma source and destination  */ -int s3c2410_dma_getposition(unsigned int channel, dma_addr_t *src, dma_addr_t *dst) +int s3c2410_dma_getposition(enum dma_ch channel, dma_addr_t *src, dma_addr_t *dst)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); diff --git a/arch/arm/plat-samsung/dma.c b/arch/arm/plat-samsung/dma.c index cb459dd9545..6143aa14768 100644 --- a/arch/arm/plat-samsung/dma.c +++ b/arch/arm/plat-samsung/dma.c @@ -41,7 +41,7 @@ struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)   * irq?  */ -int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn) +int s3c2410_dma_set_opfn(enum dma_ch channel, s3c2410_dma_opfn_t rtn)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -56,7 +56,7 @@ int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)  }  EXPORT_SYMBOL(s3c2410_dma_set_opfn); -int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn) +int s3c2410_dma_set_buffdone_fn(enum dma_ch channel, s3c2410_dma_cbfn_t rtn)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); @@ -71,7 +71,7 @@ int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)  }  EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn); -int s3c2410_dma_setflags(unsigned int channel, unsigned int flags) +int s3c2410_dma_setflags(enum dma_ch channel, unsigned int flags)  {  	struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); diff --git a/arch/arm/plat-samsung/include/plat/dma.h b/arch/arm/plat-samsung/include/plat/dma.h index 2e8f8c6560d..8c273b7a6f5 100644 --- a/arch/arm/plat-samsung/include/plat/dma.h +++ b/arch/arm/plat-samsung/include/plat/dma.h @@ -42,6 +42,7 @@ struct s3c2410_dma_client {  };  struct s3c2410_dma_chan; +enum dma_ch;  /* s3c2410_dma_cbfn_t   * @@ -62,7 +63,7 @@ typedef int  (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,   * request a dma channel exclusivley  */ -extern int s3c2410_dma_request(unsigned int channel, +extern int s3c2410_dma_request(enum dma_ch channel,  			       struct s3c2410_dma_client *, void *dev); @@ -71,14 +72,14 @@ extern int s3c2410_dma_request(unsigned int channel,   * change the state of the dma channel  */ -extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op); +extern int s3c2410_dma_ctrl(enum dma_ch channel, enum s3c2410_chan_op op);  /* s3c2410_dma_setflags   *   * set the channel's flags to a given state  */ -extern int s3c2410_dma_setflags(unsigned int channel, +extern int s3c2410_dma_setflags(enum dma_ch channel,  				unsigned int flags);  /* s3c2410_dma_free @@ -86,7 +87,7 @@ extern int s3c2410_dma_setflags(unsigned int channel,   * free the dma channel (will also abort any outstanding operations)  */ -extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *); +extern int s3c2410_dma_free(enum dma_ch channel, struct s3c2410_dma_client *);  /* s3c2410_dma_enqueue   * @@ -95,7 +96,7 @@ extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *);   * drained before the buffer is given to the DMA system.  */ -extern int s3c2410_dma_enqueue(unsigned int channel, void *id, +extern int s3c2410_dma_enqueue(enum dma_ch channel, void *id,  			       dma_addr_t data, int size);  /* s3c2410_dma_config @@ -103,14 +104,14 @@ extern int s3c2410_dma_enqueue(unsigned int channel, void *id,   * configure the dma channel  */ -extern int s3c2410_dma_config(unsigned int channel, int xferunit); +extern int s3c2410_dma_config(enum dma_ch channel, int xferunit);  /* s3c2410_dma_devconfig   *   * configure the device we're talking to  */ -extern int s3c2410_dma_devconfig(unsigned int channel, +extern int s3c2410_dma_devconfig(enum dma_ch channel,  		enum s3c2410_dmasrc source, unsigned long devaddr);  /* s3c2410_dma_getposition @@ -118,10 +119,10 @@ extern int s3c2410_dma_devconfig(unsigned int channel,   * get the position that the dma transfer is currently at  */ -extern int s3c2410_dma_getposition(unsigned int channel, +extern int s3c2410_dma_getposition(enum dma_ch channel,  				   dma_addr_t *src, dma_addr_t *dest); -extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn); -extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn); +extern int s3c2410_dma_set_opfn(enum dma_ch, s3c2410_dma_opfn_t rtn); +extern int s3c2410_dma_set_buffdone_fn(enum dma_ch, s3c2410_dma_cbfn_t rtn); diff --git a/arch/arm/plat-samsung/irq-uart.c b/arch/arm/plat-samsung/irq-uart.c index 0e46588d847..657405c481d 100644 --- a/arch/arm/plat-samsung/irq-uart.c +++ b/arch/arm/plat-samsung/irq-uart.c @@ -54,6 +54,13 @@ static void __init s3c_init_uart_irq(struct s3c_uart_irq *uirq)  	gc = irq_alloc_generic_chip("s3c-uart", 1, uirq->base_irq, reg_base,  				    handle_level_irq); + +	if (!gc) { +		pr_err("%s: irq_alloc_generic_chip for IRQ %u failed\n", +		       __func__, uirq->base_irq); +		return; +	} +  	ct = gc->chip_types;  	ct->chip.irq_ack = irq_gc_ack_set_bit;  	ct->chip.irq_mask = irq_gc_mask_set_bit; diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c index a607546ddbd..f714d060370 100644 --- a/arch/arm/plat-samsung/irq-vic-timer.c +++ b/arch/arm/plat-samsung/irq-vic-timer.c @@ -54,6 +54,13 @@ void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq)  	s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq,  					 S3C64XX_TINT_CSTAT, handle_level_irq); + +	if (!s3c_tgc) { +		pr_err("%s: irq_alloc_generic_chip for IRQ %d failed\n", +		       __func__, timer_irq); +		return; +	} +  	ct = s3c_tgc->chip_types;  	ct->chip.irq_mask = irq_gc_mask_clr_bit;  	ct->chip.irq_unmask = irq_gc_mask_set_bit; diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c index c018696765d..5c74eb797f0 100644 --- a/arch/mips/kernel/i8259.c +++ b/arch/mips/kernel/i8259.c @@ -14,7 +14,7 @@  #include <linux/interrupt.h>  #include <linux/kernel.h>  #include <linux/spinlock.h> -#include <linux/sysdev.h> +#include <linux/syscore_ops.h>  #include <linux/irq.h>  #include <asm/i8259.h> @@ -215,14 +215,13 @@ spurious_8259A_irq:  	}  } -static int i8259A_resume(struct sys_device *dev) +static void i8259A_resume(void)  {  	if (i8259A_auto_eoi >= 0)  		init_8259A(i8259A_auto_eoi); -	return 0;  } -static int i8259A_shutdown(struct sys_device *dev) +static void i8259A_shutdown(void)  {  	/* Put the i8259A into a quiescent state that  	 * the kernel initialization code can get it @@ -232,26 +231,17 @@ static int i8259A_shutdown(struct sys_device *dev)  		outb(0xff, PIC_MASTER_IMR);	/* mask all of 8259A-1 */  		outb(0xff, PIC_SLAVE_IMR);	/* mask all of 8259A-1 */  	} -	return 0;  } -static struct sysdev_class i8259_sysdev_class = { -	.name = "i8259", +static struct syscore_ops i8259_syscore_ops = {  	.resume = i8259A_resume,  	.shutdown = i8259A_shutdown,  }; -static struct sys_device device_i8259A = { -	.id	= 0, -	.cls	= &i8259_sysdev_class, -}; -  static int __init i8259A_init_sysfs(void)  { -	int error = sysdev_class_register(&i8259_sysdev_class); -	if (!error) -		error = sysdev_register(&device_i8259A); -	return error; +	register_syscore_ops(&i8259_syscore_ops); +	return 0;  }  device_initcall(i8259A_init_sysfs); diff --git a/arch/sparc/include/asm/irqflags_32.h b/arch/sparc/include/asm/irqflags_32.h index d4d0711de0f..14848909e0d 100644 --- a/arch/sparc/include/asm/irqflags_32.h +++ b/arch/sparc/include/asm/irqflags_32.h @@ -18,7 +18,7 @@ extern void arch_local_irq_restore(unsigned long);  extern unsigned long arch_local_irq_save(void);  extern void arch_local_irq_enable(void); -static inline unsigned long arch_local_save_flags(void) +static inline notrace unsigned long arch_local_save_flags(void)  {  	unsigned long flags; @@ -26,17 +26,17 @@ static inline unsigned long arch_local_save_flags(void)  	return flags;  } -static inline void arch_local_irq_disable(void) +static inline notrace void arch_local_irq_disable(void)  {  	arch_local_irq_save();  } -static inline bool arch_irqs_disabled_flags(unsigned long flags) +static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)  {  	return (flags & PSR_PIL) != 0;  } -static inline bool arch_irqs_disabled(void) +static inline notrace bool arch_irqs_disabled(void)  {  	return arch_irqs_disabled_flags(arch_local_save_flags());  } diff --git a/arch/sparc/include/asm/irqflags_64.h b/arch/sparc/include/asm/irqflags_64.h index aab969c82c2..23cd27f6beb 100644 --- a/arch/sparc/include/asm/irqflags_64.h +++ b/arch/sparc/include/asm/irqflags_64.h @@ -14,7 +14,7 @@  #ifndef __ASSEMBLY__ -static inline unsigned long arch_local_save_flags(void) +static inline notrace unsigned long arch_local_save_flags(void)  {  	unsigned long flags; @@ -26,7 +26,7 @@ static inline unsigned long arch_local_save_flags(void)  	return flags;  } -static inline void arch_local_irq_restore(unsigned long flags) +static inline notrace void arch_local_irq_restore(unsigned long flags)  {  	__asm__ __volatile__(  		"wrpr	%0, %%pil" @@ -36,7 +36,7 @@ static inline void arch_local_irq_restore(unsigned long flags)  	);  } -static inline void arch_local_irq_disable(void) +static inline notrace void arch_local_irq_disable(void)  {  	__asm__ __volatile__(  		"wrpr	%0, %%pil" @@ -46,7 +46,7 @@ static inline void arch_local_irq_disable(void)  	);  } -static inline void arch_local_irq_enable(void) +static inline notrace void arch_local_irq_enable(void)  {  	__asm__ __volatile__(  		"wrpr	0, %%pil" @@ -56,17 +56,17 @@ static inline void arch_local_irq_enable(void)  	);  } -static inline int arch_irqs_disabled_flags(unsigned long flags) +static inline notrace int arch_irqs_disabled_flags(unsigned long flags)  {  	return (flags > 0);  } -static inline int arch_irqs_disabled(void) +static inline notrace int arch_irqs_disabled(void)  {  	return arch_irqs_disabled_flags(arch_local_save_flags());  } -static inline unsigned long arch_local_irq_save(void) +static inline notrace unsigned long arch_local_irq_save(void)  {  	unsigned long flags, tmp; diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 9fe08a1ea6c..f445e98463e 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S @@ -293,7 +293,7 @@ maybe_smp4m_msg:  	WRITE_PAUSE  	wr	%l4, PSR_ET, %psr  	WRITE_PAUSE -	sll	%o3, 28, %o2		! shift for simpler checks below +	srl	%o3, 28, %o2		! shift for simpler checks below  maybe_smp4m_msg_check_single:  	andcc	%o2, 0x1, %g0  	beq,a	maybe_smp4m_msg_check_mask diff --git a/arch/sparc/mm/leon_mm.c b/arch/sparc/mm/leon_mm.c index c0e01297e64..e485a680499 100644 --- a/arch/sparc/mm/leon_mm.c +++ b/arch/sparc/mm/leon_mm.c @@ -226,7 +226,7 @@ void leon3_getCacheRegs(struct leon3_cacheregs *regs)   * Leon2 and Leon3 differ in their way of telling cache information   *   */ -int leon_flush_needed(void) +int __init leon_flush_needed(void)  {  	int flush_needed = -1;  	unsigned int ssize, sets; diff --git a/drivers/acpi/apei/hest.c b/drivers/acpi/apei/hest.c index abda3786a5d..181bc2f7bb7 100644 --- a/drivers/acpi/apei/hest.c +++ b/drivers/acpi/apei/hest.c @@ -139,13 +139,23 @@ static int __init hest_parse_ghes(struct acpi_hest_header *hest_hdr, void *data)  {  	struct platform_device *ghes_dev;  	struct ghes_arr *ghes_arr = data; -	int rc; +	int rc, i;  	if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR)  		return 0;  	if (!((struct acpi_hest_generic *)hest_hdr)->enabled)  		return 0; +	for (i = 0; i < ghes_arr->count; i++) { +		struct acpi_hest_header *hdr; +		ghes_dev = ghes_arr->ghes_devs[i]; +		hdr = *(struct acpi_hest_header **)ghes_dev->dev.platform_data; +		if (hdr->source_id == hest_hdr->source_id) { +			pr_warning(FW_WARN HEST_PFX "Duplicated hardware error source ID: %d.\n", +				   hdr->source_id); +			return -EIO; +		} +	}  	ghes_dev = platform_device_alloc("GHES", hest_hdr->source_id);  	if (!ghes_dev)  		return -ENOMEM; diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 52ca9649d76..372f9b70f7f 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -1333,23 +1333,6 @@ int acpi_resources_are_enforced(void)  EXPORT_SYMBOL(acpi_resources_are_enforced);  /* - * Create and initialize a spinlock. - */ -acpi_status -acpi_os_create_lock(acpi_spinlock *out_handle) -{ -	spinlock_t *lock; - -	lock = ACPI_ALLOCATE(sizeof(spinlock_t)); -	if (!lock) -		return AE_NO_MEMORY; -	spin_lock_init(lock); -	*out_handle = lock; - -	return AE_OK; -} - -/*   * Deallocate the memory for a spinlock.   */  void acpi_os_delete_lock(acpi_spinlock handle) diff --git a/drivers/gpio/wm831x-gpio.c b/drivers/gpio/wm831x-gpio.c index 309644cf4d9..2bcfb0be09f 100644 --- a/drivers/gpio/wm831x-gpio.c +++ b/drivers/gpio/wm831x-gpio.c @@ -180,6 +180,7 @@ static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)  			break;  		case WM831X_GPIO_PULL_UP:  			pull = "pullup"; +			break;  		default:  			pull = "INVALID PULL";  			break; diff --git a/drivers/hwmon/adm1275.c b/drivers/hwmon/adm1275.c index b9b7caf4a1d..8bc1bd66372 100644 --- a/drivers/hwmon/adm1275.c +++ b/drivers/hwmon/adm1275.c @@ -53,23 +53,23 @@ static int adm1275_probe(struct i2c_client *client,  	info->direct[PSC_VOLTAGE_IN] = true;  	info->direct[PSC_VOLTAGE_OUT] = true;  	info->direct[PSC_CURRENT_OUT] = true; -	info->m[PSC_CURRENT_OUT] = 800; +	info->m[PSC_CURRENT_OUT] = 807;  	info->b[PSC_CURRENT_OUT] = 20475;  	info->R[PSC_CURRENT_OUT] = -1;  	info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;  	if (config & ADM1275_VRANGE) { -		info->m[PSC_VOLTAGE_IN] = 19045; +		info->m[PSC_VOLTAGE_IN] = 19199;  		info->b[PSC_VOLTAGE_IN] = 0;  		info->R[PSC_VOLTAGE_IN] = -2; -		info->m[PSC_VOLTAGE_OUT] = 19045; +		info->m[PSC_VOLTAGE_OUT] = 19199;  		info->b[PSC_VOLTAGE_OUT] = 0;  		info->R[PSC_VOLTAGE_OUT] = -2;  	} else { -		info->m[PSC_VOLTAGE_IN] = 6666; +		info->m[PSC_VOLTAGE_IN] = 6720;  		info->b[PSC_VOLTAGE_IN] = 0;  		info->R[PSC_VOLTAGE_IN] = -1; -		info->m[PSC_VOLTAGE_OUT] = 6666; +		info->m[PSC_VOLTAGE_OUT] = 6720;  		info->b[PSC_VOLTAGE_OUT] = 0;  		info->R[PSC_VOLTAGE_OUT] = -1;  	} diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c index dcb78a7a804..00e98517f94 100644 --- a/drivers/hwmon/asus_atk0110.c +++ b/drivers/hwmon/asus_atk0110.c @@ -674,6 +674,7 @@ static int atk_debugfs_gitm_get(void *p, u64 *val)  	else  		err = -EIO; +	ACPI_FREE(ret);  	return err;  } diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index bb6405b9200..5f524775043 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -1538,7 +1538,7 @@ static struct attribute *it87_attributes_label[] = {  };  static const struct attribute_group it87_group_label = { -	.attrs = it87_attributes_vid, +	.attrs = it87_attributes_label,  };  /* SuperIO detection - will change isa_address if a chip is found */ diff --git a/drivers/hwmon/max1111.c b/drivers/hwmon/max1111.c index 12a54aa2977..14335bbc9bd 100644 --- a/drivers/hwmon/max1111.c +++ b/drivers/hwmon/max1111.c @@ -40,6 +40,8 @@ struct max1111_data {  	struct spi_transfer	xfer[2];  	uint8_t *tx_buf;  	uint8_t *rx_buf; +	struct mutex		drvdata_lock; +	/* protect msg, xfer and buffers from multiple access */  };  static int max1111_read(struct device *dev, int channel) @@ -48,6 +50,9 @@ static int max1111_read(struct device *dev, int channel)  	uint8_t v1, v2;  	int err; +	/* writing to drvdata struct is not thread safe, wait on mutex */ +	mutex_lock(&data->drvdata_lock); +  	data->tx_buf[0] = (channel << MAX1111_CTRL_SEL_SH) |  		MAX1111_CTRL_PD0 | MAX1111_CTRL_PD1 |  		MAX1111_CTRL_SGL | MAX1111_CTRL_UNI | MAX1111_CTRL_STR; @@ -55,12 +60,15 @@ static int max1111_read(struct device *dev, int channel)  	err = spi_sync(data->spi, &data->msg);  	if (err < 0) {  		dev_err(dev, "spi_sync failed with %d\n", err); +		mutex_unlock(&data->drvdata_lock);  		return err;  	}  	v1 = data->rx_buf[0];  	v2 = data->rx_buf[1]; +	mutex_unlock(&data->drvdata_lock); +  	if ((v1 & 0xc0) || (v2 & 0x3f))  		return -EINVAL; @@ -176,6 +184,8 @@ static int __devinit max1111_probe(struct spi_device *spi)  	if (err)  		goto err_free_data; +	mutex_init(&data->drvdata_lock); +  	data->spi = spi;  	spi_set_drvdata(spi, data); @@ -213,6 +223,7 @@ static int __devexit max1111_remove(struct spi_device *spi)  	hwmon_device_unregister(data->hwmon_dev);  	sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group); +	mutex_destroy(&data->drvdata_lock);  	kfree(data->rx_buf);  	kfree(data->tx_buf);  	kfree(data); diff --git a/drivers/hwmon/pmbus_core.c b/drivers/hwmon/pmbus_core.c index 744672c1f26..8e31a8e2c74 100644 --- a/drivers/hwmon/pmbus_core.c +++ b/drivers/hwmon/pmbus_core.c @@ -362,8 +362,8 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)   * Convert linear sensor values to milli- or micro-units   * depending on sensor type.   */ -static int pmbus_reg2data_linear(struct pmbus_data *data, -				 struct pmbus_sensor *sensor) +static long pmbus_reg2data_linear(struct pmbus_data *data, +				  struct pmbus_sensor *sensor)  {  	s16 exponent;  	s32 mantissa; @@ -397,15 +397,15 @@ static int pmbus_reg2data_linear(struct pmbus_data *data,  	else  		val >>= -exponent; -	return (int)val; +	return val;  }  /*   * Convert direct sensor values to milli- or micro-units   * depending on sensor type.   */ -static int pmbus_reg2data_direct(struct pmbus_data *data, -				 struct pmbus_sensor *sensor) +static long pmbus_reg2data_direct(struct pmbus_data *data, +				  struct pmbus_sensor *sensor)  {  	long val = (s16) sensor->data;  	long m, b, R; @@ -440,12 +440,12 @@ static int pmbus_reg2data_direct(struct pmbus_data *data,  		R++;  	} -	return (int)((val - b) / m); +	return (val - b) / m;  } -static int pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) +static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)  { -	int val; +	long val;  	if (data->info->direct[sensor->class])  		val = pmbus_reg2data_direct(data, sensor); @@ -619,7 +619,7 @@ static int pmbus_get_boolean(struct pmbus_data *data, int index, int *val)  	if (!s1 && !s2)  		*val = !!regval;  	else { -		int v1, v2; +		long v1, v2;  		struct pmbus_sensor *sensor1, *sensor2;  		sensor1 = &data->sensors[s1]; @@ -661,7 +661,7 @@ static ssize_t pmbus_show_sensor(struct device *dev,  	if (sensor->data < 0)  		return sensor->data; -	return snprintf(buf, PAGE_SIZE, "%d\n", pmbus_reg2data(data, sensor)); +	return snprintf(buf, PAGE_SIZE, "%ld\n", pmbus_reg2data(data, sensor));  }  static ssize_t pmbus_set_sensor(struct device *dev, diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 98278041d75..5b6b451d469 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -1988,6 +1988,14 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)  	if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {  		if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)  			goto err0; + +		/* If we took control of the bus, we need to force +		   reinitialization.  This is because many ts_bus_ctrl() +		   functions strobe the RESET pin on the demod, and if the +		   frontend thread already exists then the dvb_init() routine +		   won't get called (which is what usually does initial +		   register configuration). */ +		fepriv->reinitialise = 1;  	}  	if ((ret = dvb_generic_open (inode, file)) < 0) diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index e4c97fd6f05..52798a111e1 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig @@ -168,7 +168,7 @@ config RADIO_MAXIRADIO  config RADIO_MIROPCM20  	tristate "miroSOUND PCM20 radio" -	depends on ISA && VIDEO_V4L2 && SND +	depends on ISA && ISA_DMA_API && VIDEO_V4L2 && SND  	select SND_ISA  	select SND_MIRO  	---help--- @@ -201,7 +201,7 @@ config RADIO_SF16FMI  config RADIO_SF16FMR2  	tristate "SF16FMR2 Radio" -	depends on ISA && VIDEO_V4L2 +	depends on ISA && VIDEO_V4L2 && SND  	---help---  	  Choose Y here if you have one of these FM radio cards. diff --git a/drivers/media/radio/si4713-i2c.c b/drivers/media/radio/si4713-i2c.c index deca2e06ff2..c9f4a8e65dc 100644 --- a/drivers/media/radio/si4713-i2c.c +++ b/drivers/media/radio/si4713-i2c.c @@ -1033,7 +1033,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev,  		char ps_name[MAX_RDS_PS_NAME + 1];  		len = control->size - 1; -		if (len > MAX_RDS_PS_NAME) { +		if (len < 0 || len > MAX_RDS_PS_NAME) {  			rval = -ERANGE;  			goto exit;  		} @@ -1057,7 +1057,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev,  		char radio_text[MAX_RDS_RADIO_TEXT + 1];  		len = control->size - 1; -		if (len > MAX_RDS_RADIO_TEXT) { +		if (len < 0 || len > MAX_RDS_RADIO_TEXT) {  			rval = -ERANGE;  			goto exit;  		} diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c index 06dfe0957b5..ec972dc2579 100644 --- a/drivers/media/rc/mceusb.c +++ b/drivers/media/rc/mceusb.c @@ -558,9 +558,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,  				 inout, data1);  			break;  		case MCE_CMD_S_TIMEOUT: -			/* value is in units of 50us, so x*50/100 or x/2 ms */ +			/* value is in units of 50us, so x*50/1000 ms */  			dev_info(dev, "%s receive timeout of %d ms\n", -				 inout, ((data1 << 8) | data2) / 2); +				 inout, +				 ((data1 << 8) | data2) * MCE_TIME_UNIT / 1000);  			break;  		case MCE_CMD_G_TIMEOUT:  			dev_info(dev, "Get receive timeout\n"); @@ -847,7 +848,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)  	switch (ir->buf_in[index]) {  	/* 2-byte return value commands */  	case MCE_CMD_S_TIMEOUT: -		ir->rc->timeout = US_TO_NS((hi << 8 | lo) / 2); +		ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT);  		break;  	/* 1-byte return value commands */ @@ -1078,7 +1079,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)  	rc->priv = ir;  	rc->driver_type = RC_DRIVER_IR_RAW;  	rc->allowed_protos = RC_TYPE_ALL; -	rc->timeout = US_TO_NS(1000); +	rc->timeout = MS_TO_NS(100);  	if (!ir->flags.no_tx) {  		rc->s_tx_mask = mceusb_set_tx_mask;  		rc->s_tx_carrier = mceusb_set_tx_carrier; diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c index 565f24c20d7..ce595f9ab4c 100644 --- a/drivers/media/rc/nuvoton-cir.c +++ b/drivers/media/rc/nuvoton-cir.c @@ -1110,7 +1110,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)  	rdev->dev.parent = &pdev->dev;  	rdev->driver_name = NVT_DRIVER_NAME;  	rdev->map_name = RC_MAP_RC6_MCE; -	rdev->timeout = US_TO_NS(1000); +	rdev->timeout = MS_TO_NS(100);  	/* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */  	rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);  #if 0 diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c index 64d9b2136ff..419777a832e 100644 --- a/drivers/media/video/cx23885/cx23885-core.c +++ b/drivers/media/video/cx23885/cx23885-core.c @@ -2060,12 +2060,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev,  		goto fail_irq;  	} -	if (!pci_enable_msi(pci_dev)) -		err = request_irq(pci_dev->irq, cx23885_irq, -				  IRQF_DISABLED, dev->name, dev); -	else -		err = request_irq(pci_dev->irq, cx23885_irq, -				  IRQF_SHARED | IRQF_DISABLED, dev->name, dev); +	err = request_irq(pci_dev->irq, cx23885_irq, +			  IRQF_SHARED | IRQF_DISABLED, dev->name, dev);  	if (err < 0) {  		printk(KERN_ERR "%s: can't get IRQ %d\n",  		       dev->name, pci_dev->irq); @@ -2114,7 +2110,6 @@ static void __devexit cx23885_finidev(struct pci_dev *pci_dev)  	/* unregister stuff */  	free_irq(pci_dev->irq, dev); -	pci_disable_msi(pci_dev);  	cx23885_dev_unregister(dev);  	v4l2_device_unregister(v4l2_dev); diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index cfa9f7efe93..a03945ab9f0 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c @@ -714,10 +714,19 @@ static int tuner_remove(struct i2c_client *client)   * returns 0.   * This function is needed for boards that have a separate tuner for   * radio (like devices with tea5767). + * NOTE: mt20xx uses V4L2_TUNER_DIGITAL_TV and calls set_tv_freq to + *       select a TV frequency. So, t_mode = T_ANALOG_TV could actually + *	 be used to represent a Digital TV too.   */  static inline int check_mode(struct tuner *t, enum v4l2_tuner_type mode)  { -	if ((1 << mode & t->mode_mask) == 0) +	int t_mode; +	if (mode == V4L2_TUNER_RADIO) +		t_mode = T_RADIO; +	else +		t_mode = T_ANALOG_TV; + +	if ((t_mode & t->mode_mask) == 0)  		return -EINVAL;  	return 0; @@ -984,7 +993,7 @@ static void tuner_status(struct dvb_frontend *fe)  	case V4L2_TUNER_RADIO:  		p = "radio";  		break; -	case V4L2_TUNER_DIGITAL_TV: +	case V4L2_TUNER_DIGITAL_TV: /* Used by mt20xx */  		p = "digital TV";  		break;  	case V4L2_TUNER_ANALOG_TV: @@ -1135,9 +1144,8 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)  		return 0;  	if (vt->type == t->mode && analog_ops->get_afc)  		vt->afc = analog_ops->get_afc(&t->fe); -	if (vt->type == V4L2_TUNER_ANALOG_TV) +	if (t->mode != V4L2_TUNER_RADIO) {  		vt->capability |= V4L2_TUNER_CAP_NORM; -	if (vt->type != V4L2_TUNER_RADIO) {  		vt->rangelow = tv_range[0] * 16;  		vt->rangehigh = tv_range[1] * 16;  		return 0; diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 61265f74ed3..b9eaf5c0dc7 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1415,9 +1415,9 @@ out:  	return features;  } -#define BOND_VLAN_FEATURES	(NETIF_F_ALL_TX_OFFLOADS | \ -				 NETIF_F_SOFT_FEATURES | \ -				 NETIF_F_LRO) +#define BOND_VLAN_FEATURES	(NETIF_F_ALL_CSUM | NETIF_F_SG | \ +				 NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \ +				 NETIF_F_HIGHDMA | NETIF_F_LRO)  static void bond_compute_features(struct bonding *bond)  { diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 3321d714ca2..d265c6e1387 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c @@ -2287,6 +2287,23 @@ static int gfar_set_mac_address(struct net_device *dev)  	return 0;  } +/* Check if rx parser should be activated */ +void gfar_check_rx_parser_mode(struct gfar_private *priv) +{ +	struct gfar __iomem *regs; +	u32 tempval; + +	regs = priv->gfargrp[0].regs; + +	tempval = gfar_read(®s->rctrl); +	/* If parse is no longer required, then disable parser */ +	if (tempval & RCTRL_REQ_PARSER) +		tempval |= RCTRL_PRSDEP_INIT; +	else +		tempval &= ~RCTRL_PRSDEP_INIT; +	gfar_write(®s->rctrl, tempval); +} +  /* Enables and disables VLAN insertion/extraction */  static void gfar_vlan_rx_register(struct net_device *dev, @@ -2323,12 +2340,9 @@ static void gfar_vlan_rx_register(struct net_device *dev,  		/* Disable VLAN tag extraction */  		tempval = gfar_read(®s->rctrl);  		tempval &= ~RCTRL_VLEX; -		/* If parse is no longer required, then disable parser */ -		if (tempval & RCTRL_REQ_PARSER) -			tempval |= RCTRL_PRSDEP_INIT; -		else -			tempval &= ~RCTRL_PRSDEP_INIT;  		gfar_write(®s->rctrl, tempval); + +		gfar_check_rx_parser_mode(priv);  	}  	gfar_change_mtu(dev, dev->mtu); diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index 27499c606a4..87c1d8608b7 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h @@ -286,7 +286,7 @@ extern const char gfar_driver_version[];  #define RCTRL_PROM		0x00000008  #define RCTRL_EMEN		0x00000002  #define RCTRL_REQ_PARSER	(RCTRL_VLEX | RCTRL_IPCSEN | \ -				 RCTRL_TUCSEN) +				 RCTRL_TUCSEN | RCTRL_FILREN)  #define RCTRL_CHECKSUMMING	(RCTRL_IPCSEN | RCTRL_TUCSEN | \  				RCTRL_PRSDEP_INIT)  #define RCTRL_EXTHASH		(RCTRL_GHTX) @@ -1182,6 +1182,7 @@ extern void gfar_configure_coalescing(struct gfar_private *priv,  		unsigned long tx_mask, unsigned long rx_mask);  void gfar_init_sysfs(struct net_device *dev);  int gfar_set_features(struct net_device *dev, u32 features); +extern void gfar_check_rx_parser_mode(struct gfar_private *priv);  extern const struct ethtool_ops gfar_ethtool_ops; diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index 718879b35b7..bc9a4bb3198 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c @@ -348,8 +348,9 @@ static int pppoe_device_event(struct notifier_block *this,  	/* Only look at sockets that are using this specific device. */  	switch (event) { +	case NETDEV_CHANGEADDR:  	case NETDEV_CHANGEMTU: -		/* A change in mtu is a bad thing, requiring +		/* A change in mtu or address is a bad thing, requiring  		 * LCP re-negotiation.  		 */ diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 00f06e9a779..b64fcee483a 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c @@ -677,9 +677,11 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)  		if (status & RX_FIFO_FULL)  			dev->stats.rx_fifo_errors++; -		/* Mask off RX interrupt */ -		misr &= ~RX_INTS; -		napi_schedule(&lp->napi); +		if (likely(napi_schedule_prep(&lp->napi))) { +			/* Mask off RX interrupt */ +			misr &= ~RX_INTS; +			__napi_schedule(&lp->napi); +		}  	}  	/* TX interrupt request */ diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c index 46851273196..9a21ca3873f 100644 --- a/drivers/net/tulip/dmfe.c +++ b/drivers/net/tulip/dmfe.c @@ -879,7 +879,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db)  	txptr = db->tx_remove_ptr;  	while(db->tx_packet_cnt) {  		tdes0 = le32_to_cpu(txptr->tdes0); -		pr_debug("tdes0=%x\n", tdes0);  		if (tdes0 & 0x80000000)  			break; @@ -889,7 +888,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db)  		/* Transmit statistic counter */  		if ( tdes0 != 0x7fffffff ) { -			pr_debug("tdes0=%x\n", tdes0);  			dev->stats.collisions += (tdes0 >> 3) & 0xf;  			dev->stats.tx_bytes += le32_to_cpu(txptr->tdes1) & 0x7ff;  			if (tdes0 & TDES0_ERR_MASK) { @@ -986,7 +984,6 @@ static void dmfe_rx_packet(struct DEVICE *dev, struct dmfe_board_info * db)  			/* error summary bit check */  			if (rdes0 & 0x8000) {  				/* This is a error packet */ -				pr_debug("rdes0: %x\n", rdes0);  				dev->stats.rx_errors++;  				if (rdes0 & 1)  					dev->stats.rx_fifo_errors++; @@ -1638,7 +1635,6 @@ static u8 dmfe_sense_speed(struct dmfe_board_info * db)  		else 				/* DM9102/DM9102A */  			phy_mode = phy_read(db->ioaddr,  				    db->phy_addr, 17, db->chip_id) & 0xf000; -		pr_debug("Phy_mode %x\n", phy_mode);  		switch (phy_mode) {  		case 0x1000: db->op_mode = DMFE_10MHF; break;  		case 0x2000: db->op_mode = DMFE_10MFD; break; diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 9536d386bb3..21d816e9dfa 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -599,8 +599,7 @@ config IT87_WDT  config HP_WATCHDOG  	tristate "HP ProLiant iLO2+ Hardware Watchdog Timer" -	depends on X86 -	default m +	depends on X86 && PCI  	help  	  A software monitoring watchdog and NMI sourcing driver. This driver  	  will detect lockups and provide a stack trace. This is a driver that diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 79743d146be..0c1d9175652 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -1438,12 +1438,15 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,  	struct dentry *temp;  	char *path;  	int len, pos; +	unsigned seq;  	if (dentry == NULL)  		return ERR_PTR(-EINVAL);  retry:  	len = 0; +	seq = read_seqbegin(&rename_lock); +	rcu_read_lock();  	for (temp = dentry; !IS_ROOT(temp);) {  		struct inode *inode = temp->d_inode;  		if (inode && ceph_snap(inode) == CEPH_SNAPDIR) @@ -1455,10 +1458,12 @@ retry:  			len += 1 + temp->d_name.len;  		temp = temp->d_parent;  		if (temp == NULL) { +			rcu_read_unlock();  			pr_err("build_path corrupt dentry %p\n", dentry);  			return ERR_PTR(-EINVAL);  		}  	} +	rcu_read_unlock();  	if (len)  		len--;  /* no leading '/' */ @@ -1467,9 +1472,12 @@ retry:  		return ERR_PTR(-ENOMEM);  	pos = len;  	path[pos] = 0;	/* trailing null */ +	rcu_read_lock();  	for (temp = dentry; !IS_ROOT(temp) && pos != 0; ) { -		struct inode *inode = temp->d_inode; +		struct inode *inode; +		spin_lock(&temp->d_lock); +		inode = temp->d_inode;  		if (inode && ceph_snap(inode) == CEPH_SNAPDIR) {  			dout("build_path path+%d: %p SNAPDIR\n",  			     pos, temp); @@ -1478,21 +1486,26 @@ retry:  			break;  		} else {  			pos -= temp->d_name.len; -			if (pos < 0) +			if (pos < 0) { +				spin_unlock(&temp->d_lock);  				break; +			}  			strncpy(path + pos, temp->d_name.name,  				temp->d_name.len);  		} +		spin_unlock(&temp->d_lock);  		if (pos)  			path[--pos] = '/';  		temp = temp->d_parent;  		if (temp == NULL) { +			rcu_read_unlock();  			pr_err("build_path corrupt dentry\n");  			kfree(path);  			return ERR_PTR(-EINVAL);  		}  	} -	if (pos != 0) { +	rcu_read_unlock(); +	if (pos != 0 || read_seqretry(&rename_lock, seq)) {  		pr_err("build_path did not end path lookup where "  		       "expected, namelen is %d, pos is %d\n", len, pos);  		/* presumably this is only possible if racing with a diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 3e298997629..bc4b12ca537 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -35,6 +35,7 @@  #include <linux/delay.h>  #include <linux/kthread.h>  #include <linux/freezer.h> +#include <linux/namei.h>  #include <net/ipv6.h>  #include "cifsfs.h"  #include "cifspdu.h" @@ -542,14 +543,12 @@ static const struct super_operations cifs_super_ops = {  static struct dentry *  cifs_get_root(struct smb_vol *vol, struct super_block *sb)  { -	int xid, rc; -	struct inode *inode; -	struct qstr name; -	struct dentry *dparent = NULL, *dchild = NULL, *alias; +	struct dentry *dentry;  	struct cifs_sb_info *cifs_sb = CIFS_SB(sb); -	unsigned int i, full_len, len; -	char *full_path = NULL, *pstart; +	char *full_path = NULL; +	char *s, *p;  	char sep; +	int xid;  	full_path = cifs_build_path_to_root(vol, cifs_sb,  					    cifs_sb_master_tcon(cifs_sb)); @@ -560,73 +559,32 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb)  	xid = GetXid();  	sep = CIFS_DIR_SEP(cifs_sb); -	dparent = dget(sb->s_root); -	full_len = strlen(full_path); -	full_path[full_len] = sep; -	pstart = full_path + 1; +	dentry = dget(sb->s_root); +	p = s = full_path; -	for (i = 1, len = 0; i <= full_len; i++) { -		if (full_path[i] != sep || !len) { -			len++; -			continue; -		} +	do { +		struct inode *dir = dentry->d_inode; +		struct dentry *child; -		full_path[i] = 0; -		cFYI(1, "get dentry for %s", pstart); +		/* skip separators */ +		while (*s == sep) +			s++; +		if (!*s) +			break; +		p = s++; +		/* next separator */ +		while (*s && *s != sep) +			s++; -		name.name = pstart; -		name.len = len; -		name.hash = full_name_hash(pstart, len); -		dchild = d_lookup(dparent, &name); -		if (dchild == NULL) { -			cFYI(1, "not exists"); -			dchild = d_alloc(dparent, &name); -			if (dchild == NULL) { -				dput(dparent); -				dparent = ERR_PTR(-ENOMEM); -				goto out; -			} -		} - -		cFYI(1, "get inode"); -		if (dchild->d_inode == NULL) { -			cFYI(1, "not exists"); -			inode = NULL; -			if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext) -				rc = cifs_get_inode_info_unix(&inode, full_path, -							      sb, xid); -			else -				rc = cifs_get_inode_info(&inode, full_path, -							 NULL, sb, xid, NULL); -			if (rc) { -				dput(dchild); -				dput(dparent); -				dparent = ERR_PTR(rc); -				goto out; -			} -			alias = d_materialise_unique(dchild, inode); -			if (alias != NULL) { -				dput(dchild); -				if (IS_ERR(alias)) { -					dput(dparent); -					dparent = ERR_PTR(-EINVAL); /* XXX */ -					goto out; -				} -				dchild = alias; -			} -		} -		cFYI(1, "parent %p, child %p", dparent, dchild); - -		dput(dparent); -		dparent = dchild; -		len = 0; -		pstart = full_path + i + 1; -		full_path[i] = sep; -	} -out: +		mutex_lock(&dir->i_mutex); +		child = lookup_one_len(p, dentry, s - p); +		mutex_unlock(&dir->i_mutex); +		dput(dentry); +		dentry = child; +	} while (!IS_ERR(dentry));  	_FreeXid(xid);  	kfree(full_path); -	return dparent; +	return dentry;  }  static int cifs_set_super(struct super_block *sb, void *data) diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index 0900e1658c9..036ca83e5f4 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h @@ -129,5 +129,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);  extern const struct export_operations cifs_export_ops;  #endif /* CIFS_NFSD_EXPORT */ -#define CIFS_VERSION   "1.73" +#define CIFS_VERSION   "1.74"  #endif				/* _CIFSFS_H */ diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index dbd669cc5bc..ccc1afa0bf3 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -3485,7 +3485,7 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)  		goto out;  	} -	snprintf(username, MAX_USERNAME_SIZE, "krb50x%x", fsuid); +	snprintf(username, sizeof(username), "krb50x%x", fsuid);  	vol_info->username = username;  	vol_info->local_nls = cifs_sb->local_nls;  	vol_info->linux_uid = fsuid; diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 81914df47ef..fa8c21d913b 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c @@ -55,6 +55,7 @@ build_path_from_dentry(struct dentry *direntry)  	char dirsep;  	struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);  	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); +	unsigned seq;  	if (direntry == NULL)  		return NULL;  /* not much we can do if dentry is freed and @@ -68,22 +69,29 @@ build_path_from_dentry(struct dentry *direntry)  		dfsplen = 0;  cifs_bp_rename_retry:  	namelen = dfsplen; +	seq = read_seqbegin(&rename_lock); +	rcu_read_lock();  	for (temp = direntry; !IS_ROOT(temp);) {  		namelen += (1 + temp->d_name.len);  		temp = temp->d_parent;  		if (temp == NULL) {  			cERROR(1, "corrupt dentry"); +			rcu_read_unlock();  			return NULL;  		}  	} +	rcu_read_unlock();  	full_path = kmalloc(namelen+1, GFP_KERNEL);  	if (full_path == NULL)  		return full_path;  	full_path[namelen] = 0;	/* trailing null */ +	rcu_read_lock();  	for (temp = direntry; !IS_ROOT(temp);) { +		spin_lock(&temp->d_lock);  		namelen -= 1 + temp->d_name.len;  		if (namelen < 0) { +			spin_unlock(&temp->d_lock);  			break;  		} else {  			full_path[namelen] = dirsep; @@ -91,14 +99,17 @@ cifs_bp_rename_retry:  				temp->d_name.len);  			cFYI(0, "name: %s", full_path + namelen);  		} +		spin_unlock(&temp->d_lock);  		temp = temp->d_parent;  		if (temp == NULL) {  			cERROR(1, "corrupt dentry"); +			rcu_read_unlock();  			kfree(full_path);  			return NULL;  		}  	} -	if (namelen != dfsplen) { +	rcu_read_unlock(); +	if (namelen != dfsplen || read_seqretry(&rename_lock, seq)) {  		cERROR(1, "did not end path lookup where expected namelen is %d",  			namelen);  		/* presumably this is only possible if racing with a rename diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 3892ab817a3..d3e619692ee 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c @@ -428,8 +428,7 @@ static void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,  			(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {  		flags |= NTLMSSP_NEGOTIATE_SIGN;  		if (!ses->server->session_estab) -			flags |= NTLMSSP_NEGOTIATE_KEY_XCH | -				NTLMSSP_NEGOTIATE_EXTENDED_SEC; +			flags |= NTLMSSP_NEGOTIATE_KEY_XCH;  	}  	sec_blob->NegotiateFlags = cpu_to_le32(flags); @@ -465,10 +464,11 @@ static int build_ntlmssp_auth_blob(unsigned char *pbuffer,  		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |  		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;  	if (ses->server->sec_mode & -	   (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) +	   (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {  		flags |= NTLMSSP_NEGOTIATE_SIGN; -	if (ses->server->sec_mode & SECMODE_SIGN_REQUIRED) -		flags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN; +		if (!ses->server->session_estab) +			flags |= NTLMSSP_NEGOTIATE_KEY_XCH; +	}  	tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE);  	sec_blob->NegotiateFlags = cpu_to_le32(flags); diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index e141939080f..739fb59bcdc 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -37,7 +37,7 @@ static DEFINE_MUTEX(read_mutex);  /* These macros may change in future, to provide better st_ino semantics. */  #define OFFSET(x)	((x)->i_ino) -static unsigned long cramino(struct cramfs_inode *cino, unsigned int offset) +static unsigned long cramino(const struct cramfs_inode *cino, unsigned int offset)  {  	if (!cino->offset)  		return offset + 1; @@ -61,7 +61,7 @@ static unsigned long cramino(struct cramfs_inode *cino, unsigned int offset)  }  static struct inode *get_cramfs_inode(struct super_block *sb, -	struct cramfs_inode *cramfs_inode, unsigned int offset) +	const struct cramfs_inode *cramfs_inode, unsigned int offset)  {  	struct inode *inode;  	static struct timespec zerotime; @@ -317,7 +317,7 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent)  	/* Set it all up.. */  	sb->s_op = &cramfs_ops;  	root = get_cramfs_inode(sb, &super.root, 0); -	if (!root) +	if (IS_ERR(root))  		goto out;  	sb->s_root = d_alloc_root(root);  	if (!sb->s_root) { @@ -423,6 +423,7 @@ static int cramfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)  {  	unsigned int offset = 0; +	struct inode *inode = NULL;  	int sorted;  	mutex_lock(&read_mutex); @@ -449,8 +450,8 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s  		for (;;) {  			if (!namelen) { -				mutex_unlock(&read_mutex); -				return ERR_PTR(-EIO); +				inode = ERR_PTR(-EIO); +				goto out;  			}  			if (name[namelen-1])  				break; @@ -462,17 +463,18 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s  		if (retval > 0)  			continue;  		if (!retval) { -			struct cramfs_inode entry = *de; -			mutex_unlock(&read_mutex); -			d_add(dentry, get_cramfs_inode(dir->i_sb, &entry, dir_off)); -			return NULL; +			inode = get_cramfs_inode(dir->i_sb, de, dir_off); +			break;  		}  		/* else (retval < 0) */  		if (sorted)  			break;  	} +out:  	mutex_unlock(&read_mutex); -	d_add(dentry, NULL); +	if (IS_ERR(inode)) +		return ERR_CAST(inode); +	d_add(dentry, inode);  	return NULL;  } diff --git a/fs/dcache.c b/fs/dcache.c index 37f72ee5bf7..6e4ea6d8777 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2213,14 +2213,15 @@ static void dentry_unlock_parents_for_move(struct dentry *dentry,   * The hash value has to match the hash queue that the dentry is on..   */  /* - * d_move - move a dentry + * __d_move - move a dentry   * @dentry: entry to move   * @target: new dentry   *   * Update the dcache to reflect the move of a file name. Negative - * dcache entries should not be moved in this way. + * dcache entries should not be moved in this way.  Caller hold + * rename_lock.   */ -void d_move(struct dentry * dentry, struct dentry * target) +static void __d_move(struct dentry * dentry, struct dentry * target)  {  	if (!dentry->d_inode)  		printk(KERN_WARNING "VFS: moving negative dcache entry\n"); @@ -2228,8 +2229,6 @@ void d_move(struct dentry * dentry, struct dentry * target)  	BUG_ON(d_ancestor(dentry, target));  	BUG_ON(d_ancestor(target, dentry)); -	write_seqlock(&rename_lock); -  	dentry_lock_for_move(dentry, target);  	write_seqcount_begin(&dentry->d_seq); @@ -2275,6 +2274,20 @@ void d_move(struct dentry * dentry, struct dentry * target)  	spin_unlock(&target->d_lock);  	fsnotify_d_move(dentry);  	spin_unlock(&dentry->d_lock); +} + +/* + * d_move - move a dentry + * @dentry: entry to move + * @target: new dentry + * + * Update the dcache to reflect the move of a file name. Negative + * dcache entries should not be moved in this way. + */ +void d_move(struct dentry *dentry, struct dentry *target) +{ +	write_seqlock(&rename_lock); +	__d_move(dentry, target);  	write_sequnlock(&rename_lock);  }  EXPORT_SYMBOL(d_move); @@ -2302,7 +2315,7 @@ struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)   * This helper attempts to cope with remotely renamed directories   *   * It assumes that the caller is already holding - * dentry->d_parent->d_inode->i_mutex and the inode->i_lock + * dentry->d_parent->d_inode->i_mutex, inode->i_lock and rename_lock   *   * Note: If ever the locking in lock_rename() changes, then please   * remember to update this too... @@ -2317,11 +2330,6 @@ static struct dentry *__d_unalias(struct inode *inode,  	if (alias->d_parent == dentry->d_parent)  		goto out_unalias; -	/* Check for loops */ -	ret = ERR_PTR(-ELOOP); -	if (d_ancestor(alias, dentry)) -		goto out_err; -  	/* See lock_rename() */  	ret = ERR_PTR(-EBUSY);  	if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex)) @@ -2331,7 +2339,7 @@ static struct dentry *__d_unalias(struct inode *inode,  		goto out_err;  	m2 = &alias->d_parent->d_inode->i_mutex;  out_unalias: -	d_move(alias, dentry); +	__d_move(alias, dentry);  	ret = alias;  out_err:  	spin_unlock(&inode->i_lock); @@ -2416,15 +2424,24 @@ struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)  		alias = __d_find_alias(inode, 0);  		if (alias) {  			actual = alias; -			/* Is this an anonymous mountpoint that we could splice -			 * into our tree? */ -			if (IS_ROOT(alias)) { +			write_seqlock(&rename_lock); + +			if (d_ancestor(alias, dentry)) { +				/* Check for loops */ +				actual = ERR_PTR(-ELOOP); +			} else if (IS_ROOT(alias)) { +				/* Is this an anonymous mountpoint that we +				 * could splice into our tree? */  				__d_materialise_dentry(dentry, alias); +				write_sequnlock(&rename_lock);  				__d_drop(alias);  				goto found; +			} else { +				/* Nope, but we must(!) avoid directory +				 * aliasing */ +				actual = __d_unalias(inode, dentry, alias);  			} -			/* Nope, but we must(!) avoid directory aliasing */ -			actual = __d_unalias(inode, dentry, alias); +			write_sequnlock(&rename_lock);  			if (IS_ERR(actual))  				dput(alias);  			goto out_nolock; diff --git a/fs/exofs/super.c b/fs/exofs/super.c index 06065bd37fc..c57beddcc21 100644 --- a/fs/exofs/super.c +++ b/fs/exofs/super.c @@ -913,7 +913,7 @@ struct dentry *exofs_get_parent(struct dentry *child)  	unsigned long ino = exofs_parent_ino(child);  	if (!ino) -		return NULL; +		return ERR_PTR(-ESTALE);  	return d_obtain_alias(exofs_iget(child->d_inode->i_sb, ino));  } diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 802ac5eeba2..f9fbbe96c22 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -1069,6 +1069,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)  		return 0;  	gfs2_log_lock(sdp); +	spin_lock(&sdp->sd_ail_lock);  	head = bh = page_buffers(page);  	do {  		if (atomic_read(&bh->b_count)) @@ -1080,6 +1081,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)  			goto not_possible;  		bh = bh->b_this_page;  	} while(bh != head); +	spin_unlock(&sdp->sd_ail_lock);  	gfs2_log_unlock(sdp);  	head = bh = page_buffers(page); @@ -1112,6 +1114,7 @@ not_possible: /* Should never happen */  	WARN_ON(buffer_dirty(bh));  	WARN_ON(buffer_pinned(bh));  cannot_release: +	spin_unlock(&sdp->sd_ail_lock);  	gfs2_log_unlock(sdp);  	return 0;  } diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 8ef70f46473..2cca29316bd 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -47,10 +47,10 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl)  				bd_ail_gl_list);  		bh = bd->bd_bh;  		gfs2_remove_from_ail(bd); -		spin_unlock(&sdp->sd_ail_lock); -  		bd->bd_bh = NULL;  		bh->b_private = NULL; +		spin_unlock(&sdp->sd_ail_lock); +  		bd->bd_blkno = bh->b_blocknr;  		gfs2_log_lock(sdp);  		gfs2_assert_withdraw(sdp, !buffer_busy(bh)); @@ -221,8 +221,10 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags)  		}  	} -	if (ip == GFS2_I(gl->gl_sbd->sd_rindex)) +	if (ip == GFS2_I(gl->gl_sbd->sd_rindex)) { +		gfs2_log_flush(gl->gl_sbd, NULL);  		gl->gl_sbd->sd_rindex_uptodate = 0; +	}  	if (ip && S_ISREG(ip->i_inode.i_mode))  		truncate_inode_pages(ip->i_inode.i_mapping, 0);  } diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 0a064e91ac7..81206e70cbf 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h @@ -17,6 +17,7 @@  #include <linux/buffer_head.h>  #include <linux/rcupdate.h>  #include <linux/rculist_bl.h> +#include <linux/completion.h>  #define DIO_WAIT	0x00000010  #define DIO_METADATA	0x00000020 @@ -546,6 +547,7 @@ struct gfs2_sbd {  	struct gfs2_glock *sd_trans_gl;  	wait_queue_head_t sd_glock_wait;  	atomic_t sd_glock_disposal; +	struct completion sd_locking_init;  	/* Inode Stuff */ diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index 903115f2bb3..85c62923ee2 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c @@ -903,6 +903,7 @@ void gfs2_meta_syncfs(struct gfs2_sbd *sdp)  		if (gfs2_ail1_empty(sdp))  			break;  	} +	gfs2_log_flush(sdp, NULL);  }  static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp) diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 8ac9ae189b5..2a77071fb7b 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -72,6 +72,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)  	init_waitqueue_head(&sdp->sd_glock_wait);  	atomic_set(&sdp->sd_glock_disposal, 0); +	init_completion(&sdp->sd_locking_init);  	spin_lock_init(&sdp->sd_statfs_spin);  	spin_lock_init(&sdp->sd_rindex_spin); @@ -1017,11 +1018,13 @@ hostdata_error:  		fsname++;  	if (lm->lm_mount == NULL) {  		fs_info(sdp, "Now mounting FS...\n"); +		complete(&sdp->sd_locking_init);  		return 0;  	}  	ret = lm->lm_mount(sdp, fsname);  	if (ret == 0)  		fs_info(sdp, "Joined cluster. Now mounting FS...\n"); +	complete(&sdp->sd_locking_init);  	return ret;  } diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index ed540e7018b..fb0edf73548 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -757,13 +757,17 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)  	struct timespec atime;  	struct gfs2_dinode *di;  	int ret = -EAGAIN; +	int unlock_required = 0;  	/* Skip timestamp update, if this is from a memalloc */  	if (current->flags & PF_MEMALLOC)  		goto do_flush; -	ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); -	if (ret) -		goto do_flush; +	if (!gfs2_glock_is_locked_by_me(ip->i_gl)) { +		ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); +		if (ret) +			goto do_flush; +		unlock_required = 1; +	}  	ret = gfs2_trans_begin(sdp, RES_DINODE, 0);  	if (ret)  		goto do_unlock; @@ -780,7 +784,8 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)  	}  	gfs2_trans_end(sdp);  do_unlock: -	gfs2_glock_dq_uninit(&gh); +	if (unlock_required) +		gfs2_glock_dq_uninit(&gh);  do_flush:  	if (wbc->sync_mode == WB_SYNC_ALL)  		gfs2_log_flush(GFS2_SB(inode), ip->i_gl); @@ -1427,7 +1432,20 @@ out:  	return error;  } -/* +/** + * gfs2_evict_inode - Remove an inode from cache + * @inode: The inode to evict + * + * There are three cases to consider: + * 1. i_nlink == 0, we are final opener (and must deallocate) + * 2. i_nlink == 0, we are not the final opener (and cannot deallocate) + * 3. i_nlink > 0 + * + * If the fs is read only, then we have to treat all cases as per #3 + * since we are unable to do any deallocation. The inode will be + * deallocated by the next read/write node to attempt an allocation + * in the same resource group + *   * We have to (at the moment) hold the inodes main lock to cover   * the gap between unlocking the shared lock on the iopen lock and   * taking the exclusive lock. I'd rather do a shared -> exclusive @@ -1470,6 +1488,8 @@ static void gfs2_evict_inode(struct inode *inode)  	if (error)  		goto out_truncate; +	/* Case 1 starts here */ +  	if (S_ISDIR(inode->i_mode) &&  	    (ip->i_diskflags & GFS2_DIF_EXHASH)) {  		error = gfs2_dir_exhash_dealloc(ip); @@ -1493,13 +1513,16 @@ static void gfs2_evict_inode(struct inode *inode)  	goto out_unlock;  out_truncate: +	/* Case 2 starts here */  	error = gfs2_trans_begin(sdp, 0, sdp->sd_jdesc->jd_blocks);  	if (error)  		goto out_unlock; -	gfs2_final_release_pages(ip); +	/* Needs to be done before glock release & also in a transaction */ +	truncate_inode_pages(&inode->i_data, 0);  	gfs2_trans_end(sdp);  out_unlock: +	/* Error path for case 1 */  	if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags))  		gfs2_glock_dq(&ip->i_iopen_gh);  	gfs2_holder_uninit(&ip->i_iopen_gh); @@ -1507,6 +1530,7 @@ out_unlock:  	if (error && error != GLR_TRYFAILED && error != -EROFS)  		fs_warn(sdp, "gfs2_evict_inode: %d\n", error);  out: +	/* Case 3 starts here */  	truncate_inode_pages(&inode->i_data, 0);  	end_writeback(inode); diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index e20eab37bc8..443cabcfcd2 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c @@ -338,6 +338,9 @@ static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len)  	rv = sscanf(buf, "%u", &first);  	if (rv != 1 || first > 1)  		return -EINVAL; +	rv = wait_for_completion_killable(&sdp->sd_locking_init); +	if (rv) +		return rv;  	spin_lock(&sdp->sd_jindex_spin);  	rv = -EBUSY;  	if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0) @@ -414,7 +417,9 @@ static ssize_t jid_store(struct gfs2_sbd *sdp, const char *buf, size_t len)  	rv = sscanf(buf, "%d", &jid);  	if (rv != 1)  		return -EINVAL; - +	rv = wait_for_completion_killable(&sdp->sd_locking_init); +	if (rv) +		return rv;  	spin_lock(&sdp->sd_jindex_spin);  	rv = -EINVAL;  	if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index 87ed48e0343..85c098a499f 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c @@ -139,7 +139,8 @@ static int file_removed(struct dentry *dentry, const char *file)  static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,  				   struct nameidata *nd)  { -	struct dentry *proc_dentry, *new, *parent; +	struct dentry *proc_dentry, *parent; +	struct qstr *name = &dentry->d_name;  	struct inode *inode;  	int err, deleted; @@ -149,23 +150,9 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,  	else if (deleted)  		return ERR_PTR(-ENOENT); -	err = -ENOMEM;  	parent = HPPFS_I(ino)->proc_dentry;  	mutex_lock(&parent->d_inode->i_mutex); -	proc_dentry = d_lookup(parent, &dentry->d_name); -	if (proc_dentry == NULL) { -		proc_dentry = d_alloc(parent, &dentry->d_name); -		if (proc_dentry == NULL) { -			mutex_unlock(&parent->d_inode->i_mutex); -			goto out; -		} -		new = (*parent->d_inode->i_op->lookup)(parent->d_inode, -						       proc_dentry, NULL); -		if (new) { -			dput(proc_dentry); -			proc_dentry = new; -		} -	} +	proc_dentry = lookup_one_len(name->name, parent, name->len);  	mutex_unlock(&parent->d_inode->i_mutex);  	if (IS_ERR(proc_dentry)) @@ -174,13 +161,11 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,  	err = -ENOMEM;  	inode = get_inode(ino->i_sb, proc_dentry);  	if (!inode) -		goto out_dput; +		goto out;   	d_add(dentry, inode);  	return NULL; - out_dput: -	dput(proc_dentry);   out:  	return ERR_PTR(err);  } @@ -690,8 +675,10 @@ static struct inode *get_inode(struct super_block *sb, struct dentry *dentry)  	struct inode *proc_ino = dentry->d_inode;  	struct inode *inode = new_inode(sb); -	if (!inode) +	if (!inode) { +		dput(dentry);  		return ERR_PTR(-ENOMEM); +	}  	if (S_ISDIR(dentry->d_inode->i_mode)) {  		inode->i_op = &hppfs_dir_iops; @@ -704,7 +691,7 @@ static struct inode *get_inode(struct super_block *sb, struct dentry *dentry)  		inode->i_fop = &hppfs_file_fops;  	} -	HPPFS_I(inode)->proc_dentry = dget(dentry); +	HPPFS_I(inode)->proc_dentry = dentry;  	inode->i_uid = proc_ino->i_uid;  	inode->i_gid = proc_ino->i_gid; @@ -737,7 +724,7 @@ static int hppfs_fill_super(struct super_block *sb, void *d, int silent)  	sb->s_fs_info = proc_mnt;  	err = -ENOMEM; -	root_inode = get_inode(sb, proc_mnt->mnt_sb->s_root); +	root_inode = get_inode(sb, dget(proc_mnt->mnt_sb->s_root));  	if (!root_inode)  		goto out_mntput; diff --git a/fs/libfs.c b/fs/libfs.c index c88eab55aec..275ca4749a2 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -822,7 +822,7 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,  		goto out;  	attr->set_buf[size] = '\0'; -	val = simple_strtol(attr->set_buf, NULL, 0); +	val = simple_strtoll(attr->set_buf, NULL, 0);  	ret = attr->set(attr->data, val);  	if (ret == 0)  		ret = len; /* on success, claim we got the whole input */ diff --git a/fs/namei.c b/fs/namei.c index 0223c41fb11..14ab8d3f2f0 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -433,6 +433,8 @@ static int unlazy_walk(struct nameidata *nd, struct dentry *dentry)  			goto err_parent;  		BUG_ON(nd->inode != parent->d_inode);  	} else { +		if (dentry->d_parent != parent) +			goto err_parent;  		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);  		if (!__d_rcu_to_refcount(dentry, nd->seq))  			goto err_child; @@ -940,7 +942,6 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,  		 * Don't forget we might have a non-mountpoint managed dentry  		 * that wants to block transit.  		 */ -		*inode = path->dentry->d_inode;  		if (unlikely(managed_dentry_might_block(path->dentry)))  			return false; @@ -953,6 +954,12 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,  		path->mnt = mounted;  		path->dentry = mounted->mnt_root;  		nd->seq = read_seqcount_begin(&path->dentry->d_seq); +		/* +		 * Update the inode too. We don't need to re-check the +		 * dentry sequence number here after this d_inode read, +		 * because a mount-point is always pinned. +		 */ +		*inode = path->dentry->d_inode;  	}  	return true;  } diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 29309e25417..b57aab9a118 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c @@ -56,16 +56,12 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru  	lock_ufs(dir->i_sb);  	ino = ufs_inode_by_name(dir, &dentry->d_name); -	if (ino) { +	if (ino)  		inode = ufs_iget(dir->i_sb, ino); -		if (IS_ERR(inode)) { -			unlock_ufs(dir->i_sb); -			return ERR_CAST(inode); -		} -	}  	unlock_ufs(dir->i_sb); -	d_add(dentry, inode); -	return NULL; +	if (IS_ERR(inode)) +		return ERR_CAST(inode); +	return d_splice_alias(inode, dentry);  }  /* diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 3a10ef5914e..6cd5b6403a7 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -210,7 +210,7 @@ struct acpi_device_power_state {  struct acpi_device_power {  	int state;		/* Current state */  	struct acpi_device_power_flags flags; -	struct acpi_device_power_state states[4];	/* Power states (D0-D3) */ +	struct acpi_device_power_state states[ACPI_D_STATE_COUNT];	/* Power states (D0-D3Cold) */  };  /* Performance Management */ diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index a756bc8d866..4543b6f7586 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h @@ -98,8 +98,11 @@ acpi_os_table_override(struct acpi_table_header *existing_table,  /*   * Spinlock primitives   */ + +#ifndef acpi_os_create_lock  acpi_status  acpi_os_create_lock(acpi_spinlock *out_handle); +#endif  void acpi_os_delete_lock(acpi_spinlock handle); diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index 5d2a5e9544d..2ce1be9f629 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h @@ -159,6 +159,24 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)  	} while (0)  #endif +/* + * When lockdep is enabled, the spin_lock_init() macro stringifies it's + * argument and uses that as a name for the lock in debugging. + * By executing spin_lock_init() in a macro the key changes from "lock" for + * all locks to the name of the argument of acpi_os_create_lock(), which + * prevents lockdep from reporting false positives for ACPICA locks. + */ +#define acpi_os_create_lock(__handle)				\ +({								\ +	spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock));	\ +								\ +	if (lock) {						\ +		*(__handle) = lock;				\ +		spin_lock_init(*(__handle));			\ +	}							\ +	lock ? AE_OK : AE_NO_MEMORY;				\ +}) +  #endif /* __KERNEL__ */  #endif /* __ACLINUX_H__ */ diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index e08f344c6cf..3d53efd25ab 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h @@ -182,6 +182,7 @@  	{0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6758, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6759, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x675F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6760, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6761, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6762, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ @@ -192,6 +193,7 @@  	{0x1002, 0x6767, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6768, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6770, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ +	{0x1002, 0x6778, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6779, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \  	{0x1002, 0x6888, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 52c4e3835aa..25c805b2c9e 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1070,12 +1070,6 @@ struct net_device {  #define NETIF_F_ALL_FCOE	(NETIF_F_FCOE_CRC | NETIF_F_FCOE_MTU | \  				 NETIF_F_FSO) -#define NETIF_F_ALL_TX_OFFLOADS	(NETIF_F_ALL_CSUM | NETIF_F_SG | \ -				 NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \ -				 NETIF_F_HIGHDMA | \ -				 NETIF_F_SCTP_CSUM | \ -				 NETIF_F_ALL_FCOE) -  	/*  	 * If one device supports one of these features, then enable them  	 * for all in netdev_increment_features. diff --git a/include/linux/sdla.h b/include/linux/sdla.h index 564acd3a71c..9995c7fc3f6 100644 --- a/include/linux/sdla.h +++ b/include/linux/sdla.h @@ -112,11 +112,7 @@ struct sdla_dlci_conf {     short Tb_max;  }; -#ifndef __KERNEL__ - -void sdla(void *cfg_info, char *dev, struct frad_conf *conf, int quiet); - -#else +#ifdef __KERNEL__  /* important Z80 window addresses */  #define SDLA_CONTROL_WND		0xE000 diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 7e59ffb3d0b..ba06207b1dd 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -84,9 +84,32 @@ DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);  static struct rcu_state *rcu_state; +/* + * The rcu_scheduler_active variable transitions from zero to one just + * before the first task is spawned.  So when this variable is zero, RCU + * can assume that there is but one task, allowing RCU to (for example) + * optimized synchronize_sched() to a simple barrier().  When this variable + * is one, RCU must actually do all the hard work required to detect real + * grace periods.  This variable is also used to suppress boot-time false + * positives from lockdep-RCU error checking. + */  int rcu_scheduler_active __read_mostly;  EXPORT_SYMBOL_GPL(rcu_scheduler_active); +/* + * The rcu_scheduler_fully_active variable transitions from zero to one + * during the early_initcall() processing, which is after the scheduler + * is capable of creating new tasks.  So RCU processing (for example, + * creating tasks for RCU priority boosting) must be delayed until after + * rcu_scheduler_fully_active transitions from zero to one.  We also + * currently delay invocation of any RCU callbacks until after this point. + * + * It might later prove better for people registering RCU callbacks during + * early boot to take responsibility for these callbacks, but one step at + * a time. + */ +static int rcu_scheduler_fully_active __read_mostly; +  #ifdef CONFIG_RCU_BOOST  /* @@ -98,7 +121,6 @@ DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status);  DEFINE_PER_CPU(int, rcu_cpu_kthread_cpu);  DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops);  DEFINE_PER_CPU(char, rcu_cpu_has_work); -static char rcu_kthreads_spawnable;  #endif /* #ifdef CONFIG_RCU_BOOST */ @@ -1467,6 +1489,8 @@ static void rcu_process_callbacks(struct softirq_action *unused)   */  static void invoke_rcu_callbacks(struct rcu_state *rsp, struct rcu_data *rdp)  { +	if (unlikely(!ACCESS_ONCE(rcu_scheduler_fully_active))) +		return;  	if (likely(!rsp->boost)) {  		rcu_do_batch(rsp, rdp);  		return; diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 14dc7dd0090..75113cb7c4f 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h @@ -1532,7 +1532,7 @@ static int __cpuinit rcu_spawn_one_cpu_kthread(int cpu)  	struct sched_param sp;  	struct task_struct *t; -	if (!rcu_kthreads_spawnable || +	if (!rcu_scheduler_fully_active ||  	    per_cpu(rcu_cpu_kthread_task, cpu) != NULL)  		return 0;  	t = kthread_create(rcu_cpu_kthread, (void *)(long)cpu, "rcuc%d", cpu); @@ -1639,7 +1639,7 @@ static int __cpuinit rcu_spawn_one_node_kthread(struct rcu_state *rsp,  	struct sched_param sp;  	struct task_struct *t; -	if (!rcu_kthreads_spawnable || +	if (!rcu_scheduler_fully_active ||  	    rnp->qsmaskinit == 0)  		return 0;  	if (rnp->node_kthread_task == NULL) { @@ -1665,7 +1665,7 @@ static int __init rcu_spawn_kthreads(void)  	int cpu;  	struct rcu_node *rnp; -	rcu_kthreads_spawnable = 1; +	rcu_scheduler_fully_active = 1;  	for_each_possible_cpu(cpu) {  		per_cpu(rcu_cpu_has_work, cpu) = 0;  		if (cpu_online(cpu)) @@ -1687,7 +1687,7 @@ static void __cpuinit rcu_prepare_kthreads(int cpu)  	struct rcu_node *rnp = rdp->mynode;  	/* Fire up the incoming CPU's kthread and leaf rcu_node kthread. */ -	if (rcu_kthreads_spawnable) { +	if (rcu_scheduler_fully_active) {  		(void)rcu_spawn_one_cpu_kthread(cpu);  		if (rnp->node_kthread_task == NULL)  			(void)rcu_spawn_one_node_kthread(rcu_state, rnp); @@ -1726,6 +1726,13 @@ static void rcu_cpu_kthread_setrt(int cpu, int to_rt)  {  } +static int __init rcu_scheduler_really_started(void) +{ +	rcu_scheduler_fully_active = 1; +	return 0; +} +early_initcall(rcu_scheduler_really_started); +  static void __cpuinit rcu_prepare_kthreads(int cpu)  {  } diff --git a/kernel/sched.c b/kernel/sched.c index 9769c756ad6..3dc716f6d8a 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -7757,6 +7757,9 @@ static void init_cfs_rq(struct cfs_rq *cfs_rq, struct rq *rq)  #endif  #endif  	cfs_rq->min_vruntime = (u64)(-(1LL << 20)); +#ifndef CONFIG_64BIT +	cfs_rq->min_vruntime_copy = cfs_rq->min_vruntime; +#endif  }  static void init_rt_rq(struct rt_rq *rt_rq, struct rq *rq) diff --git a/mm/vmscan.c b/mm/vmscan.c index 5ed24b94c5e..d036e59d302 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2310,7 +2310,8 @@ static bool pgdat_balanced(pg_data_t *pgdat, unsigned long balanced_pages,  	for (i = 0; i <= classzone_idx; i++)  		present_pages += pgdat->node_zones[i].present_pages; -	return balanced_pages > (present_pages >> 2); +	/* A special case here: if zone has no page, we think it's balanced */ +	return balanced_pages >= (present_pages >> 2);  }  /* is kswapd sleeping prematurely? */ diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 49bb75294b7..934e221c1d0 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c @@ -530,7 +530,11 @@ static int vlan_dev_init(struct net_device *dev)  					  (1<<__LINK_STATE_DORMANT))) |  		      (1<<__LINK_STATE_PRESENT); -	dev->hw_features = NETIF_F_ALL_TX_OFFLOADS; +	dev->hw_features = NETIF_F_ALL_CSUM | NETIF_F_SG | +			   NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | +			   NETIF_F_HIGHDMA | NETIF_F_SCTP_CSUM | +			   NETIF_F_ALL_FCOE; +  	dev->features |= real_dev->vlan_features | NETIF_F_LLTX;  	dev->gso_max_size = real_dev->gso_max_size; diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index f7f8e2cd3f7..3204ba8a701 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -763,7 +763,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn)  					struct sock *parent = bt_sk(sk)->parent;  					rsp.result = cpu_to_le16(L2CAP_CR_PEND);  					rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND); -					parent->sk_data_ready(parent, 0); +					if (parent) +						parent->sk_data_ready(parent, 0);  				} else {  					l2cap_state_change(chan, BT_CONFIG); @@ -2523,8 +2524,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr  	sk = chan->sk; -	if ((bt_sk(sk)->defer_setup && chan->state != BT_CONNECT2) || -		 (!bt_sk(sk)->defer_setup && chan->state != BT_CONFIG)) { +	if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {  		struct l2cap_cmd_rej_cid rej;  		rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID); @@ -4150,7 +4150,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)  					struct sock *parent = bt_sk(sk)->parent;  					res = L2CAP_CR_PEND;  					stat = L2CAP_CS_AUTHOR_PEND; -					parent->sk_data_ready(parent, 0); +					if (parent) +						parent->sk_data_ready(parent, 0);  				} else {  					l2cap_state_change(chan, BT_CONFIG);  					res = L2CAP_CR_SUCCESS; diff --git a/net/ceph/ceph_fs.c b/net/ceph/ceph_fs.c index a3a3a31d3c3..41466ccb972 100644 --- a/net/ceph/ceph_fs.c +++ b/net/ceph/ceph_fs.c @@ -36,16 +36,19 @@ int ceph_flags_to_mode(int flags)  	if ((flags & O_DIRECTORY) == O_DIRECTORY)  		return CEPH_FILE_MODE_PIN;  #endif -	if ((flags & O_APPEND) == O_APPEND) -		flags |= O_WRONLY; -	if ((flags & O_ACCMODE) == O_RDWR) -		mode = CEPH_FILE_MODE_RDWR; -	else if ((flags & O_ACCMODE) == O_WRONLY) +	switch (flags & O_ACCMODE) { +	case O_WRONLY:  		mode = CEPH_FILE_MODE_WR; -	else +		break; +	case O_RDONLY:  		mode = CEPH_FILE_MODE_RD; - +		break; +	case O_RDWR: +	case O_ACCMODE: /* this is what the VFS does */ +		mode = CEPH_FILE_MODE_RDWR; +		break; +	}  #ifdef O_LAZY  	if (flags & O_LAZY)  		mode |= CEPH_FILE_MODE_LAZY; diff --git a/net/sctp/output.c b/net/sctp/output.c index b4f3cf06d8d..08b3cead650 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -500,23 +500,20 @@ int sctp_packet_transmit(struct sctp_packet *packet)  	 * Note: Adler-32 is no longer applicable, as has been replaced  	 * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>.  	 */ -	if (!sctp_checksum_disable && -	    !(dst->dev->features & (NETIF_F_NO_CSUM | NETIF_F_SCTP_CSUM))) { -		__u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); +	if (!sctp_checksum_disable) { +		if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) { +			__u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); -		/* 3) Put the resultant value into the checksum field in the -		 *    common header, and leave the rest of the bits unchanged. -		 */ -		sh->checksum = sctp_end_cksum(crc32); -	} else { -		if (dst->dev->features & NETIF_F_SCTP_CSUM) { +			/* 3) Put the resultant value into the checksum field in the +			 *    common header, and leave the rest of the bits unchanged. +			 */ +			sh->checksum = sctp_end_cksum(crc32); +		} else {  			/* no need to seed pseudo checksum for SCTP */  			nskb->ip_summed = CHECKSUM_PARTIAL;  			nskb->csum_start = (skb_transport_header(nskb) -  			                    nskb->head);  			nskb->csum_offset = offsetof(struct sctphdr, checksum); -		} else { -			nskb->ip_summed = CHECKSUM_UNNECESSARY;  		}  	} diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index c2fc0356c2a..83014a7c2e1 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -1190,7 +1190,6 @@ SND_SOC_DAPM_INPUT("DMIC1DAT"),  SND_SOC_DAPM_INPUT("DMIC2DAT"),  SND_SOC_DAPM_INPUT("Clock"), -SND_SOC_DAPM_MICBIAS("MICBIAS", WM8994_MICBIAS, 2, 0),  SND_SOC_DAPM_SUPPLY_S("MICBIAS Supply", 1, SND_SOC_NOPM, 0, 0, micbias_ev,  		      SND_SOC_DAPM_PRE_PMU), @@ -1509,8 +1508,10 @@ static const struct snd_soc_dapm_route wm8994_revd_intercon[] = {  	{ "AIF2DACDAT", NULL, "AIF1DACDAT" },  	{ "AIF1ADCDAT", NULL, "AIF2ADCDAT" },  	{ "AIF2ADCDAT", NULL, "AIF1ADCDAT" }, -	{ "MICBIAS", NULL, "CLK_SYS" }, -	{ "MICBIAS", NULL, "MICBIAS Supply" }, +	{ "MICBIAS1", NULL, "CLK_SYS" }, +	{ "MICBIAS1", NULL, "MICBIAS Supply" }, +	{ "MICBIAS2", NULL, "CLK_SYS" }, +	{ "MICBIAS2", NULL, "MICBIAS Supply" },  };  static const struct snd_soc_dapm_route wm8994_intercon[] = { @@ -2763,7 +2764,7 @@ static void wm8958_default_micdet(u16 status, void *data)  	report = SND_JACK_MICROPHONE;  	/* Everything else is buttons; just assign slots */ -	if (status & 0x1c0) +	if (status & 0x1c)  		report |= SND_JACK_BTN_0;  done: diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index d6f4703b3c0..770a71a1536 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c @@ -97,7 +97,7 @@ static int fsi_ak4642_remove(struct platform_device *pdev)  static struct fsi_ak4642_data fsi_a_ak4642 = {  	.name		= "AK4642", -	.card		= "FSIA (AK4642)", +	.card		= "FSIA-AK4642",  	.cpu_dai	= "fsia-dai",  	.codec		= "ak4642-codec.0-0012",  	.platform	= "sh_fsi.0", @@ -106,7 +106,7 @@ static struct fsi_ak4642_data fsi_a_ak4642 = {  static struct fsi_ak4642_data fsi_b_ak4642 = {  	.name		= "AK4642", -	.card		= "FSIB (AK4642)", +	.card		= "FSIB-AK4642",  	.cpu_dai	= "fsib-dai",  	.codec		= "ak4642-codec.0-0012",  	.platform	= "sh_fsi.0", @@ -115,7 +115,7 @@ static struct fsi_ak4642_data fsi_b_ak4642 = {  static struct fsi_ak4642_data fsi_a_ak4643 = {  	.name		= "AK4643", -	.card		= "FSIA (AK4643)", +	.card		= "FSIA-AK4643",  	.cpu_dai	= "fsia-dai",  	.codec		= "ak4642-codec.0-0013",  	.platform	= "sh_fsi.0", @@ -124,7 +124,7 @@ static struct fsi_ak4642_data fsi_a_ak4643 = {  static struct fsi_ak4642_data fsi_b_ak4643 = {  	.name		= "AK4643", -	.card		= "FSIB (AK4643)", +	.card		= "FSIB-AK4643",  	.cpu_dai	= "fsib-dai",  	.codec		= "ak4642-codec.0-0013",  	.platform	= "sh_fsi.0", @@ -133,7 +133,7 @@ static struct fsi_ak4642_data fsi_b_ak4643 = {  static struct fsi_ak4642_data fsi2_a_ak4642 = {  	.name		= "AK4642", -	.card		= "FSI2A (AK4642)", +	.card		= "FSI2A-AK4642",  	.cpu_dai	= "fsia-dai",  	.codec		= "ak4642-codec.0-0012",  	.platform	= "sh_fsi2", @@ -142,7 +142,7 @@ static struct fsi_ak4642_data fsi2_a_ak4642 = {  static struct fsi_ak4642_data fsi2_b_ak4642 = {  	.name		= "AK4642", -	.card		= "FSI2B (AK4642)", +	.card		= "FSI2B-AK4642",  	.cpu_dai	= "fsib-dai",  	.codec		= "ak4642-codec.0-0012",  	.platform	= "sh_fsi2", @@ -151,7 +151,7 @@ static struct fsi_ak4642_data fsi2_b_ak4642 = {  static struct fsi_ak4642_data fsi2_a_ak4643 = {  	.name		= "AK4643", -	.card		= "FSI2A (AK4643)", +	.card		= "FSI2A-AK4643",  	.cpu_dai	= "fsia-dai",  	.codec		= "ak4642-codec.0-0013",  	.platform	= "sh_fsi2", @@ -160,7 +160,7 @@ static struct fsi_ak4642_data fsi2_a_ak4643 = {  static struct fsi_ak4642_data fsi2_b_ak4643 = {  	.name		= "AK4643", -	.card		= "FSI2B (AK4643)", +	.card		= "FSI2B-AK4643",  	.cpu_dai	= "fsib-dai",  	.codec		= "ak4642-codec.0-0013",  	.platform	= "sh_fsi2", diff --git a/sound/soc/sh/fsi-da7210.c b/sound/soc/sh/fsi-da7210.c index dbafd7ac559..59553fd8c2f 100644 --- a/sound/soc/sh/fsi-da7210.c +++ b/sound/soc/sh/fsi-da7210.c @@ -42,7 +42,7 @@ static struct snd_soc_dai_link fsi_da7210_dai = {  };  static struct snd_soc_card fsi_soc_card = { -	.name		= "FSI (DA7210)", +	.name		= "FSI-DA7210",  	.dai_link	= &fsi_da7210_dai,  	.num_links	= 1,  }; diff --git a/sound/soc/sh/fsi-hdmi.c b/sound/soc/sh/fsi-hdmi.c index 9719985eb82..d3d9fd88068 100644 --- a/sound/soc/sh/fsi-hdmi.c +++ b/sound/soc/sh/fsi-hdmi.c @@ -83,13 +83,13 @@ static int fsi_hdmi_remove(struct platform_device *pdev)  static struct fsi_hdmi_data fsi2_a_hdmi = {  	.cpu_dai	= "fsia-dai", -	.card		= "FSI2A (SH MOBILE HDMI)", +	.card		= "FSI2A-HDMI",  	.id		= FSI_PORT_A,  };  static struct fsi_hdmi_data fsi2_b_hdmi = {  	.cpu_dai	= "fsib-dai", -	.card		= "FSI2B (SH MOBILE HDMI)", +	.card		= "FSI2B-HDMI",  	.id		= FSI_PORT_B,  };  |