Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: net/bluetooth/l2cap_core.c
This commit is contained in:
commit
033b1142f4
@ -40,7 +40,6 @@ Features which NILFS2 does not support yet:
|
|||||||
- POSIX ACLs
|
- POSIX ACLs
|
||||||
- quotas
|
- quotas
|
||||||
- fsck
|
- fsck
|
||||||
- resize
|
|
||||||
- defragmentation
|
- defragmentation
|
||||||
|
|
||||||
Mount options
|
Mount options
|
||||||
|
@ -520,7 +520,7 @@ static void __init evm_init_cpld(void)
|
|||||||
*/
|
*/
|
||||||
if (have_imager()) {
|
if (have_imager()) {
|
||||||
label = "HD imager";
|
label = "HD imager";
|
||||||
mux |= 1;
|
mux |= 2;
|
||||||
|
|
||||||
/* externally mux MMC1/ENET/AIC33 to imager */
|
/* externally mux MMC1/ENET/AIC33 to imager */
|
||||||
mux |= BIT(6) | BIT(5) | BIT(3);
|
mux |= BIT(6) | BIT(5) | BIT(3);
|
||||||
@ -540,7 +540,7 @@ static void __init evm_init_cpld(void)
|
|||||||
resets &= ~BIT(1);
|
resets &= ~BIT(1);
|
||||||
|
|
||||||
if (have_tvp7002()) {
|
if (have_tvp7002()) {
|
||||||
mux |= 2;
|
mux |= 1;
|
||||||
resets &= ~BIT(2);
|
resets &= ~BIT(2);
|
||||||
label = "tvp7002 HD";
|
label = "tvp7002 HD";
|
||||||
} else {
|
} else {
|
||||||
|
@ -254,8 +254,10 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)
|
|||||||
{
|
{
|
||||||
struct davinci_gpio_regs __iomem *g;
|
struct davinci_gpio_regs __iomem *g;
|
||||||
u32 mask = 0xffff;
|
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 */
|
/* we only care about one bank */
|
||||||
if (irq & 1)
|
if (irq & 1)
|
||||||
@ -274,11 +276,14 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)
|
|||||||
if (!status)
|
if (!status)
|
||||||
break;
|
break;
|
||||||
__raw_writel(status, &g->intstat);
|
__raw_writel(status, &g->intstat);
|
||||||
if (irq & 1)
|
|
||||||
status >>= 16;
|
|
||||||
|
|
||||||
/* now demux them to the right lowlevel handler */
|
/* 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) {
|
while (status) {
|
||||||
res = ffs(status);
|
res = ffs(status);
|
||||||
n += res;
|
n += res;
|
||||||
@ -424,7 +429,13 @@ static int __init davinci_gpio_irq_setup(void)
|
|||||||
|
|
||||||
/* set up all irqs in this bank */
|
/* set up all irqs in this bank */
|
||||||
irq_set_chained_handler(bank_irq, gpio_irq_handler);
|
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++) {
|
for (i = 0; i < 16 && gpio < ngpio; i++, irq++, gpio++) {
|
||||||
irq_set_chip(irq, &gpio_irqchip);
|
irq_set_chip(irq, &gpio_irqchip);
|
||||||
|
@ -52,6 +52,12 @@ davinci_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
|
|||||||
struct irq_chip_type *ct;
|
struct irq_chip_type *ct;
|
||||||
|
|
||||||
gc = irq_alloc_generic_chip("AINTC", 1, irq_start, base, handle_edge_irq);
|
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 = gc->chip_types;
|
||||||
ct->chip.irq_ack = irq_gc_ack_set_bit;
|
ct->chip.irq_ack = irq_gc_ack_set_bit;
|
||||||
ct->chip.irq_mask = irq_gc_mask_clr_bit;
|
ct->chip.irq_mask = irq_gc_mask_clr_bit;
|
||||||
|
@ -419,14 +419,20 @@ static void notrace ixp4xx_update_sched_clock(void)
|
|||||||
/*
|
/*
|
||||||
* clocksource
|
* clocksource
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static cycle_t ixp4xx_clocksource_read(struct clocksource *c)
|
||||||
|
{
|
||||||
|
return *IXP4XX_OSTS;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long ixp4xx_timer_freq = IXP4XX_TIMER_FREQ;
|
unsigned long ixp4xx_timer_freq = IXP4XX_TIMER_FREQ;
|
||||||
EXPORT_SYMBOL(ixp4xx_timer_freq);
|
EXPORT_SYMBOL(ixp4xx_timer_freq);
|
||||||
static void __init ixp4xx_clocksource_init(void)
|
static void __init ixp4xx_clocksource_init(void)
|
||||||
{
|
{
|
||||||
init_sched_clock(&cd, ixp4xx_update_sched_clock, 32, ixp4xx_timer_freq);
|
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_init(NULL, "OSTS", ixp4xx_timer_freq, 200, 32,
|
||||||
clocksource_mmio_readl_up);
|
ixp4xx_clocksource_read);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -113,7 +113,7 @@ static struct s3c2410_dma_chan *s3c64xx_dma_map_channel(unsigned int channel)
|
|||||||
return chan;
|
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);
|
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;
|
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);
|
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)
|
dma_addr_t data, int size)
|
||||||
{
|
{
|
||||||
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
||||||
@ -415,7 +415,7 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id,
|
|||||||
EXPORT_SYMBOL(s3c2410_dma_enqueue);
|
EXPORT_SYMBOL(s3c2410_dma_enqueue);
|
||||||
|
|
||||||
|
|
||||||
int s3c2410_dma_devconfig(unsigned int channel,
|
int s3c2410_dma_devconfig(enum dma_ch channel,
|
||||||
enum s3c2410_dmasrc source,
|
enum s3c2410_dmasrc source,
|
||||||
unsigned long devaddr)
|
unsigned long devaddr)
|
||||||
{
|
{
|
||||||
@ -463,7 +463,7 @@ int s3c2410_dma_devconfig(unsigned int channel,
|
|||||||
EXPORT_SYMBOL(s3c2410_dma_devconfig);
|
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)
|
dma_addr_t *src, dma_addr_t *dst)
|
||||||
{
|
{
|
||||||
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
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
|
* 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,
|
struct s3c2410_dma_client *client,
|
||||||
void *dev)
|
void *dev)
|
||||||
{
|
{
|
||||||
@ -533,7 +533,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);
|
|||||||
* allowed to go through.
|
* 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);
|
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -712,7 +712,7 @@ static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel);
|
|||||||
* get control of an dma 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,
|
struct s3c2410_dma_client *client,
|
||||||
void *dev)
|
void *dev)
|
||||||
{
|
{
|
||||||
@ -783,7 +783,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);
|
|||||||
* allowed to go through.
|
* 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);
|
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -974,7 +974,7 @@ static int s3c2410_dma_started(struct s3c2410_dma_chan *chan)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
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);
|
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)
|
* 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)
|
int xferunit)
|
||||||
{
|
{
|
||||||
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
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
|
* 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,
|
enum s3c2410_dmasrc source,
|
||||||
unsigned long devaddr)
|
unsigned long devaddr)
|
||||||
{
|
{
|
||||||
@ -1173,7 +1173,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig);
|
|||||||
* returns the current transfer points for the dma source and destination
|
* 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);
|
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
|
|||||||
* irq?
|
* 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);
|
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);
|
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);
|
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);
|
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);
|
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ struct s3c2410_dma_client {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct s3c2410_dma_chan;
|
struct s3c2410_dma_chan;
|
||||||
|
enum dma_ch;
|
||||||
|
|
||||||
/* s3c2410_dma_cbfn_t
|
/* s3c2410_dma_cbfn_t
|
||||||
*
|
*
|
||||||
@ -62,7 +63,7 @@ typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
|
|||||||
* request a dma channel exclusivley
|
* 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);
|
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
|
* 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
|
/* s3c2410_dma_setflags
|
||||||
*
|
*
|
||||||
* set the channel's flags to a given state
|
* 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);
|
unsigned int flags);
|
||||||
|
|
||||||
/* s3c2410_dma_free
|
/* 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)
|
* 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
|
/* 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.
|
* 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);
|
dma_addr_t data, int size);
|
||||||
|
|
||||||
/* s3c2410_dma_config
|
/* s3c2410_dma_config
|
||||||
@ -103,14 +104,14 @@ extern int s3c2410_dma_enqueue(unsigned int channel, void *id,
|
|||||||
* configure the dma channel
|
* 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
|
/* s3c2410_dma_devconfig
|
||||||
*
|
*
|
||||||
* configure the device we're talking to
|
* 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);
|
enum s3c2410_dmasrc source, unsigned long devaddr);
|
||||||
|
|
||||||
/* s3c2410_dma_getposition
|
/* 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
|
* 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);
|
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_opfn(enum dma_ch, s3c2410_dma_opfn_t rtn);
|
||||||
extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn);
|
extern int s3c2410_dma_set_buffdone_fn(enum dma_ch, s3c2410_dma_cbfn_t rtn);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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,
|
gc = irq_alloc_generic_chip("s3c-uart", 1, uirq->base_irq, reg_base,
|
||||||
handle_level_irq);
|
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 = gc->chip_types;
|
||||||
ct->chip.irq_ack = irq_gc_ack_set_bit;
|
ct->chip.irq_ack = irq_gc_ack_set_bit;
|
||||||
ct->chip.irq_mask = irq_gc_mask_set_bit;
|
ct->chip.irq_mask = irq_gc_mask_set_bit;
|
||||||
|
@ -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,
|
s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq,
|
||||||
S3C64XX_TINT_CSTAT, handle_level_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 = s3c_tgc->chip_types;
|
||||||
ct->chip.irq_mask = irq_gc_mask_clr_bit;
|
ct->chip.irq_mask = irq_gc_mask_clr_bit;
|
||||||
ct->chip.irq_unmask = irq_gc_mask_set_bit;
|
ct->chip.irq_unmask = irq_gc_mask_set_bit;
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <asm/i8259.h>
|
#include <asm/i8259.h>
|
||||||
@ -215,14 +215,13 @@ static void mask_and_ack_8259A(struct irq_data *d)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int i8259A_resume(struct sys_device *dev)
|
static void i8259A_resume(void)
|
||||||
{
|
{
|
||||||
if (i8259A_auto_eoi >= 0)
|
if (i8259A_auto_eoi >= 0)
|
||||||
init_8259A(i8259A_auto_eoi);
|
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
|
/* Put the i8259A into a quiescent state that
|
||||||
* the kernel initialization code can get it
|
* 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_MASTER_IMR); /* mask all of 8259A-1 */
|
||||||
outb(0xff, PIC_SLAVE_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 = {
|
static struct syscore_ops i8259_syscore_ops = {
|
||||||
.name = "i8259",
|
|
||||||
.resume = i8259A_resume,
|
.resume = i8259A_resume,
|
||||||
.shutdown = i8259A_shutdown,
|
.shutdown = i8259A_shutdown,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device device_i8259A = {
|
|
||||||
.id = 0,
|
|
||||||
.cls = &i8259_sysdev_class,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init i8259A_init_sysfs(void)
|
static int __init i8259A_init_sysfs(void)
|
||||||
{
|
{
|
||||||
int error = sysdev_class_register(&i8259_sysdev_class);
|
register_syscore_ops(&i8259_syscore_ops);
|
||||||
if (!error)
|
return 0;
|
||||||
error = sysdev_register(&device_i8259A);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(i8259A_init_sysfs);
|
device_initcall(i8259A_init_sysfs);
|
||||||
|
@ -18,7 +18,7 @@ extern void arch_local_irq_restore(unsigned long);
|
|||||||
extern unsigned long arch_local_irq_save(void);
|
extern unsigned long arch_local_irq_save(void);
|
||||||
extern void arch_local_irq_enable(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;
|
unsigned long flags;
|
||||||
|
|
||||||
@ -26,17 +26,17 @@ static inline unsigned long arch_local_save_flags(void)
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void arch_local_irq_disable(void)
|
static inline notrace void arch_local_irq_disable(void)
|
||||||
{
|
{
|
||||||
arch_local_irq_save();
|
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;
|
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());
|
return arch_irqs_disabled_flags(arch_local_save_flags());
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
static inline unsigned long arch_local_save_flags(void)
|
static inline notrace unsigned long arch_local_save_flags(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ static inline unsigned long arch_local_save_flags(void)
|
|||||||
return flags;
|
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__(
|
__asm__ __volatile__(
|
||||||
"wrpr %0, %%pil"
|
"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__(
|
__asm__ __volatile__(
|
||||||
"wrpr %0, %%pil"
|
"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__(
|
__asm__ __volatile__(
|
||||||
"wrpr 0, %%pil"
|
"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);
|
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());
|
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;
|
unsigned long flags, tmp;
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ maybe_smp4m_msg:
|
|||||||
WRITE_PAUSE
|
WRITE_PAUSE
|
||||||
wr %l4, PSR_ET, %psr
|
wr %l4, PSR_ET, %psr
|
||||||
WRITE_PAUSE
|
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:
|
maybe_smp4m_msg_check_single:
|
||||||
andcc %o2, 0x1, %g0
|
andcc %o2, 0x1, %g0
|
||||||
beq,a maybe_smp4m_msg_check_mask
|
beq,a maybe_smp4m_msg_check_mask
|
||||||
|
@ -226,7 +226,7 @@ void leon3_getCacheRegs(struct leon3_cacheregs *regs)
|
|||||||
* Leon2 and Leon3 differ in their way of telling cache information
|
* 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;
|
int flush_needed = -1;
|
||||||
unsigned int ssize, sets;
|
unsigned int ssize, sets;
|
||||||
|
@ -139,13 +139,23 @@ static int __init hest_parse_ghes(struct acpi_hest_header *hest_hdr, void *data)
|
|||||||
{
|
{
|
||||||
struct platform_device *ghes_dev;
|
struct platform_device *ghes_dev;
|
||||||
struct ghes_arr *ghes_arr = data;
|
struct ghes_arr *ghes_arr = data;
|
||||||
int rc;
|
int rc, i;
|
||||||
|
|
||||||
if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR)
|
if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!((struct acpi_hest_generic *)hest_hdr)->enabled)
|
if (!((struct acpi_hest_generic *)hest_hdr)->enabled)
|
||||||
return 0;
|
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);
|
ghes_dev = platform_device_alloc("GHES", hest_hdr->source_id);
|
||||||
if (!ghes_dev)
|
if (!ghes_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1332,23 +1332,6 @@ int acpi_resources_are_enforced(void)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(acpi_resources_are_enforced);
|
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.
|
* Deallocate the memory for a spinlock.
|
||||||
*/
|
*/
|
||||||
|
@ -180,6 +180,7 @@ static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
|||||||
break;
|
break;
|
||||||
case WM831X_GPIO_PULL_UP:
|
case WM831X_GPIO_PULL_UP:
|
||||||
pull = "pullup";
|
pull = "pullup";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
pull = "INVALID PULL";
|
pull = "INVALID PULL";
|
||||||
break;
|
break;
|
||||||
|
@ -53,23 +53,23 @@ static int adm1275_probe(struct i2c_client *client,
|
|||||||
info->direct[PSC_VOLTAGE_IN] = true;
|
info->direct[PSC_VOLTAGE_IN] = true;
|
||||||
info->direct[PSC_VOLTAGE_OUT] = true;
|
info->direct[PSC_VOLTAGE_OUT] = true;
|
||||||
info->direct[PSC_CURRENT_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->b[PSC_CURRENT_OUT] = 20475;
|
||||||
info->R[PSC_CURRENT_OUT] = -1;
|
info->R[PSC_CURRENT_OUT] = -1;
|
||||||
info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
|
info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
|
||||||
|
|
||||||
if (config & ADM1275_VRANGE) {
|
if (config & ADM1275_VRANGE) {
|
||||||
info->m[PSC_VOLTAGE_IN] = 19045;
|
info->m[PSC_VOLTAGE_IN] = 19199;
|
||||||
info->b[PSC_VOLTAGE_IN] = 0;
|
info->b[PSC_VOLTAGE_IN] = 0;
|
||||||
info->R[PSC_VOLTAGE_IN] = -2;
|
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->b[PSC_VOLTAGE_OUT] = 0;
|
||||||
info->R[PSC_VOLTAGE_OUT] = -2;
|
info->R[PSC_VOLTAGE_OUT] = -2;
|
||||||
} else {
|
} else {
|
||||||
info->m[PSC_VOLTAGE_IN] = 6666;
|
info->m[PSC_VOLTAGE_IN] = 6720;
|
||||||
info->b[PSC_VOLTAGE_IN] = 0;
|
info->b[PSC_VOLTAGE_IN] = 0;
|
||||||
info->R[PSC_VOLTAGE_IN] = -1;
|
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->b[PSC_VOLTAGE_OUT] = 0;
|
||||||
info->R[PSC_VOLTAGE_OUT] = -1;
|
info->R[PSC_VOLTAGE_OUT] = -1;
|
||||||
}
|
}
|
||||||
|
@ -674,6 +674,7 @@ static int atk_debugfs_gitm_get(void *p, u64 *val)
|
|||||||
else
|
else
|
||||||
err = -EIO;
|
err = -EIO;
|
||||||
|
|
||||||
|
ACPI_FREE(ret);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1538,7 +1538,7 @@ static struct attribute *it87_attributes_label[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct attribute_group it87_group_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 */
|
/* SuperIO detection - will change isa_address if a chip is found */
|
||||||
|
@ -40,6 +40,8 @@ struct max1111_data {
|
|||||||
struct spi_transfer xfer[2];
|
struct spi_transfer xfer[2];
|
||||||
uint8_t *tx_buf;
|
uint8_t *tx_buf;
|
||||||
uint8_t *rx_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)
|
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;
|
uint8_t v1, v2;
|
||||||
int err;
|
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) |
|
data->tx_buf[0] = (channel << MAX1111_CTRL_SEL_SH) |
|
||||||
MAX1111_CTRL_PD0 | MAX1111_CTRL_PD1 |
|
MAX1111_CTRL_PD0 | MAX1111_CTRL_PD1 |
|
||||||
MAX1111_CTRL_SGL | MAX1111_CTRL_UNI | MAX1111_CTRL_STR;
|
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);
|
err = spi_sync(data->spi, &data->msg);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(dev, "spi_sync failed with %d\n", err);
|
dev_err(dev, "spi_sync failed with %d\n", err);
|
||||||
|
mutex_unlock(&data->drvdata_lock);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
v1 = data->rx_buf[0];
|
v1 = data->rx_buf[0];
|
||||||
v2 = data->rx_buf[1];
|
v2 = data->rx_buf[1];
|
||||||
|
|
||||||
|
mutex_unlock(&data->drvdata_lock);
|
||||||
|
|
||||||
if ((v1 & 0xc0) || (v2 & 0x3f))
|
if ((v1 & 0xc0) || (v2 & 0x3f))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@ -176,6 +184,8 @@ static int __devinit max1111_probe(struct spi_device *spi)
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_free_data;
|
goto err_free_data;
|
||||||
|
|
||||||
|
mutex_init(&data->drvdata_lock);
|
||||||
|
|
||||||
data->spi = spi;
|
data->spi = spi;
|
||||||
spi_set_drvdata(spi, data);
|
spi_set_drvdata(spi, data);
|
||||||
|
|
||||||
@ -213,6 +223,7 @@ static int __devexit max1111_remove(struct spi_device *spi)
|
|||||||
|
|
||||||
hwmon_device_unregister(data->hwmon_dev);
|
hwmon_device_unregister(data->hwmon_dev);
|
||||||
sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group);
|
sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group);
|
||||||
|
mutex_destroy(&data->drvdata_lock);
|
||||||
kfree(data->rx_buf);
|
kfree(data->rx_buf);
|
||||||
kfree(data->tx_buf);
|
kfree(data->tx_buf);
|
||||||
kfree(data);
|
kfree(data);
|
||||||
|
@ -362,8 +362,8 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)
|
|||||||
* Convert linear sensor values to milli- or micro-units
|
* Convert linear sensor values to milli- or micro-units
|
||||||
* depending on sensor type.
|
* depending on sensor type.
|
||||||
*/
|
*/
|
||||||
static int pmbus_reg2data_linear(struct pmbus_data *data,
|
static long pmbus_reg2data_linear(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor)
|
struct pmbus_sensor *sensor)
|
||||||
{
|
{
|
||||||
s16 exponent;
|
s16 exponent;
|
||||||
s32 mantissa;
|
s32 mantissa;
|
||||||
@ -397,15 +397,15 @@ static int pmbus_reg2data_linear(struct pmbus_data *data,
|
|||||||
else
|
else
|
||||||
val >>= -exponent;
|
val >>= -exponent;
|
||||||
|
|
||||||
return (int)val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert direct sensor values to milli- or micro-units
|
* Convert direct sensor values to milli- or micro-units
|
||||||
* depending on sensor type.
|
* depending on sensor type.
|
||||||
*/
|
*/
|
||||||
static int pmbus_reg2data_direct(struct pmbus_data *data,
|
static long pmbus_reg2data_direct(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor)
|
struct pmbus_sensor *sensor)
|
||||||
{
|
{
|
||||||
long val = (s16) sensor->data;
|
long val = (s16) sensor->data;
|
||||||
long m, b, R;
|
long m, b, R;
|
||||||
@ -440,12 +440,12 @@ static int pmbus_reg2data_direct(struct pmbus_data *data,
|
|||||||
R++;
|
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])
|
if (data->info->direct[sensor->class])
|
||||||
val = pmbus_reg2data_direct(data, sensor);
|
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)
|
if (!s1 && !s2)
|
||||||
*val = !!regval;
|
*val = !!regval;
|
||||||
else {
|
else {
|
||||||
int v1, v2;
|
long v1, v2;
|
||||||
struct pmbus_sensor *sensor1, *sensor2;
|
struct pmbus_sensor *sensor1, *sensor2;
|
||||||
|
|
||||||
sensor1 = &data->sensors[s1];
|
sensor1 = &data->sensors[s1];
|
||||||
@ -661,7 +661,7 @@ static ssize_t pmbus_show_sensor(struct device *dev,
|
|||||||
if (sensor->data < 0)
|
if (sensor->data < 0)
|
||||||
return sensor->data;
|
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,
|
static ssize_t pmbus_set_sensor(struct device *dev,
|
||||||
|
@ -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 (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
|
||||||
if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
|
if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
|
||||||
goto err0;
|
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)
|
if ((ret = dvb_generic_open (inode, file)) < 0)
|
||||||
|
@ -168,7 +168,7 @@ config RADIO_MAXIRADIO
|
|||||||
|
|
||||||
config RADIO_MIROPCM20
|
config RADIO_MIROPCM20
|
||||||
tristate "miroSOUND PCM20 radio"
|
tristate "miroSOUND PCM20 radio"
|
||||||
depends on ISA && VIDEO_V4L2 && SND
|
depends on ISA && ISA_DMA_API && VIDEO_V4L2 && SND
|
||||||
select SND_ISA
|
select SND_ISA
|
||||||
select SND_MIRO
|
select SND_MIRO
|
||||||
---help---
|
---help---
|
||||||
@ -201,7 +201,7 @@ config RADIO_SF16FMI
|
|||||||
|
|
||||||
config RADIO_SF16FMR2
|
config RADIO_SF16FMR2
|
||||||
tristate "SF16FMR2 Radio"
|
tristate "SF16FMR2 Radio"
|
||||||
depends on ISA && VIDEO_V4L2
|
depends on ISA && VIDEO_V4L2 && SND
|
||||||
---help---
|
---help---
|
||||||
Choose Y here if you have one of these FM radio cards.
|
Choose Y here if you have one of these FM radio cards.
|
||||||
|
|
||||||
|
@ -1033,7 +1033,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev,
|
|||||||
char ps_name[MAX_RDS_PS_NAME + 1];
|
char ps_name[MAX_RDS_PS_NAME + 1];
|
||||||
|
|
||||||
len = control->size - 1;
|
len = control->size - 1;
|
||||||
if (len > MAX_RDS_PS_NAME) {
|
if (len < 0 || len > MAX_RDS_PS_NAME) {
|
||||||
rval = -ERANGE;
|
rval = -ERANGE;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@ -1057,7 +1057,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev,
|
|||||||
char radio_text[MAX_RDS_RADIO_TEXT + 1];
|
char radio_text[MAX_RDS_RADIO_TEXT + 1];
|
||||||
|
|
||||||
len = control->size - 1;
|
len = control->size - 1;
|
||||||
if (len > MAX_RDS_RADIO_TEXT) {
|
if (len < 0 || len > MAX_RDS_RADIO_TEXT) {
|
||||||
rval = -ERANGE;
|
rval = -ERANGE;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
@ -558,9 +558,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
|
|||||||
inout, data1);
|
inout, data1);
|
||||||
break;
|
break;
|
||||||
case MCE_CMD_S_TIMEOUT:
|
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",
|
dev_info(dev, "%s receive timeout of %d ms\n",
|
||||||
inout, ((data1 << 8) | data2) / 2);
|
inout,
|
||||||
|
((data1 << 8) | data2) * MCE_TIME_UNIT / 1000);
|
||||||
break;
|
break;
|
||||||
case MCE_CMD_G_TIMEOUT:
|
case MCE_CMD_G_TIMEOUT:
|
||||||
dev_info(dev, "Get receive timeout\n");
|
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]) {
|
switch (ir->buf_in[index]) {
|
||||||
/* 2-byte return value commands */
|
/* 2-byte return value commands */
|
||||||
case MCE_CMD_S_TIMEOUT:
|
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;
|
break;
|
||||||
|
|
||||||
/* 1-byte return value commands */
|
/* 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->priv = ir;
|
||||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||||
rc->allowed_protos = RC_TYPE_ALL;
|
rc->allowed_protos = RC_TYPE_ALL;
|
||||||
rc->timeout = US_TO_NS(1000);
|
rc->timeout = MS_TO_NS(100);
|
||||||
if (!ir->flags.no_tx) {
|
if (!ir->flags.no_tx) {
|
||||||
rc->s_tx_mask = mceusb_set_tx_mask;
|
rc->s_tx_mask = mceusb_set_tx_mask;
|
||||||
rc->s_tx_carrier = mceusb_set_tx_carrier;
|
rc->s_tx_carrier = mceusb_set_tx_carrier;
|
||||||
|
@ -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->dev.parent = &pdev->dev;
|
||||||
rdev->driver_name = NVT_DRIVER_NAME;
|
rdev->driver_name = NVT_DRIVER_NAME;
|
||||||
rdev->map_name = RC_MAP_RC6_MCE;
|
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 */
|
/* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
|
||||||
rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);
|
rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -2060,12 +2060,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
|
|||||||
goto fail_irq;
|
goto fail_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pci_enable_msi(pci_dev))
|
err = request_irq(pci_dev->irq, cx23885_irq,
|
||||||
err = request_irq(pci_dev->irq, cx23885_irq,
|
IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
|
||||||
IRQF_DISABLED, dev->name, dev);
|
|
||||||
else
|
|
||||||
err = request_irq(pci_dev->irq, cx23885_irq,
|
|
||||||
IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
|
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
printk(KERN_ERR "%s: can't get IRQ %d\n",
|
printk(KERN_ERR "%s: can't get IRQ %d\n",
|
||||||
dev->name, pci_dev->irq);
|
dev->name, pci_dev->irq);
|
||||||
@ -2114,7 +2110,6 @@ static void __devexit cx23885_finidev(struct pci_dev *pci_dev)
|
|||||||
|
|
||||||
/* unregister stuff */
|
/* unregister stuff */
|
||||||
free_irq(pci_dev->irq, dev);
|
free_irq(pci_dev->irq, dev);
|
||||||
pci_disable_msi(pci_dev);
|
|
||||||
|
|
||||||
cx23885_dev_unregister(dev);
|
cx23885_dev_unregister(dev);
|
||||||
v4l2_device_unregister(v4l2_dev);
|
v4l2_device_unregister(v4l2_dev);
|
||||||
|
@ -714,10 +714,19 @@ static int tuner_remove(struct i2c_client *client)
|
|||||||
* returns 0.
|
* returns 0.
|
||||||
* This function is needed for boards that have a separate tuner for
|
* This function is needed for boards that have a separate tuner for
|
||||||
* radio (like devices with tea5767).
|
* 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)
|
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 -EINVAL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -984,7 +993,7 @@ static void tuner_status(struct dvb_frontend *fe)
|
|||||||
case V4L2_TUNER_RADIO:
|
case V4L2_TUNER_RADIO:
|
||||||
p = "radio";
|
p = "radio";
|
||||||
break;
|
break;
|
||||||
case V4L2_TUNER_DIGITAL_TV:
|
case V4L2_TUNER_DIGITAL_TV: /* Used by mt20xx */
|
||||||
p = "digital TV";
|
p = "digital TV";
|
||||||
break;
|
break;
|
||||||
case V4L2_TUNER_ANALOG_TV:
|
case V4L2_TUNER_ANALOG_TV:
|
||||||
@ -1135,9 +1144,8 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
|
|||||||
return 0;
|
return 0;
|
||||||
if (vt->type == t->mode && analog_ops->get_afc)
|
if (vt->type == t->mode && analog_ops->get_afc)
|
||||||
vt->afc = analog_ops->get_afc(&t->fe);
|
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;
|
vt->capability |= V4L2_TUNER_CAP_NORM;
|
||||||
if (vt->type != V4L2_TUNER_RADIO) {
|
|
||||||
vt->rangelow = tv_range[0] * 16;
|
vt->rangelow = tv_range[0] * 16;
|
||||||
vt->rangehigh = tv_range[1] * 16;
|
vt->rangehigh = tv_range[1] * 16;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1415,9 +1415,9 @@ static u32 bond_fix_features(struct net_device *dev, u32 features)
|
|||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BOND_VLAN_FEATURES (NETIF_F_ALL_TX_OFFLOADS | \
|
#define BOND_VLAN_FEATURES (NETIF_F_ALL_CSUM | NETIF_F_SG | \
|
||||||
NETIF_F_SOFT_FEATURES | \
|
NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \
|
||||||
NETIF_F_LRO)
|
NETIF_F_HIGHDMA | NETIF_F_LRO)
|
||||||
|
|
||||||
static void bond_compute_features(struct bonding *bond)
|
static void bond_compute_features(struct bonding *bond)
|
||||||
{
|
{
|
||||||
|
@ -2287,6 +2287,23 @@ static int gfar_set_mac_address(struct net_device *dev)
|
|||||||
return 0;
|
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 */
|
/* Enables and disables VLAN insertion/extraction */
|
||||||
static void gfar_vlan_rx_register(struct net_device *dev,
|
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 */
|
/* Disable VLAN tag extraction */
|
||||||
tempval = gfar_read(®s->rctrl);
|
tempval = gfar_read(®s->rctrl);
|
||||||
tempval &= ~RCTRL_VLEX;
|
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_write(®s->rctrl, tempval);
|
||||||
|
|
||||||
|
gfar_check_rx_parser_mode(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
gfar_change_mtu(dev, dev->mtu);
|
gfar_change_mtu(dev, dev->mtu);
|
||||||
|
@ -286,7 +286,7 @@ extern const char gfar_driver_version[];
|
|||||||
#define RCTRL_PROM 0x00000008
|
#define RCTRL_PROM 0x00000008
|
||||||
#define RCTRL_EMEN 0x00000002
|
#define RCTRL_EMEN 0x00000002
|
||||||
#define RCTRL_REQ_PARSER (RCTRL_VLEX | RCTRL_IPCSEN | \
|
#define RCTRL_REQ_PARSER (RCTRL_VLEX | RCTRL_IPCSEN | \
|
||||||
RCTRL_TUCSEN)
|
RCTRL_TUCSEN | RCTRL_FILREN)
|
||||||
#define RCTRL_CHECKSUMMING (RCTRL_IPCSEN | RCTRL_TUCSEN | \
|
#define RCTRL_CHECKSUMMING (RCTRL_IPCSEN | RCTRL_TUCSEN | \
|
||||||
RCTRL_PRSDEP_INIT)
|
RCTRL_PRSDEP_INIT)
|
||||||
#define RCTRL_EXTHASH (RCTRL_GHTX)
|
#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);
|
unsigned long tx_mask, unsigned long rx_mask);
|
||||||
void gfar_init_sysfs(struct net_device *dev);
|
void gfar_init_sysfs(struct net_device *dev);
|
||||||
int gfar_set_features(struct net_device *dev, u32 features);
|
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;
|
extern const struct ethtool_ops gfar_ethtool_ops;
|
||||||
|
|
||||||
|
@ -348,8 +348,9 @@ static int pppoe_device_event(struct notifier_block *this,
|
|||||||
|
|
||||||
/* Only look at sockets that are using this specific device. */
|
/* Only look at sockets that are using this specific device. */
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
case NETDEV_CHANGEADDR:
|
||||||
case NETDEV_CHANGEMTU:
|
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.
|
* LCP re-negotiation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -677,9 +677,11 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
|
|||||||
if (status & RX_FIFO_FULL)
|
if (status & RX_FIFO_FULL)
|
||||||
dev->stats.rx_fifo_errors++;
|
dev->stats.rx_fifo_errors++;
|
||||||
|
|
||||||
/* Mask off RX interrupt */
|
if (likely(napi_schedule_prep(&lp->napi))) {
|
||||||
misr &= ~RX_INTS;
|
/* Mask off RX interrupt */
|
||||||
napi_schedule(&lp->napi);
|
misr &= ~RX_INTS;
|
||||||
|
__napi_schedule(&lp->napi);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TX interrupt request */
|
/* TX interrupt request */
|
||||||
|
@ -879,7 +879,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db)
|
|||||||
txptr = db->tx_remove_ptr;
|
txptr = db->tx_remove_ptr;
|
||||||
while(db->tx_packet_cnt) {
|
while(db->tx_packet_cnt) {
|
||||||
tdes0 = le32_to_cpu(txptr->tdes0);
|
tdes0 = le32_to_cpu(txptr->tdes0);
|
||||||
pr_debug("tdes0=%x\n", tdes0);
|
|
||||||
if (tdes0 & 0x80000000)
|
if (tdes0 & 0x80000000)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -889,7 +888,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db)
|
|||||||
|
|
||||||
/* Transmit statistic counter */
|
/* Transmit statistic counter */
|
||||||
if ( tdes0 != 0x7fffffff ) {
|
if ( tdes0 != 0x7fffffff ) {
|
||||||
pr_debug("tdes0=%x\n", tdes0);
|
|
||||||
dev->stats.collisions += (tdes0 >> 3) & 0xf;
|
dev->stats.collisions += (tdes0 >> 3) & 0xf;
|
||||||
dev->stats.tx_bytes += le32_to_cpu(txptr->tdes1) & 0x7ff;
|
dev->stats.tx_bytes += le32_to_cpu(txptr->tdes1) & 0x7ff;
|
||||||
if (tdes0 & TDES0_ERR_MASK) {
|
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 */
|
/* error summary bit check */
|
||||||
if (rdes0 & 0x8000) {
|
if (rdes0 & 0x8000) {
|
||||||
/* This is a error packet */
|
/* This is a error packet */
|
||||||
pr_debug("rdes0: %x\n", rdes0);
|
|
||||||
dev->stats.rx_errors++;
|
dev->stats.rx_errors++;
|
||||||
if (rdes0 & 1)
|
if (rdes0 & 1)
|
||||||
dev->stats.rx_fifo_errors++;
|
dev->stats.rx_fifo_errors++;
|
||||||
@ -1638,7 +1635,6 @@ static u8 dmfe_sense_speed(struct dmfe_board_info * db)
|
|||||||
else /* DM9102/DM9102A */
|
else /* DM9102/DM9102A */
|
||||||
phy_mode = phy_read(db->ioaddr,
|
phy_mode = phy_read(db->ioaddr,
|
||||||
db->phy_addr, 17, db->chip_id) & 0xf000;
|
db->phy_addr, 17, db->chip_id) & 0xf000;
|
||||||
pr_debug("Phy_mode %x\n", phy_mode);
|
|
||||||
switch (phy_mode) {
|
switch (phy_mode) {
|
||||||
case 0x1000: db->op_mode = DMFE_10MHF; break;
|
case 0x1000: db->op_mode = DMFE_10MHF; break;
|
||||||
case 0x2000: db->op_mode = DMFE_10MFD; break;
|
case 0x2000: db->op_mode = DMFE_10MFD; break;
|
||||||
|
@ -599,8 +599,7 @@ config IT87_WDT
|
|||||||
|
|
||||||
config HP_WATCHDOG
|
config HP_WATCHDOG
|
||||||
tristate "HP ProLiant iLO2+ Hardware Watchdog Timer"
|
tristate "HP ProLiant iLO2+ Hardware Watchdog Timer"
|
||||||
depends on X86
|
depends on X86 && PCI
|
||||||
default m
|
|
||||||
help
|
help
|
||||||
A software monitoring watchdog and NMI sourcing driver. This driver
|
A software monitoring watchdog and NMI sourcing driver. This driver
|
||||||
will detect lockups and provide a stack trace. This is a driver that
|
will detect lockups and provide a stack trace. This is a driver that
|
||||||
|
@ -1438,12 +1438,15 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
|
|||||||
struct dentry *temp;
|
struct dentry *temp;
|
||||||
char *path;
|
char *path;
|
||||||
int len, pos;
|
int len, pos;
|
||||||
|
unsigned seq;
|
||||||
|
|
||||||
if (dentry == NULL)
|
if (dentry == NULL)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
len = 0;
|
len = 0;
|
||||||
|
seq = read_seqbegin(&rename_lock);
|
||||||
|
rcu_read_lock();
|
||||||
for (temp = dentry; !IS_ROOT(temp);) {
|
for (temp = dentry; !IS_ROOT(temp);) {
|
||||||
struct inode *inode = temp->d_inode;
|
struct inode *inode = temp->d_inode;
|
||||||
if (inode && ceph_snap(inode) == CEPH_SNAPDIR)
|
if (inode && ceph_snap(inode) == CEPH_SNAPDIR)
|
||||||
@ -1455,10 +1458,12 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
|
|||||||
len += 1 + temp->d_name.len;
|
len += 1 + temp->d_name.len;
|
||||||
temp = temp->d_parent;
|
temp = temp->d_parent;
|
||||||
if (temp == NULL) {
|
if (temp == NULL) {
|
||||||
|
rcu_read_unlock();
|
||||||
pr_err("build_path corrupt dentry %p\n", dentry);
|
pr_err("build_path corrupt dentry %p\n", dentry);
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
if (len)
|
if (len)
|
||||||
len--; /* no leading '/' */
|
len--; /* no leading '/' */
|
||||||
|
|
||||||
@ -1467,9 +1472,12 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
|
|||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
pos = len;
|
pos = len;
|
||||||
path[pos] = 0; /* trailing null */
|
path[pos] = 0; /* trailing null */
|
||||||
|
rcu_read_lock();
|
||||||
for (temp = dentry; !IS_ROOT(temp) && pos != 0; ) {
|
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) {
|
if (inode && ceph_snap(inode) == CEPH_SNAPDIR) {
|
||||||
dout("build_path path+%d: %p SNAPDIR\n",
|
dout("build_path path+%d: %p SNAPDIR\n",
|
||||||
pos, temp);
|
pos, temp);
|
||||||
@ -1478,21 +1486,26 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
pos -= temp->d_name.len;
|
pos -= temp->d_name.len;
|
||||||
if (pos < 0)
|
if (pos < 0) {
|
||||||
|
spin_unlock(&temp->d_lock);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
strncpy(path + pos, temp->d_name.name,
|
strncpy(path + pos, temp->d_name.name,
|
||||||
temp->d_name.len);
|
temp->d_name.len);
|
||||||
}
|
}
|
||||||
|
spin_unlock(&temp->d_lock);
|
||||||
if (pos)
|
if (pos)
|
||||||
path[--pos] = '/';
|
path[--pos] = '/';
|
||||||
temp = temp->d_parent;
|
temp = temp->d_parent;
|
||||||
if (temp == NULL) {
|
if (temp == NULL) {
|
||||||
|
rcu_read_unlock();
|
||||||
pr_err("build_path corrupt dentry\n");
|
pr_err("build_path corrupt dentry\n");
|
||||||
kfree(path);
|
kfree(path);
|
||||||
return ERR_PTR(-EINVAL);
|
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 "
|
pr_err("build_path did not end path lookup where "
|
||||||
"expected, namelen is %d, pos is %d\n", len, pos);
|
"expected, namelen is %d, pos is %d\n", len, pos);
|
||||||
/* presumably this is only possible if racing with a
|
/* presumably this is only possible if racing with a
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/freezer.h>
|
#include <linux/freezer.h>
|
||||||
|
#include <linux/namei.h>
|
||||||
#include <net/ipv6.h>
|
#include <net/ipv6.h>
|
||||||
#include "cifsfs.h"
|
#include "cifsfs.h"
|
||||||
#include "cifspdu.h"
|
#include "cifspdu.h"
|
||||||
@ -542,14 +543,12 @@ static const struct super_operations cifs_super_ops = {
|
|||||||
static struct dentry *
|
static struct dentry *
|
||||||
cifs_get_root(struct smb_vol *vol, struct super_block *sb)
|
cifs_get_root(struct smb_vol *vol, struct super_block *sb)
|
||||||
{
|
{
|
||||||
int xid, rc;
|
struct dentry *dentry;
|
||||||
struct inode *inode;
|
|
||||||
struct qstr name;
|
|
||||||
struct dentry *dparent = NULL, *dchild = NULL, *alias;
|
|
||||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||||
unsigned int i, full_len, len;
|
char *full_path = NULL;
|
||||||
char *full_path = NULL, *pstart;
|
char *s, *p;
|
||||||
char sep;
|
char sep;
|
||||||
|
int xid;
|
||||||
|
|
||||||
full_path = cifs_build_path_to_root(vol, cifs_sb,
|
full_path = cifs_build_path_to_root(vol, cifs_sb,
|
||||||
cifs_sb_master_tcon(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();
|
xid = GetXid();
|
||||||
sep = CIFS_DIR_SEP(cifs_sb);
|
sep = CIFS_DIR_SEP(cifs_sb);
|
||||||
dparent = dget(sb->s_root);
|
dentry = dget(sb->s_root);
|
||||||
full_len = strlen(full_path);
|
p = s = full_path;
|
||||||
full_path[full_len] = sep;
|
|
||||||
pstart = full_path + 1;
|
|
||||||
|
|
||||||
for (i = 1, len = 0; i <= full_len; i++) {
|
do {
|
||||||
if (full_path[i] != sep || !len) {
|
struct inode *dir = dentry->d_inode;
|
||||||
len++;
|
struct dentry *child;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
full_path[i] = 0;
|
/* skip separators */
|
||||||
cFYI(1, "get dentry for %s", pstart);
|
while (*s == sep)
|
||||||
|
s++;
|
||||||
|
if (!*s)
|
||||||
|
break;
|
||||||
|
p = s++;
|
||||||
|
/* next separator */
|
||||||
|
while (*s && *s != sep)
|
||||||
|
s++;
|
||||||
|
|
||||||
name.name = pstart;
|
mutex_lock(&dir->i_mutex);
|
||||||
name.len = len;
|
child = lookup_one_len(p, dentry, s - p);
|
||||||
name.hash = full_name_hash(pstart, len);
|
mutex_unlock(&dir->i_mutex);
|
||||||
dchild = d_lookup(dparent, &name);
|
dput(dentry);
|
||||||
if (dchild == NULL) {
|
dentry = child;
|
||||||
cFYI(1, "not exists");
|
} while (!IS_ERR(dentry));
|
||||||
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:
|
|
||||||
_FreeXid(xid);
|
_FreeXid(xid);
|
||||||
kfree(full_path);
|
kfree(full_path);
|
||||||
return dparent;
|
return dentry;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cifs_set_super(struct super_block *sb, void *data)
|
static int cifs_set_super(struct super_block *sb, void *data)
|
||||||
|
@ -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;
|
extern const struct export_operations cifs_export_ops;
|
||||||
#endif /* CIFS_NFSD_EXPORT */
|
#endif /* CIFS_NFSD_EXPORT */
|
||||||
|
|
||||||
#define CIFS_VERSION "1.73"
|
#define CIFS_VERSION "1.74"
|
||||||
#endif /* _CIFSFS_H */
|
#endif /* _CIFSFS_H */
|
||||||
|
@ -3485,7 +3485,7 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(username, MAX_USERNAME_SIZE, "krb50x%x", fsuid);
|
snprintf(username, sizeof(username), "krb50x%x", fsuid);
|
||||||
vol_info->username = username;
|
vol_info->username = username;
|
||||||
vol_info->local_nls = cifs_sb->local_nls;
|
vol_info->local_nls = cifs_sb->local_nls;
|
||||||
vol_info->linux_uid = fsuid;
|
vol_info->linux_uid = fsuid;
|
||||||
|
@ -55,6 +55,7 @@ build_path_from_dentry(struct dentry *direntry)
|
|||||||
char dirsep;
|
char dirsep;
|
||||||
struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
|
struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
|
||||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||||
|
unsigned seq;
|
||||||
|
|
||||||
if (direntry == NULL)
|
if (direntry == NULL)
|
||||||
return NULL; /* not much we can do if dentry is freed and
|
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;
|
dfsplen = 0;
|
||||||
cifs_bp_rename_retry:
|
cifs_bp_rename_retry:
|
||||||
namelen = dfsplen;
|
namelen = dfsplen;
|
||||||
|
seq = read_seqbegin(&rename_lock);
|
||||||
|
rcu_read_lock();
|
||||||
for (temp = direntry; !IS_ROOT(temp);) {
|
for (temp = direntry; !IS_ROOT(temp);) {
|
||||||
namelen += (1 + temp->d_name.len);
|
namelen += (1 + temp->d_name.len);
|
||||||
temp = temp->d_parent;
|
temp = temp->d_parent;
|
||||||
if (temp == NULL) {
|
if (temp == NULL) {
|
||||||
cERROR(1, "corrupt dentry");
|
cERROR(1, "corrupt dentry");
|
||||||
|
rcu_read_unlock();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
full_path = kmalloc(namelen+1, GFP_KERNEL);
|
full_path = kmalloc(namelen+1, GFP_KERNEL);
|
||||||
if (full_path == NULL)
|
if (full_path == NULL)
|
||||||
return full_path;
|
return full_path;
|
||||||
full_path[namelen] = 0; /* trailing null */
|
full_path[namelen] = 0; /* trailing null */
|
||||||
|
rcu_read_lock();
|
||||||
for (temp = direntry; !IS_ROOT(temp);) {
|
for (temp = direntry; !IS_ROOT(temp);) {
|
||||||
|
spin_lock(&temp->d_lock);
|
||||||
namelen -= 1 + temp->d_name.len;
|
namelen -= 1 + temp->d_name.len;
|
||||||
if (namelen < 0) {
|
if (namelen < 0) {
|
||||||
|
spin_unlock(&temp->d_lock);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
full_path[namelen] = dirsep;
|
full_path[namelen] = dirsep;
|
||||||
@ -91,14 +99,17 @@ build_path_from_dentry(struct dentry *direntry)
|
|||||||
temp->d_name.len);
|
temp->d_name.len);
|
||||||
cFYI(0, "name: %s", full_path + namelen);
|
cFYI(0, "name: %s", full_path + namelen);
|
||||||
}
|
}
|
||||||
|
spin_unlock(&temp->d_lock);
|
||||||
temp = temp->d_parent;
|
temp = temp->d_parent;
|
||||||
if (temp == NULL) {
|
if (temp == NULL) {
|
||||||
cERROR(1, "corrupt dentry");
|
cERROR(1, "corrupt dentry");
|
||||||
|
rcu_read_unlock();
|
||||||
kfree(full_path);
|
kfree(full_path);
|
||||||
return NULL;
|
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",
|
cERROR(1, "did not end path lookup where expected namelen is %d",
|
||||||
namelen);
|
namelen);
|
||||||
/* presumably this is only possible if racing with a rename
|
/* presumably this is only possible if racing with a rename
|
||||||
|
@ -428,8 +428,7 @@ static void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
|
|||||||
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
|
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
|
||||||
flags |= NTLMSSP_NEGOTIATE_SIGN;
|
flags |= NTLMSSP_NEGOTIATE_SIGN;
|
||||||
if (!ses->server->session_estab)
|
if (!ses->server->session_estab)
|
||||||
flags |= NTLMSSP_NEGOTIATE_KEY_XCH |
|
flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
|
||||||
NTLMSSP_NEGOTIATE_EXTENDED_SEC;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sec_blob->NegotiateFlags = cpu_to_le32(flags);
|
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_128 | NTLMSSP_NEGOTIATE_UNICODE |
|
||||||
NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
|
NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
|
||||||
if (ses->server->sec_mode &
|
if (ses->server->sec_mode &
|
||||||
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
|
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
|
||||||
flags |= NTLMSSP_NEGOTIATE_SIGN;
|
flags |= NTLMSSP_NEGOTIATE_SIGN;
|
||||||
if (ses->server->sec_mode & SECMODE_SIGN_REQUIRED)
|
if (!ses->server->session_estab)
|
||||||
flags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
|
flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
|
||||||
|
}
|
||||||
|
|
||||||
tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE);
|
tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE);
|
||||||
sec_blob->NegotiateFlags = cpu_to_le32(flags);
|
sec_blob->NegotiateFlags = cpu_to_le32(flags);
|
||||||
|
@ -37,7 +37,7 @@ static DEFINE_MUTEX(read_mutex);
|
|||||||
/* These macros may change in future, to provide better st_ino semantics. */
|
/* These macros may change in future, to provide better st_ino semantics. */
|
||||||
#define OFFSET(x) ((x)->i_ino)
|
#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)
|
if (!cino->offset)
|
||||||
return offset + 1;
|
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,
|
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;
|
struct inode *inode;
|
||||||
static struct timespec zerotime;
|
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.. */
|
/* Set it all up.. */
|
||||||
sb->s_op = &cramfs_ops;
|
sb->s_op = &cramfs_ops;
|
||||||
root = get_cramfs_inode(sb, &super.root, 0);
|
root = get_cramfs_inode(sb, &super.root, 0);
|
||||||
if (!root)
|
if (IS_ERR(root))
|
||||||
goto out;
|
goto out;
|
||||||
sb->s_root = d_alloc_root(root);
|
sb->s_root = d_alloc_root(root);
|
||||||
if (!sb->s_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)
|
static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
|
||||||
{
|
{
|
||||||
unsigned int offset = 0;
|
unsigned int offset = 0;
|
||||||
|
struct inode *inode = NULL;
|
||||||
int sorted;
|
int sorted;
|
||||||
|
|
||||||
mutex_lock(&read_mutex);
|
mutex_lock(&read_mutex);
|
||||||
@ -449,8 +450,8 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (!namelen) {
|
if (!namelen) {
|
||||||
mutex_unlock(&read_mutex);
|
inode = ERR_PTR(-EIO);
|
||||||
return ERR_PTR(-EIO);
|
goto out;
|
||||||
}
|
}
|
||||||
if (name[namelen-1])
|
if (name[namelen-1])
|
||||||
break;
|
break;
|
||||||
@ -462,17 +463,18 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s
|
|||||||
if (retval > 0)
|
if (retval > 0)
|
||||||
continue;
|
continue;
|
||||||
if (!retval) {
|
if (!retval) {
|
||||||
struct cramfs_inode entry = *de;
|
inode = get_cramfs_inode(dir->i_sb, de, dir_off);
|
||||||
mutex_unlock(&read_mutex);
|
break;
|
||||||
d_add(dentry, get_cramfs_inode(dir->i_sb, &entry, dir_off));
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
/* else (retval < 0) */
|
/* else (retval < 0) */
|
||||||
if (sorted)
|
if (sorted)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
mutex_unlock(&read_mutex);
|
mutex_unlock(&read_mutex);
|
||||||
d_add(dentry, NULL);
|
if (IS_ERR(inode))
|
||||||
|
return ERR_CAST(inode);
|
||||||
|
d_add(dentry, inode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
51
fs/dcache.c
51
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..
|
* 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
|
* @dentry: entry to move
|
||||||
* @target: new dentry
|
* @target: new dentry
|
||||||
*
|
*
|
||||||
* Update the dcache to reflect the move of a file name. Negative
|
* 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)
|
if (!dentry->d_inode)
|
||||||
printk(KERN_WARNING "VFS: moving negative dcache entry\n");
|
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(dentry, target));
|
||||||
BUG_ON(d_ancestor(target, dentry));
|
BUG_ON(d_ancestor(target, dentry));
|
||||||
|
|
||||||
write_seqlock(&rename_lock);
|
|
||||||
|
|
||||||
dentry_lock_for_move(dentry, target);
|
dentry_lock_for_move(dentry, target);
|
||||||
|
|
||||||
write_seqcount_begin(&dentry->d_seq);
|
write_seqcount_begin(&dentry->d_seq);
|
||||||
@ -2275,6 +2274,20 @@ void d_move(struct dentry * dentry, struct dentry * target)
|
|||||||
spin_unlock(&target->d_lock);
|
spin_unlock(&target->d_lock);
|
||||||
fsnotify_d_move(dentry);
|
fsnotify_d_move(dentry);
|
||||||
spin_unlock(&dentry->d_lock);
|
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);
|
write_sequnlock(&rename_lock);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(d_move);
|
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
|
* This helper attempts to cope with remotely renamed directories
|
||||||
*
|
*
|
||||||
* It assumes that the caller is already holding
|
* 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
|
* Note: If ever the locking in lock_rename() changes, then please
|
||||||
* remember to update this too...
|
* remember to update this too...
|
||||||
@ -2317,11 +2330,6 @@ static struct dentry *__d_unalias(struct inode *inode,
|
|||||||
if (alias->d_parent == dentry->d_parent)
|
if (alias->d_parent == dentry->d_parent)
|
||||||
goto out_unalias;
|
goto out_unalias;
|
||||||
|
|
||||||
/* Check for loops */
|
|
||||||
ret = ERR_PTR(-ELOOP);
|
|
||||||
if (d_ancestor(alias, dentry))
|
|
||||||
goto out_err;
|
|
||||||
|
|
||||||
/* See lock_rename() */
|
/* See lock_rename() */
|
||||||
ret = ERR_PTR(-EBUSY);
|
ret = ERR_PTR(-EBUSY);
|
||||||
if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
|
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;
|
goto out_err;
|
||||||
m2 = &alias->d_parent->d_inode->i_mutex;
|
m2 = &alias->d_parent->d_inode->i_mutex;
|
||||||
out_unalias:
|
out_unalias:
|
||||||
d_move(alias, dentry);
|
__d_move(alias, dentry);
|
||||||
ret = alias;
|
ret = alias;
|
||||||
out_err:
|
out_err:
|
||||||
spin_unlock(&inode->i_lock);
|
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);
|
alias = __d_find_alias(inode, 0);
|
||||||
if (alias) {
|
if (alias) {
|
||||||
actual = alias;
|
actual = alias;
|
||||||
/* Is this an anonymous mountpoint that we could splice
|
write_seqlock(&rename_lock);
|
||||||
* into our tree? */
|
|
||||||
if (IS_ROOT(alias)) {
|
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);
|
__d_materialise_dentry(dentry, alias);
|
||||||
|
write_sequnlock(&rename_lock);
|
||||||
__d_drop(alias);
|
__d_drop(alias);
|
||||||
goto found;
|
goto found;
|
||||||
|
} else {
|
||||||
|
/* Nope, but we must(!) avoid directory
|
||||||
|
* aliasing */
|
||||||
|
actual = __d_unalias(inode, dentry, alias);
|
||||||
}
|
}
|
||||||
/* Nope, but we must(!) avoid directory aliasing */
|
write_sequnlock(&rename_lock);
|
||||||
actual = __d_unalias(inode, dentry, alias);
|
|
||||||
if (IS_ERR(actual))
|
if (IS_ERR(actual))
|
||||||
dput(alias);
|
dput(alias);
|
||||||
goto out_nolock;
|
goto out_nolock;
|
||||||
|
@ -913,7 +913,7 @@ struct dentry *exofs_get_parent(struct dentry *child)
|
|||||||
unsigned long ino = exofs_parent_ino(child);
|
unsigned long ino = exofs_parent_ino(child);
|
||||||
|
|
||||||
if (!ino)
|
if (!ino)
|
||||||
return NULL;
|
return ERR_PTR(-ESTALE);
|
||||||
|
|
||||||
return d_obtain_alias(exofs_iget(child->d_inode->i_sb, ino));
|
return d_obtain_alias(exofs_iget(child->d_inode->i_sb, ino));
|
||||||
}
|
}
|
||||||
|
@ -1069,6 +1069,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
gfs2_log_lock(sdp);
|
gfs2_log_lock(sdp);
|
||||||
|
spin_lock(&sdp->sd_ail_lock);
|
||||||
head = bh = page_buffers(page);
|
head = bh = page_buffers(page);
|
||||||
do {
|
do {
|
||||||
if (atomic_read(&bh->b_count))
|
if (atomic_read(&bh->b_count))
|
||||||
@ -1080,6 +1081,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
|
|||||||
goto not_possible;
|
goto not_possible;
|
||||||
bh = bh->b_this_page;
|
bh = bh->b_this_page;
|
||||||
} while(bh != head);
|
} while(bh != head);
|
||||||
|
spin_unlock(&sdp->sd_ail_lock);
|
||||||
gfs2_log_unlock(sdp);
|
gfs2_log_unlock(sdp);
|
||||||
|
|
||||||
head = bh = page_buffers(page);
|
head = bh = page_buffers(page);
|
||||||
@ -1112,6 +1114,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
|
|||||||
WARN_ON(buffer_dirty(bh));
|
WARN_ON(buffer_dirty(bh));
|
||||||
WARN_ON(buffer_pinned(bh));
|
WARN_ON(buffer_pinned(bh));
|
||||||
cannot_release:
|
cannot_release:
|
||||||
|
spin_unlock(&sdp->sd_ail_lock);
|
||||||
gfs2_log_unlock(sdp);
|
gfs2_log_unlock(sdp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -47,10 +47,10 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl)
|
|||||||
bd_ail_gl_list);
|
bd_ail_gl_list);
|
||||||
bh = bd->bd_bh;
|
bh = bd->bd_bh;
|
||||||
gfs2_remove_from_ail(bd);
|
gfs2_remove_from_ail(bd);
|
||||||
spin_unlock(&sdp->sd_ail_lock);
|
|
||||||
|
|
||||||
bd->bd_bh = NULL;
|
bd->bd_bh = NULL;
|
||||||
bh->b_private = NULL;
|
bh->b_private = NULL;
|
||||||
|
spin_unlock(&sdp->sd_ail_lock);
|
||||||
|
|
||||||
bd->bd_blkno = bh->b_blocknr;
|
bd->bd_blkno = bh->b_blocknr;
|
||||||
gfs2_log_lock(sdp);
|
gfs2_log_lock(sdp);
|
||||||
gfs2_assert_withdraw(sdp, !buffer_busy(bh));
|
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;
|
gl->gl_sbd->sd_rindex_uptodate = 0;
|
||||||
|
}
|
||||||
if (ip && S_ISREG(ip->i_inode.i_mode))
|
if (ip && S_ISREG(ip->i_inode.i_mode))
|
||||||
truncate_inode_pages(ip->i_inode.i_mapping, 0);
|
truncate_inode_pages(ip->i_inode.i_mapping, 0);
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
#include <linux/rculist_bl.h>
|
#include <linux/rculist_bl.h>
|
||||||
|
#include <linux/completion.h>
|
||||||
|
|
||||||
#define DIO_WAIT 0x00000010
|
#define DIO_WAIT 0x00000010
|
||||||
#define DIO_METADATA 0x00000020
|
#define DIO_METADATA 0x00000020
|
||||||
@ -546,6 +547,7 @@ struct gfs2_sbd {
|
|||||||
struct gfs2_glock *sd_trans_gl;
|
struct gfs2_glock *sd_trans_gl;
|
||||||
wait_queue_head_t sd_glock_wait;
|
wait_queue_head_t sd_glock_wait;
|
||||||
atomic_t sd_glock_disposal;
|
atomic_t sd_glock_disposal;
|
||||||
|
struct completion sd_locking_init;
|
||||||
|
|
||||||
/* Inode Stuff */
|
/* Inode Stuff */
|
||||||
|
|
||||||
|
@ -903,6 +903,7 @@ void gfs2_meta_syncfs(struct gfs2_sbd *sdp)
|
|||||||
if (gfs2_ail1_empty(sdp))
|
if (gfs2_ail1_empty(sdp))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
gfs2_log_flush(sdp, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp)
|
static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp)
|
||||||
|
@ -72,6 +72,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
|
|||||||
|
|
||||||
init_waitqueue_head(&sdp->sd_glock_wait);
|
init_waitqueue_head(&sdp->sd_glock_wait);
|
||||||
atomic_set(&sdp->sd_glock_disposal, 0);
|
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_statfs_spin);
|
||||||
|
|
||||||
spin_lock_init(&sdp->sd_rindex_spin);
|
spin_lock_init(&sdp->sd_rindex_spin);
|
||||||
@ -1017,11 +1018,13 @@ static int gfs2_lm_mount(struct gfs2_sbd *sdp, int silent)
|
|||||||
fsname++;
|
fsname++;
|
||||||
if (lm->lm_mount == NULL) {
|
if (lm->lm_mount == NULL) {
|
||||||
fs_info(sdp, "Now mounting FS...\n");
|
fs_info(sdp, "Now mounting FS...\n");
|
||||||
|
complete(&sdp->sd_locking_init);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ret = lm->lm_mount(sdp, fsname);
|
ret = lm->lm_mount(sdp, fsname);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
fs_info(sdp, "Joined cluster. Now mounting FS...\n");
|
fs_info(sdp, "Joined cluster. Now mounting FS...\n");
|
||||||
|
complete(&sdp->sd_locking_init);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,13 +757,17 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|||||||
struct timespec atime;
|
struct timespec atime;
|
||||||
struct gfs2_dinode *di;
|
struct gfs2_dinode *di;
|
||||||
int ret = -EAGAIN;
|
int ret = -EAGAIN;
|
||||||
|
int unlock_required = 0;
|
||||||
|
|
||||||
/* Skip timestamp update, if this is from a memalloc */
|
/* Skip timestamp update, if this is from a memalloc */
|
||||||
if (current->flags & PF_MEMALLOC)
|
if (current->flags & PF_MEMALLOC)
|
||||||
goto do_flush;
|
goto do_flush;
|
||||||
ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
|
if (!gfs2_glock_is_locked_by_me(ip->i_gl)) {
|
||||||
if (ret)
|
ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
|
||||||
goto do_flush;
|
if (ret)
|
||||||
|
goto do_flush;
|
||||||
|
unlock_required = 1;
|
||||||
|
}
|
||||||
ret = gfs2_trans_begin(sdp, RES_DINODE, 0);
|
ret = gfs2_trans_begin(sdp, RES_DINODE, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto do_unlock;
|
goto do_unlock;
|
||||||
@ -780,7 +784,8 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|||||||
}
|
}
|
||||||
gfs2_trans_end(sdp);
|
gfs2_trans_end(sdp);
|
||||||
do_unlock:
|
do_unlock:
|
||||||
gfs2_glock_dq_uninit(&gh);
|
if (unlock_required)
|
||||||
|
gfs2_glock_dq_uninit(&gh);
|
||||||
do_flush:
|
do_flush:
|
||||||
if (wbc->sync_mode == WB_SYNC_ALL)
|
if (wbc->sync_mode == WB_SYNC_ALL)
|
||||||
gfs2_log_flush(GFS2_SB(inode), ip->i_gl);
|
gfs2_log_flush(GFS2_SB(inode), ip->i_gl);
|
||||||
@ -1427,7 +1432,20 @@ static int gfs2_dinode_dealloc(struct gfs2_inode *ip)
|
|||||||
return error;
|
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
|
* 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
|
* the gap between unlocking the shared lock on the iopen lock and
|
||||||
* taking the exclusive lock. I'd rather do a shared -> exclusive
|
* 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)
|
if (error)
|
||||||
goto out_truncate;
|
goto out_truncate;
|
||||||
|
|
||||||
|
/* Case 1 starts here */
|
||||||
|
|
||||||
if (S_ISDIR(inode->i_mode) &&
|
if (S_ISDIR(inode->i_mode) &&
|
||||||
(ip->i_diskflags & GFS2_DIF_EXHASH)) {
|
(ip->i_diskflags & GFS2_DIF_EXHASH)) {
|
||||||
error = gfs2_dir_exhash_dealloc(ip);
|
error = gfs2_dir_exhash_dealloc(ip);
|
||||||
@ -1493,13 +1513,16 @@ static void gfs2_evict_inode(struct inode *inode)
|
|||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
out_truncate:
|
out_truncate:
|
||||||
|
/* Case 2 starts here */
|
||||||
error = gfs2_trans_begin(sdp, 0, sdp->sd_jdesc->jd_blocks);
|
error = gfs2_trans_begin(sdp, 0, sdp->sd_jdesc->jd_blocks);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_unlock;
|
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);
|
gfs2_trans_end(sdp);
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
|
/* Error path for case 1 */
|
||||||
if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags))
|
if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags))
|
||||||
gfs2_glock_dq(&ip->i_iopen_gh);
|
gfs2_glock_dq(&ip->i_iopen_gh);
|
||||||
gfs2_holder_uninit(&ip->i_iopen_gh);
|
gfs2_holder_uninit(&ip->i_iopen_gh);
|
||||||
@ -1507,6 +1530,7 @@ static void gfs2_evict_inode(struct inode *inode)
|
|||||||
if (error && error != GLR_TRYFAILED && error != -EROFS)
|
if (error && error != GLR_TRYFAILED && error != -EROFS)
|
||||||
fs_warn(sdp, "gfs2_evict_inode: %d\n", error);
|
fs_warn(sdp, "gfs2_evict_inode: %d\n", error);
|
||||||
out:
|
out:
|
||||||
|
/* Case 3 starts here */
|
||||||
truncate_inode_pages(&inode->i_data, 0);
|
truncate_inode_pages(&inode->i_data, 0);
|
||||||
end_writeback(inode);
|
end_writeback(inode);
|
||||||
|
|
||||||
|
@ -338,6 +338,9 @@ static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
|
|||||||
rv = sscanf(buf, "%u", &first);
|
rv = sscanf(buf, "%u", &first);
|
||||||
if (rv != 1 || first > 1)
|
if (rv != 1 || first > 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
rv = wait_for_completion_killable(&sdp->sd_locking_init);
|
||||||
|
if (rv)
|
||||||
|
return rv;
|
||||||
spin_lock(&sdp->sd_jindex_spin);
|
spin_lock(&sdp->sd_jindex_spin);
|
||||||
rv = -EBUSY;
|
rv = -EBUSY;
|
||||||
if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
|
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);
|
rv = sscanf(buf, "%d", &jid);
|
||||||
if (rv != 1)
|
if (rv != 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
rv = wait_for_completion_killable(&sdp->sd_locking_init);
|
||||||
|
if (rv)
|
||||||
|
return rv;
|
||||||
spin_lock(&sdp->sd_jindex_spin);
|
spin_lock(&sdp->sd_jindex_spin);
|
||||||
rv = -EINVAL;
|
rv = -EINVAL;
|
||||||
if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
|
if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
|
||||||
|
@ -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,
|
static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
|
||||||
struct nameidata *nd)
|
struct nameidata *nd)
|
||||||
{
|
{
|
||||||
struct dentry *proc_dentry, *new, *parent;
|
struct dentry *proc_dentry, *parent;
|
||||||
|
struct qstr *name = &dentry->d_name;
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
int err, deleted;
|
int err, deleted;
|
||||||
|
|
||||||
@ -149,23 +150,9 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
|
|||||||
else if (deleted)
|
else if (deleted)
|
||||||
return ERR_PTR(-ENOENT);
|
return ERR_PTR(-ENOENT);
|
||||||
|
|
||||||
err = -ENOMEM;
|
|
||||||
parent = HPPFS_I(ino)->proc_dentry;
|
parent = HPPFS_I(ino)->proc_dentry;
|
||||||
mutex_lock(&parent->d_inode->i_mutex);
|
mutex_lock(&parent->d_inode->i_mutex);
|
||||||
proc_dentry = d_lookup(parent, &dentry->d_name);
|
proc_dentry = lookup_one_len(name->name, parent, name->len);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mutex_unlock(&parent->d_inode->i_mutex);
|
mutex_unlock(&parent->d_inode->i_mutex);
|
||||||
|
|
||||||
if (IS_ERR(proc_dentry))
|
if (IS_ERR(proc_dentry))
|
||||||
@ -174,13 +161,11 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
|
|||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
inode = get_inode(ino->i_sb, proc_dentry);
|
inode = get_inode(ino->i_sb, proc_dentry);
|
||||||
if (!inode)
|
if (!inode)
|
||||||
goto out_dput;
|
goto out;
|
||||||
|
|
||||||
d_add(dentry, inode);
|
d_add(dentry, inode);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
out_dput:
|
|
||||||
dput(proc_dentry);
|
|
||||||
out:
|
out:
|
||||||
return ERR_PTR(err);
|
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 *proc_ino = dentry->d_inode;
|
||||||
struct inode *inode = new_inode(sb);
|
struct inode *inode = new_inode(sb);
|
||||||
|
|
||||||
if (!inode)
|
if (!inode) {
|
||||||
|
dput(dentry);
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
if (S_ISDIR(dentry->d_inode->i_mode)) {
|
if (S_ISDIR(dentry->d_inode->i_mode)) {
|
||||||
inode->i_op = &hppfs_dir_iops;
|
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;
|
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_uid = proc_ino->i_uid;
|
||||||
inode->i_gid = proc_ino->i_gid;
|
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;
|
sb->s_fs_info = proc_mnt;
|
||||||
|
|
||||||
err = -ENOMEM;
|
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)
|
if (!root_inode)
|
||||||
goto out_mntput;
|
goto out_mntput;
|
||||||
|
|
||||||
|
@ -822,7 +822,7 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
attr->set_buf[size] = '\0';
|
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);
|
ret = attr->set(attr->data, val);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = len; /* on success, claim we got the whole input */
|
ret = len; /* on success, claim we got the whole input */
|
||||||
|
@ -433,6 +433,8 @@ static int unlazy_walk(struct nameidata *nd, struct dentry *dentry)
|
|||||||
goto err_parent;
|
goto err_parent;
|
||||||
BUG_ON(nd->inode != parent->d_inode);
|
BUG_ON(nd->inode != parent->d_inode);
|
||||||
} else {
|
} else {
|
||||||
|
if (dentry->d_parent != parent)
|
||||||
|
goto err_parent;
|
||||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||||
if (!__d_rcu_to_refcount(dentry, nd->seq))
|
if (!__d_rcu_to_refcount(dentry, nd->seq))
|
||||||
goto err_child;
|
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
|
* Don't forget we might have a non-mountpoint managed dentry
|
||||||
* that wants to block transit.
|
* that wants to block transit.
|
||||||
*/
|
*/
|
||||||
*inode = path->dentry->d_inode;
|
|
||||||
if (unlikely(managed_dentry_might_block(path->dentry)))
|
if (unlikely(managed_dentry_might_block(path->dentry)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -953,6 +954,12 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,
|
|||||||
path->mnt = mounted;
|
path->mnt = mounted;
|
||||||
path->dentry = mounted->mnt_root;
|
path->dentry = mounted->mnt_root;
|
||||||
nd->seq = read_seqcount_begin(&path->dentry->d_seq);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -56,16 +56,12 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru
|
|||||||
|
|
||||||
lock_ufs(dir->i_sb);
|
lock_ufs(dir->i_sb);
|
||||||
ino = ufs_inode_by_name(dir, &dentry->d_name);
|
ino = ufs_inode_by_name(dir, &dentry->d_name);
|
||||||
if (ino) {
|
if (ino)
|
||||||
inode = ufs_iget(dir->i_sb, 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);
|
unlock_ufs(dir->i_sb);
|
||||||
d_add(dentry, inode);
|
if (IS_ERR(inode))
|
||||||
return NULL;
|
return ERR_CAST(inode);
|
||||||
|
return d_splice_alias(inode, dentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -210,7 +210,7 @@ struct acpi_device_power_state {
|
|||||||
struct acpi_device_power {
|
struct acpi_device_power {
|
||||||
int state; /* Current state */
|
int state; /* Current state */
|
||||||
struct acpi_device_power_flags flags;
|
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 */
|
/* Performance Management */
|
||||||
|
@ -98,8 +98,11 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
|
|||||||
/*
|
/*
|
||||||
* Spinlock primitives
|
* Spinlock primitives
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef acpi_os_create_lock
|
||||||
acpi_status
|
acpi_status
|
||||||
acpi_os_create_lock(acpi_spinlock *out_handle);
|
acpi_os_create_lock(acpi_spinlock *out_handle);
|
||||||
|
#endif
|
||||||
|
|
||||||
void acpi_os_delete_lock(acpi_spinlock handle);
|
void acpi_os_delete_lock(acpi_spinlock handle);
|
||||||
|
|
||||||
|
@ -159,6 +159,24 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
|
|||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#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 /* __KERNEL__ */
|
||||||
|
|
||||||
#endif /* __ACLINUX_H__ */
|
#endif /* __ACLINUX_H__ */
|
||||||
|
@ -182,6 +182,7 @@
|
|||||||
{0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \
|
{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, 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, 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, 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, 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}, \
|
{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, 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, 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, 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, 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, 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}, \
|
{0x1002, 0x6888, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \
|
||||||
|
@ -1070,12 +1070,6 @@ struct net_device {
|
|||||||
#define NETIF_F_ALL_FCOE (NETIF_F_FCOE_CRC | NETIF_F_FCOE_MTU | \
|
#define NETIF_F_ALL_FCOE (NETIF_F_FCOE_CRC | NETIF_F_FCOE_MTU | \
|
||||||
NETIF_F_FSO)
|
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
|
* If one device supports one of these features, then enable them
|
||||||
* for all in netdev_increment_features.
|
* for all in netdev_increment_features.
|
||||||
|
@ -112,11 +112,7 @@ struct sdla_dlci_conf {
|
|||||||
short Tb_max;
|
short Tb_max;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
void sdla(void *cfg_info, char *dev, struct frad_conf *conf, int quiet);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* important Z80 window addresses */
|
/* important Z80 window addresses */
|
||||||
#define SDLA_CONTROL_WND 0xE000
|
#define SDLA_CONTROL_WND 0xE000
|
||||||
|
@ -84,9 +84,32 @@ DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
|
|||||||
|
|
||||||
static struct rcu_state *rcu_state;
|
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;
|
int rcu_scheduler_active __read_mostly;
|
||||||
EXPORT_SYMBOL_GPL(rcu_scheduler_active);
|
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
|
#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(int, rcu_cpu_kthread_cpu);
|
||||||
DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops);
|
DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops);
|
||||||
DEFINE_PER_CPU(char, rcu_cpu_has_work);
|
DEFINE_PER_CPU(char, rcu_cpu_has_work);
|
||||||
static char rcu_kthreads_spawnable;
|
|
||||||
|
|
||||||
#endif /* #ifdef CONFIG_RCU_BOOST */
|
#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)
|
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)) {
|
if (likely(!rsp->boost)) {
|
||||||
rcu_do_batch(rsp, rdp);
|
rcu_do_batch(rsp, rdp);
|
||||||
return;
|
return;
|
||||||
|
@ -1532,7 +1532,7 @@ static int __cpuinit rcu_spawn_one_cpu_kthread(int cpu)
|
|||||||
struct sched_param sp;
|
struct sched_param sp;
|
||||||
struct task_struct *t;
|
struct task_struct *t;
|
||||||
|
|
||||||
if (!rcu_kthreads_spawnable ||
|
if (!rcu_scheduler_fully_active ||
|
||||||
per_cpu(rcu_cpu_kthread_task, cpu) != NULL)
|
per_cpu(rcu_cpu_kthread_task, cpu) != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
t = kthread_create(rcu_cpu_kthread, (void *)(long)cpu, "rcuc%d", cpu);
|
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 sched_param sp;
|
||||||
struct task_struct *t;
|
struct task_struct *t;
|
||||||
|
|
||||||
if (!rcu_kthreads_spawnable ||
|
if (!rcu_scheduler_fully_active ||
|
||||||
rnp->qsmaskinit == 0)
|
rnp->qsmaskinit == 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (rnp->node_kthread_task == NULL) {
|
if (rnp->node_kthread_task == NULL) {
|
||||||
@ -1665,7 +1665,7 @@ static int __init rcu_spawn_kthreads(void)
|
|||||||
int cpu;
|
int cpu;
|
||||||
struct rcu_node *rnp;
|
struct rcu_node *rnp;
|
||||||
|
|
||||||
rcu_kthreads_spawnable = 1;
|
rcu_scheduler_fully_active = 1;
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
per_cpu(rcu_cpu_has_work, cpu) = 0;
|
per_cpu(rcu_cpu_has_work, cpu) = 0;
|
||||||
if (cpu_online(cpu))
|
if (cpu_online(cpu))
|
||||||
@ -1687,7 +1687,7 @@ static void __cpuinit rcu_prepare_kthreads(int cpu)
|
|||||||
struct rcu_node *rnp = rdp->mynode;
|
struct rcu_node *rnp = rdp->mynode;
|
||||||
|
|
||||||
/* Fire up the incoming CPU's kthread and leaf rcu_node kthread. */
|
/* 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);
|
(void)rcu_spawn_one_cpu_kthread(cpu);
|
||||||
if (rnp->node_kthread_task == NULL)
|
if (rnp->node_kthread_task == NULL)
|
||||||
(void)rcu_spawn_one_node_kthread(rcu_state, rnp);
|
(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)
|
static void __cpuinit rcu_prepare_kthreads(int cpu)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -7757,6 +7757,9 @@ static void init_cfs_rq(struct cfs_rq *cfs_rq, struct rq *rq)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
cfs_rq->min_vruntime = (u64)(-(1LL << 20));
|
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)
|
static void init_rt_rq(struct rt_rq *rt_rq, struct rq *rq)
|
||||||
|
@ -2310,7 +2310,8 @@ static bool pgdat_balanced(pg_data_t *pgdat, unsigned long balanced_pages,
|
|||||||
for (i = 0; i <= classzone_idx; i++)
|
for (i = 0; i <= classzone_idx; i++)
|
||||||
present_pages += pgdat->node_zones[i].present_pages;
|
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? */
|
/* is kswapd sleeping prematurely? */
|
||||||
|
@ -530,7 +530,11 @@ static int vlan_dev_init(struct net_device *dev)
|
|||||||
(1<<__LINK_STATE_DORMANT))) |
|
(1<<__LINK_STATE_DORMANT))) |
|
||||||
(1<<__LINK_STATE_PRESENT);
|
(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->features |= real_dev->vlan_features | NETIF_F_LLTX;
|
||||||
dev->gso_max_size = real_dev->gso_max_size;
|
dev->gso_max_size = real_dev->gso_max_size;
|
||||||
|
|
||||||
|
@ -763,7 +763,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
|
|||||||
struct sock *parent = bt_sk(sk)->parent;
|
struct sock *parent = bt_sk(sk)->parent;
|
||||||
rsp.result = cpu_to_le16(L2CAP_CR_PEND);
|
rsp.result = cpu_to_le16(L2CAP_CR_PEND);
|
||||||
rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_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 {
|
} else {
|
||||||
l2cap_state_change(chan, BT_CONFIG);
|
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;
|
sk = chan->sk;
|
||||||
|
|
||||||
if ((bt_sk(sk)->defer_setup && chan->state != BT_CONNECT2) ||
|
if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
|
||||||
(!bt_sk(sk)->defer_setup && chan->state != BT_CONFIG)) {
|
|
||||||
struct l2cap_cmd_rej_cid rej;
|
struct l2cap_cmd_rej_cid rej;
|
||||||
|
|
||||||
rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
|
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;
|
struct sock *parent = bt_sk(sk)->parent;
|
||||||
res = L2CAP_CR_PEND;
|
res = L2CAP_CR_PEND;
|
||||||
stat = L2CAP_CS_AUTHOR_PEND;
|
stat = L2CAP_CS_AUTHOR_PEND;
|
||||||
parent->sk_data_ready(parent, 0);
|
if (parent)
|
||||||
|
parent->sk_data_ready(parent, 0);
|
||||||
} else {
|
} else {
|
||||||
l2cap_state_change(chan, BT_CONFIG);
|
l2cap_state_change(chan, BT_CONFIG);
|
||||||
res = L2CAP_CR_SUCCESS;
|
res = L2CAP_CR_SUCCESS;
|
||||||
|
@ -36,16 +36,19 @@ int ceph_flags_to_mode(int flags)
|
|||||||
if ((flags & O_DIRECTORY) == O_DIRECTORY)
|
if ((flags & O_DIRECTORY) == O_DIRECTORY)
|
||||||
return CEPH_FILE_MODE_PIN;
|
return CEPH_FILE_MODE_PIN;
|
||||||
#endif
|
#endif
|
||||||
if ((flags & O_APPEND) == O_APPEND)
|
|
||||||
flags |= O_WRONLY;
|
|
||||||
|
|
||||||
if ((flags & O_ACCMODE) == O_RDWR)
|
switch (flags & O_ACCMODE) {
|
||||||
mode = CEPH_FILE_MODE_RDWR;
|
case O_WRONLY:
|
||||||
else if ((flags & O_ACCMODE) == O_WRONLY)
|
|
||||||
mode = CEPH_FILE_MODE_WR;
|
mode = CEPH_FILE_MODE_WR;
|
||||||
else
|
break;
|
||||||
|
case O_RDONLY:
|
||||||
mode = CEPH_FILE_MODE_RD;
|
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
|
#ifdef O_LAZY
|
||||||
if (flags & O_LAZY)
|
if (flags & O_LAZY)
|
||||||
mode |= CEPH_FILE_MODE_LAZY;
|
mode |= CEPH_FILE_MODE_LAZY;
|
||||||
|
@ -500,23 +500,20 @@ int sctp_packet_transmit(struct sctp_packet *packet)
|
|||||||
* Note: Adler-32 is no longer applicable, as has been replaced
|
* Note: Adler-32 is no longer applicable, as has been replaced
|
||||||
* by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>.
|
* by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>.
|
||||||
*/
|
*/
|
||||||
if (!sctp_checksum_disable &&
|
if (!sctp_checksum_disable) {
|
||||||
!(dst->dev->features & (NETIF_F_NO_CSUM | NETIF_F_SCTP_CSUM))) {
|
if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) {
|
||||||
__u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len);
|
__u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len);
|
||||||
|
|
||||||
/* 3) Put the resultant value into the checksum field in the
|
/* 3) Put the resultant value into the checksum field in the
|
||||||
* common header, and leave the rest of the bits unchanged.
|
* common header, and leave the rest of the bits unchanged.
|
||||||
*/
|
*/
|
||||||
sh->checksum = sctp_end_cksum(crc32);
|
sh->checksum = sctp_end_cksum(crc32);
|
||||||
} else {
|
} else {
|
||||||
if (dst->dev->features & NETIF_F_SCTP_CSUM) {
|
|
||||||
/* no need to seed pseudo checksum for SCTP */
|
/* no need to seed pseudo checksum for SCTP */
|
||||||
nskb->ip_summed = CHECKSUM_PARTIAL;
|
nskb->ip_summed = CHECKSUM_PARTIAL;
|
||||||
nskb->csum_start = (skb_transport_header(nskb) -
|
nskb->csum_start = (skb_transport_header(nskb) -
|
||||||
nskb->head);
|
nskb->head);
|
||||||
nskb->csum_offset = offsetof(struct sctphdr, checksum);
|
nskb->csum_offset = offsetof(struct sctphdr, checksum);
|
||||||
} else {
|
|
||||||
nskb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1190,7 +1190,6 @@ SND_SOC_DAPM_INPUT("DMIC1DAT"),
|
|||||||
SND_SOC_DAPM_INPUT("DMIC2DAT"),
|
SND_SOC_DAPM_INPUT("DMIC2DAT"),
|
||||||
SND_SOC_DAPM_INPUT("Clock"),
|
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_SUPPLY_S("MICBIAS Supply", 1, SND_SOC_NOPM, 0, 0, micbias_ev,
|
||||||
SND_SOC_DAPM_PRE_PMU),
|
SND_SOC_DAPM_PRE_PMU),
|
||||||
|
|
||||||
@ -1509,8 +1508,10 @@ static const struct snd_soc_dapm_route wm8994_revd_intercon[] = {
|
|||||||
{ "AIF2DACDAT", NULL, "AIF1DACDAT" },
|
{ "AIF2DACDAT", NULL, "AIF1DACDAT" },
|
||||||
{ "AIF1ADCDAT", NULL, "AIF2ADCDAT" },
|
{ "AIF1ADCDAT", NULL, "AIF2ADCDAT" },
|
||||||
{ "AIF2ADCDAT", NULL, "AIF1ADCDAT" },
|
{ "AIF2ADCDAT", NULL, "AIF1ADCDAT" },
|
||||||
{ "MICBIAS", NULL, "CLK_SYS" },
|
{ "MICBIAS1", NULL, "CLK_SYS" },
|
||||||
{ "MICBIAS", NULL, "MICBIAS Supply" },
|
{ "MICBIAS1", NULL, "MICBIAS Supply" },
|
||||||
|
{ "MICBIAS2", NULL, "CLK_SYS" },
|
||||||
|
{ "MICBIAS2", NULL, "MICBIAS Supply" },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_soc_dapm_route wm8994_intercon[] = {
|
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;
|
report = SND_JACK_MICROPHONE;
|
||||||
|
|
||||||
/* Everything else is buttons; just assign slots */
|
/* Everything else is buttons; just assign slots */
|
||||||
if (status & 0x1c0)
|
if (status & 0x1c)
|
||||||
report |= SND_JACK_BTN_0;
|
report |= SND_JACK_BTN_0;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -97,7 +97,7 @@ static int fsi_ak4642_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi_a_ak4642 = {
|
static struct fsi_ak4642_data fsi_a_ak4642 = {
|
||||||
.name = "AK4642",
|
.name = "AK4642",
|
||||||
.card = "FSIA (AK4642)",
|
.card = "FSIA-AK4642",
|
||||||
.cpu_dai = "fsia-dai",
|
.cpu_dai = "fsia-dai",
|
||||||
.codec = "ak4642-codec.0-0012",
|
.codec = "ak4642-codec.0-0012",
|
||||||
.platform = "sh_fsi.0",
|
.platform = "sh_fsi.0",
|
||||||
@ -106,7 +106,7 @@ static struct fsi_ak4642_data fsi_a_ak4642 = {
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi_b_ak4642 = {
|
static struct fsi_ak4642_data fsi_b_ak4642 = {
|
||||||
.name = "AK4642",
|
.name = "AK4642",
|
||||||
.card = "FSIB (AK4642)",
|
.card = "FSIB-AK4642",
|
||||||
.cpu_dai = "fsib-dai",
|
.cpu_dai = "fsib-dai",
|
||||||
.codec = "ak4642-codec.0-0012",
|
.codec = "ak4642-codec.0-0012",
|
||||||
.platform = "sh_fsi.0",
|
.platform = "sh_fsi.0",
|
||||||
@ -115,7 +115,7 @@ static struct fsi_ak4642_data fsi_b_ak4642 = {
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi_a_ak4643 = {
|
static struct fsi_ak4642_data fsi_a_ak4643 = {
|
||||||
.name = "AK4643",
|
.name = "AK4643",
|
||||||
.card = "FSIA (AK4643)",
|
.card = "FSIA-AK4643",
|
||||||
.cpu_dai = "fsia-dai",
|
.cpu_dai = "fsia-dai",
|
||||||
.codec = "ak4642-codec.0-0013",
|
.codec = "ak4642-codec.0-0013",
|
||||||
.platform = "sh_fsi.0",
|
.platform = "sh_fsi.0",
|
||||||
@ -124,7 +124,7 @@ static struct fsi_ak4642_data fsi_a_ak4643 = {
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi_b_ak4643 = {
|
static struct fsi_ak4642_data fsi_b_ak4643 = {
|
||||||
.name = "AK4643",
|
.name = "AK4643",
|
||||||
.card = "FSIB (AK4643)",
|
.card = "FSIB-AK4643",
|
||||||
.cpu_dai = "fsib-dai",
|
.cpu_dai = "fsib-dai",
|
||||||
.codec = "ak4642-codec.0-0013",
|
.codec = "ak4642-codec.0-0013",
|
||||||
.platform = "sh_fsi.0",
|
.platform = "sh_fsi.0",
|
||||||
@ -133,7 +133,7 @@ static struct fsi_ak4642_data fsi_b_ak4643 = {
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi2_a_ak4642 = {
|
static struct fsi_ak4642_data fsi2_a_ak4642 = {
|
||||||
.name = "AK4642",
|
.name = "AK4642",
|
||||||
.card = "FSI2A (AK4642)",
|
.card = "FSI2A-AK4642",
|
||||||
.cpu_dai = "fsia-dai",
|
.cpu_dai = "fsia-dai",
|
||||||
.codec = "ak4642-codec.0-0012",
|
.codec = "ak4642-codec.0-0012",
|
||||||
.platform = "sh_fsi2",
|
.platform = "sh_fsi2",
|
||||||
@ -142,7 +142,7 @@ static struct fsi_ak4642_data fsi2_a_ak4642 = {
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi2_b_ak4642 = {
|
static struct fsi_ak4642_data fsi2_b_ak4642 = {
|
||||||
.name = "AK4642",
|
.name = "AK4642",
|
||||||
.card = "FSI2B (AK4642)",
|
.card = "FSI2B-AK4642",
|
||||||
.cpu_dai = "fsib-dai",
|
.cpu_dai = "fsib-dai",
|
||||||
.codec = "ak4642-codec.0-0012",
|
.codec = "ak4642-codec.0-0012",
|
||||||
.platform = "sh_fsi2",
|
.platform = "sh_fsi2",
|
||||||
@ -151,7 +151,7 @@ static struct fsi_ak4642_data fsi2_b_ak4642 = {
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi2_a_ak4643 = {
|
static struct fsi_ak4642_data fsi2_a_ak4643 = {
|
||||||
.name = "AK4643",
|
.name = "AK4643",
|
||||||
.card = "FSI2A (AK4643)",
|
.card = "FSI2A-AK4643",
|
||||||
.cpu_dai = "fsia-dai",
|
.cpu_dai = "fsia-dai",
|
||||||
.codec = "ak4642-codec.0-0013",
|
.codec = "ak4642-codec.0-0013",
|
||||||
.platform = "sh_fsi2",
|
.platform = "sh_fsi2",
|
||||||
@ -160,7 +160,7 @@ static struct fsi_ak4642_data fsi2_a_ak4643 = {
|
|||||||
|
|
||||||
static struct fsi_ak4642_data fsi2_b_ak4643 = {
|
static struct fsi_ak4642_data fsi2_b_ak4643 = {
|
||||||
.name = "AK4643",
|
.name = "AK4643",
|
||||||
.card = "FSI2B (AK4643)",
|
.card = "FSI2B-AK4643",
|
||||||
.cpu_dai = "fsib-dai",
|
.cpu_dai = "fsib-dai",
|
||||||
.codec = "ak4642-codec.0-0013",
|
.codec = "ak4642-codec.0-0013",
|
||||||
.platform = "sh_fsi2",
|
.platform = "sh_fsi2",
|
||||||
|
@ -42,7 +42,7 @@ static struct snd_soc_dai_link fsi_da7210_dai = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct snd_soc_card fsi_soc_card = {
|
static struct snd_soc_card fsi_soc_card = {
|
||||||
.name = "FSI (DA7210)",
|
.name = "FSI-DA7210",
|
||||||
.dai_link = &fsi_da7210_dai,
|
.dai_link = &fsi_da7210_dai,
|
||||||
.num_links = 1,
|
.num_links = 1,
|
||||||
};
|
};
|
||||||
|
@ -83,13 +83,13 @@ static int fsi_hdmi_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static struct fsi_hdmi_data fsi2_a_hdmi = {
|
static struct fsi_hdmi_data fsi2_a_hdmi = {
|
||||||
.cpu_dai = "fsia-dai",
|
.cpu_dai = "fsia-dai",
|
||||||
.card = "FSI2A (SH MOBILE HDMI)",
|
.card = "FSI2A-HDMI",
|
||||||
.id = FSI_PORT_A,
|
.id = FSI_PORT_A,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct fsi_hdmi_data fsi2_b_hdmi = {
|
static struct fsi_hdmi_data fsi2_b_hdmi = {
|
||||||
.cpu_dai = "fsib-dai",
|
.cpu_dai = "fsib-dai",
|
||||||
.card = "FSI2B (SH MOBILE HDMI)",
|
.card = "FSI2B-HDMI",
|
||||||
.id = FSI_PORT_B,
|
.id = FSI_PORT_B,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user