2702 lines
90 KiB
Diff
2702 lines
90 KiB
Diff
diff --git a/Documentation/DocBook/libata.tmpl b/Documentation/DocBook/libata.tmpl
|
|
index d7fcdc5a43792..9b55778ab024f 100644
|
|
--- a/Documentation/DocBook/libata.tmpl
|
|
+++ b/Documentation/DocBook/libata.tmpl
|
|
@@ -324,7 +324,7 @@ Many legacy IDE drivers use ata_bmdma_status() as the bmdma_status() hook.
|
|
|
|
<sect2><title>High-level taskfile hooks</title>
|
|
<programlisting>
|
|
-void (*qc_prep) (struct ata_queued_cmd *qc);
|
|
+enum ata_completion_errors (*qc_prep) (struct ata_queued_cmd *qc);
|
|
int (*qc_issue) (struct ata_queued_cmd *qc);
|
|
</programlisting>
|
|
|
|
diff --git a/Documentation/devicetree/bindings/sound/wm8994.txt b/Documentation/devicetree/bindings/sound/wm8994.txt
|
|
index e045e90a0924b..0f03b8228d080 100644
|
|
--- a/Documentation/devicetree/bindings/sound/wm8994.txt
|
|
+++ b/Documentation/devicetree/bindings/sound/wm8994.txt
|
|
@@ -14,9 +14,15 @@ Required properties:
|
|
- #gpio-cells : Must be 2. The first cell is the pin number and the
|
|
second cell is used to specify optional parameters (currently unused).
|
|
|
|
- - AVDD2-supply, DBVDD1-supply, DBVDD2-supply, DBVDD3-supply, CPVDD-supply,
|
|
- SPKVDD1-supply, SPKVDD2-supply : power supplies for the device, as covered
|
|
- in Documentation/devicetree/bindings/regulator/regulator.txt
|
|
+ - power supplies for the device, as covered in
|
|
+ Documentation/devicetree/bindings/regulator/regulator.txt, depending
|
|
+ on compatible:
|
|
+ - for wlf,wm1811 and wlf,wm8958:
|
|
+ AVDD1-supply, AVDD2-supply, DBVDD1-supply, DBVDD2-supply, DBVDD3-supply,
|
|
+ DCVDD-supply, CPVDD-supply, SPKVDD1-supply, SPKVDD2-supply
|
|
+ - for wlf,wm8994:
|
|
+ AVDD1-supply, AVDD2-supply, DBVDD-supply, DCVDD-supply, CPVDD-supply,
|
|
+ SPKVDD1-supply, SPKVDD2-supply
|
|
|
|
Optional properties:
|
|
|
|
@@ -68,11 +74,11 @@ codec: wm8994@1a {
|
|
|
|
lineout1-se;
|
|
|
|
+ AVDD1-supply = <®ulator>;
|
|
AVDD2-supply = <®ulator>;
|
|
CPVDD-supply = <®ulator>;
|
|
- DBVDD1-supply = <®ulator>;
|
|
- DBVDD2-supply = <®ulator>;
|
|
- DBVDD3-supply = <®ulator>;
|
|
+ DBVDD-supply = <®ulator>;
|
|
+ DCVDD-supply = <®ulator>;
|
|
SPKVDD1-supply = <®ulator>;
|
|
SPKVDD2-supply = <®ulator>;
|
|
};
|
|
diff --git a/Makefile b/Makefile
|
|
index 003334dad3c3f..209fe98a591cd 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 4
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 237
|
|
+SUBLEVEL = 238
|
|
EXTRAVERSION =
|
|
NAME = Blurry Fish Butt
|
|
|
|
diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c
|
|
index e90fe903613ea..4e5f04d333188 100644
|
|
--- a/arch/m68k/q40/config.c
|
|
+++ b/arch/m68k/q40/config.c
|
|
@@ -303,6 +303,7 @@ static int q40_get_rtc_pll(struct rtc_pll_info *pll)
|
|
{
|
|
int tmp = Q40_RTC_CTRL;
|
|
|
|
+ pll->pll_ctrl = 0;
|
|
pll->pll_value = tmp & Q40_RTC_PLL_MASK;
|
|
if (tmp & Q40_RTC_PLL_SIGN)
|
|
pll->pll_value = -pll->pll_value;
|
|
diff --git a/arch/mips/include/asm/cpu-type.h b/arch/mips/include/asm/cpu-type.h
|
|
index abee2bfd10dc1..cea0bbb71590f 100644
|
|
--- a/arch/mips/include/asm/cpu-type.h
|
|
+++ b/arch/mips/include/asm/cpu-type.h
|
|
@@ -46,6 +46,7 @@ static inline int __pure __get_cpu_type(const int cpu_type)
|
|
case CPU_34K:
|
|
case CPU_1004K:
|
|
case CPU_74K:
|
|
+ case CPU_1074K:
|
|
case CPU_M14KC:
|
|
case CPU_M14KEC:
|
|
case CPU_INTERAPTIV:
|
|
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
|
|
index 47692c78d09c5..fdc5e76e1f6b0 100644
|
|
--- a/arch/s390/kernel/setup.c
|
|
+++ b/arch/s390/kernel/setup.c
|
|
@@ -513,7 +513,7 @@ static struct notifier_block kdump_mem_nb = {
|
|
/*
|
|
* Make sure that the area behind memory_end is protected
|
|
*/
|
|
-static void reserve_memory_end(void)
|
|
+static void __init reserve_memory_end(void)
|
|
{
|
|
#ifdef CONFIG_CRASH_DUMP
|
|
if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
|
|
@@ -531,7 +531,7 @@ static void reserve_memory_end(void)
|
|
/*
|
|
* Make sure that oldmem, where the dump is stored, is protected
|
|
*/
|
|
-static void reserve_oldmem(void)
|
|
+static void __init reserve_oldmem(void)
|
|
{
|
|
#ifdef CONFIG_CRASH_DUMP
|
|
if (OLDMEM_BASE)
|
|
@@ -543,7 +543,7 @@ static void reserve_oldmem(void)
|
|
/*
|
|
* Make sure that oldmem, where the dump is stored, is protected
|
|
*/
|
|
-static void remove_oldmem(void)
|
|
+static void __init remove_oldmem(void)
|
|
{
|
|
#ifdef CONFIG_CRASH_DUMP
|
|
if (OLDMEM_BASE)
|
|
diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h
|
|
index 664e8505ccd63..2f84887e8934c 100644
|
|
--- a/arch/x86/include/asm/nospec-branch.h
|
|
+++ b/arch/x86/include/asm/nospec-branch.h
|
|
@@ -275,7 +275,7 @@ DECLARE_STATIC_KEY_FALSE(mds_idle_clear);
|
|
* combination with microcode which triggers a CPU buffer flush when the
|
|
* instruction is executed.
|
|
*/
|
|
-static inline void mds_clear_cpu_buffers(void)
|
|
+static __always_inline void mds_clear_cpu_buffers(void)
|
|
{
|
|
static const u16 ds = __KERNEL_DS;
|
|
|
|
@@ -296,7 +296,7 @@ static inline void mds_clear_cpu_buffers(void)
|
|
*
|
|
* Clear CPU buffers if the corresponding static key is enabled
|
|
*/
|
|
-static inline void mds_user_clear_cpu_buffers(void)
|
|
+static __always_inline void mds_user_clear_cpu_buffers(void)
|
|
{
|
|
if (static_branch_likely(&mds_user_clear))
|
|
mds_clear_cpu_buffers();
|
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
|
index 61fc92f92e0a0..ef920da075184 100644
|
|
--- a/arch/x86/kvm/x86.c
|
|
+++ b/arch/x86/kvm/x86.c
|
|
@@ -4013,10 +4013,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|
r = -EFAULT;
|
|
if (copy_from_user(&u.ps, argp, sizeof u.ps))
|
|
goto out;
|
|
+ mutex_lock(&kvm->lock);
|
|
r = -ENXIO;
|
|
if (!kvm->arch.vpit)
|
|
- goto out;
|
|
+ goto set_pit_out;
|
|
r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
|
|
+set_pit_out:
|
|
+ mutex_unlock(&kvm->lock);
|
|
break;
|
|
}
|
|
case KVM_GET_PIT2: {
|
|
@@ -4036,10 +4039,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|
r = -EFAULT;
|
|
if (copy_from_user(&u.ps2, argp, sizeof(u.ps2)))
|
|
goto out;
|
|
+ mutex_lock(&kvm->lock);
|
|
r = -ENXIO;
|
|
if (!kvm->arch.vpit)
|
|
- goto out;
|
|
+ goto set_pit2_out;
|
|
r = kvm_vm_ioctl_set_pit2(kvm, &u.ps2);
|
|
+set_pit2_out:
|
|
+ mutex_unlock(&kvm->lock);
|
|
break;
|
|
}
|
|
case KVM_REINJECT_CONTROL: {
|
|
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
|
|
index 43f20328f830e..3096c087b7328 100644
|
|
--- a/drivers/acpi/ec.c
|
|
+++ b/drivers/acpi/ec.c
|
|
@@ -943,29 +943,21 @@ void acpi_ec_unblock_transactions_early(void)
|
|
/* --------------------------------------------------------------------------
|
|
Event Management
|
|
-------------------------------------------------------------------------- */
|
|
-static struct acpi_ec_query_handler *
|
|
-acpi_ec_get_query_handler(struct acpi_ec_query_handler *handler)
|
|
-{
|
|
- if (handler)
|
|
- kref_get(&handler->kref);
|
|
- return handler;
|
|
-}
|
|
-
|
|
static struct acpi_ec_query_handler *
|
|
acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value)
|
|
{
|
|
struct acpi_ec_query_handler *handler;
|
|
- bool found = false;
|
|
|
|
mutex_lock(&ec->mutex);
|
|
list_for_each_entry(handler, &ec->list, node) {
|
|
if (value == handler->query_bit) {
|
|
- found = true;
|
|
- break;
|
|
+ kref_get(&handler->kref);
|
|
+ mutex_unlock(&ec->mutex);
|
|
+ return handler;
|
|
}
|
|
}
|
|
mutex_unlock(&ec->mutex);
|
|
- return found ? acpi_ec_get_query_handler(handler) : NULL;
|
|
+ return NULL;
|
|
}
|
|
|
|
static void acpi_ec_query_handler_release(struct kref *kref)
|
|
diff --git a/drivers/ata/acard-ahci.c b/drivers/ata/acard-ahci.c
|
|
index ed6a30cd681a0..98581ae397c12 100644
|
|
--- a/drivers/ata/acard-ahci.c
|
|
+++ b/drivers/ata/acard-ahci.c
|
|
@@ -72,7 +72,7 @@ struct acard_sg {
|
|
__le32 size; /* bit 31 (EOT) max==0x10000 (64k) */
|
|
};
|
|
|
|
-static void acard_ahci_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors acard_ahci_qc_prep(struct ata_queued_cmd *qc);
|
|
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
|
static int acard_ahci_port_start(struct ata_port *ap);
|
|
static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
|
@@ -257,7 +257,7 @@ static unsigned int acard_ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl)
|
|
return si;
|
|
}
|
|
|
|
-static void acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct ahci_port_priv *pp = ap->private_data;
|
|
@@ -295,6 +295,8 @@ static void acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
|
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
|
|
|
ahci_fill_cmd_slot(pp, qc->tag, opts);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
|
|
index 1241cecfcfcad..48338da2ecdfa 100644
|
|
--- a/drivers/ata/libahci.c
|
|
+++ b/drivers/ata/libahci.c
|
|
@@ -71,7 +71,7 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
|
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
|
static int ahci_port_start(struct ata_port *ap);
|
|
static void ahci_port_stop(struct ata_port *ap);
|
|
-static void ahci_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors ahci_qc_prep(struct ata_queued_cmd *qc);
|
|
static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc);
|
|
static void ahci_freeze(struct ata_port *ap);
|
|
static void ahci_thaw(struct ata_port *ap);
|
|
@@ -1535,7 +1535,7 @@ static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc)
|
|
return sata_pmp_qc_defer_cmd_switch(qc);
|
|
}
|
|
|
|
-static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors ahci_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct ahci_port_priv *pp = ap->private_data;
|
|
@@ -1571,6 +1571,8 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
|
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
|
|
|
ahci_fill_cmd_slot(pp, qc->tag, opts);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static void ahci_fbs_dec_intr(struct ata_port *ap)
|
|
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
|
|
index 17cebfe5acc82..8ed3f6d75ff13 100644
|
|
--- a/drivers/ata/libata-core.c
|
|
+++ b/drivers/ata/libata-core.c
|
|
@@ -4713,7 +4713,10 @@ int ata_std_qc_defer(struct ata_queued_cmd *qc)
|
|
return ATA_DEFER_LINK;
|
|
}
|
|
|
|
-void ata_noop_qc_prep(struct ata_queued_cmd *qc) { }
|
|
+enum ata_completion_errors ata_noop_qc_prep(struct ata_queued_cmd *qc)
|
|
+{
|
|
+ return AC_ERR_OK;
|
|
+}
|
|
|
|
/**
|
|
* ata_sg_init - Associate command with scatter-gather table.
|
|
@@ -5126,7 +5129,9 @@ void ata_qc_issue(struct ata_queued_cmd *qc)
|
|
return;
|
|
}
|
|
|
|
- ap->ops->qc_prep(qc);
|
|
+ qc->err_mask |= ap->ops->qc_prep(qc);
|
|
+ if (unlikely(qc->err_mask))
|
|
+ goto err;
|
|
trace_ata_qc_issue(qc);
|
|
qc->err_mask |= ap->ops->qc_issue(qc);
|
|
if (unlikely(qc->err_mask))
|
|
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
|
|
index 1d8901fc0bfa9..0c69bc1d30c62 100644
|
|
--- a/drivers/ata/libata-sff.c
|
|
+++ b/drivers/ata/libata-sff.c
|
|
@@ -2741,12 +2741,14 @@ static void ata_bmdma_fill_sg_dumb(struct ata_queued_cmd *qc)
|
|
* LOCKING:
|
|
* spin_lock_irqsave(host lock)
|
|
*/
|
|
-void ata_bmdma_qc_prep(struct ata_queued_cmd *qc)
|
|
+enum ata_completion_errors ata_bmdma_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
ata_bmdma_fill_sg(qc);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
|
|
|
@@ -2759,12 +2761,14 @@ EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
|
* LOCKING:
|
|
* spin_lock_irqsave(host lock)
|
|
*/
|
|
-void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc)
|
|
+enum ata_completion_errors ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
ata_bmdma_fill_sg_dumb(qc);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
EXPORT_SYMBOL_GPL(ata_bmdma_dumb_qc_prep);
|
|
|
|
diff --git a/drivers/ata/pata_macio.c b/drivers/ata/pata_macio.c
|
|
index e3d4b059fcd14..f1a20d1a65be0 100644
|
|
--- a/drivers/ata/pata_macio.c
|
|
+++ b/drivers/ata/pata_macio.c
|
|
@@ -507,7 +507,7 @@ static int pata_macio_cable_detect(struct ata_port *ap)
|
|
return ATA_CBL_PATA40;
|
|
}
|
|
|
|
-static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
unsigned int write = (qc->tf.flags & ATA_TFLAG_WRITE);
|
|
struct ata_port *ap = qc->ap;
|
|
@@ -520,7 +520,7 @@ static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
|
__func__, qc, qc->flags, write, qc->dev->devno);
|
|
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
table = (struct dbdma_cmd *) priv->dma_table_cpu;
|
|
|
|
@@ -565,6 +565,8 @@ static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
|
table->command = cpu_to_le16(DBDMA_STOP);
|
|
|
|
dev_dbgdma(priv->dev, "%s: %d DMA list entries\n", __func__, pi);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
|
|
diff --git a/drivers/ata/pata_pxa.c b/drivers/ata/pata_pxa.c
|
|
index f6c46e9a4dc0f..d7186a503e358 100644
|
|
--- a/drivers/ata/pata_pxa.c
|
|
+++ b/drivers/ata/pata_pxa.c
|
|
@@ -59,25 +59,27 @@ static void pxa_ata_dma_irq(void *d)
|
|
/*
|
|
* Prepare taskfile for submission.
|
|
*/
|
|
-static void pxa_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors pxa_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct pata_pxa_data *pd = qc->ap->private_data;
|
|
struct dma_async_tx_descriptor *tx;
|
|
enum dma_transfer_direction dir;
|
|
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
dir = (qc->dma_dir == DMA_TO_DEVICE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
|
|
tx = dmaengine_prep_slave_sg(pd->dma_chan, qc->sg, qc->n_elem, dir,
|
|
DMA_PREP_INTERRUPT);
|
|
if (!tx) {
|
|
ata_dev_err(qc->dev, "prep_slave_sg() failed\n");
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
}
|
|
tx->callback = pxa_ata_dma_irq;
|
|
tx->callback_param = pd;
|
|
pd->dma_cookie = dmaengine_submit(tx);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
/*
|
|
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
|
|
index 64d682c6ee57e..11da13bea2c93 100644
|
|
--- a/drivers/ata/pdc_adma.c
|
|
+++ b/drivers/ata/pdc_adma.c
|
|
@@ -132,7 +132,7 @@ static int adma_ata_init_one(struct pci_dev *pdev,
|
|
const struct pci_device_id *ent);
|
|
static int adma_port_start(struct ata_port *ap);
|
|
static void adma_port_stop(struct ata_port *ap);
|
|
-static void adma_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc);
|
|
static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
|
|
static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
|
static void adma_freeze(struct ata_port *ap);
|
|
@@ -311,7 +311,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
|
|
return i;
|
|
}
|
|
|
|
-static void adma_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct adma_port_priv *pp = qc->ap->private_data;
|
|
u8 *buf = pp->pkt;
|
|
@@ -322,7 +322,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
|
|
|
|
adma_enter_reg_mode(qc->ap);
|
|
if (qc->tf.protocol != ATA_PROT_DMA)
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
buf[i++] = 0; /* Response flags */
|
|
buf[i++] = 0; /* reserved */
|
|
@@ -387,6 +387,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
|
|
printk("%s\n", obuf);
|
|
}
|
|
#endif
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static inline void adma_packet_start(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
|
|
index a723ae9297831..100b5a3621ef3 100644
|
|
--- a/drivers/ata/sata_fsl.c
|
|
+++ b/drivers/ata/sata_fsl.c
|
|
@@ -513,7 +513,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
|
return num_prde;
|
|
}
|
|
|
|
-static void sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct sata_fsl_port_priv *pp = ap->private_data;
|
|
@@ -559,6 +559,8 @@ static void sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
|
|
|
VPRINTK("SATA FSL : xx_qc_prep, di = 0x%x, ttl = %d, num_prde = %d\n",
|
|
desc_info, ttl_dwords, num_prde);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
|
|
index e81a8217f1ff7..349a175f02675 100644
|
|
--- a/drivers/ata/sata_inic162x.c
|
|
+++ b/drivers/ata/sata_inic162x.c
|
|
@@ -472,7 +472,7 @@ static void inic_fill_sg(struct inic_prd *prd, struct ata_queued_cmd *qc)
|
|
prd[-1].flags |= PRD_END;
|
|
}
|
|
|
|
-static void inic_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors inic_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct inic_port_priv *pp = qc->ap->private_data;
|
|
struct inic_pkt *pkt = pp->pkt;
|
|
@@ -532,6 +532,8 @@ static void inic_qc_prep(struct ata_queued_cmd *qc)
|
|
inic_fill_sg(prd, qc);
|
|
|
|
pp->cpb_tbl[0] = pp->pkt_dma;
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static unsigned int inic_qc_issue(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
|
|
index 729f26322095e..5718dc94c90cb 100644
|
|
--- a/drivers/ata/sata_mv.c
|
|
+++ b/drivers/ata/sata_mv.c
|
|
@@ -605,8 +605,8 @@ static int mv5_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val)
|
|
static int mv_port_start(struct ata_port *ap);
|
|
static void mv_port_stop(struct ata_port *ap);
|
|
static int mv_qc_defer(struct ata_queued_cmd *qc);
|
|
-static void mv_qc_prep(struct ata_queued_cmd *qc);
|
|
-static void mv_qc_prep_iie(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors mv_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors mv_qc_prep_iie(struct ata_queued_cmd *qc);
|
|
static unsigned int mv_qc_issue(struct ata_queued_cmd *qc);
|
|
static int mv_hardreset(struct ata_link *link, unsigned int *class,
|
|
unsigned long deadline);
|
|
@@ -2046,7 +2046,7 @@ static void mv_rw_multi_errata_sata24(struct ata_queued_cmd *qc)
|
|
* LOCKING:
|
|
* Inherited from caller.
|
|
*/
|
|
-static void mv_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors mv_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct mv_port_priv *pp = ap->private_data;
|
|
@@ -2058,15 +2058,15 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
|
switch (tf->protocol) {
|
|
case ATA_PROT_DMA:
|
|
if (tf->command == ATA_CMD_DSM)
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
/* fall-thru */
|
|
case ATA_PROT_NCQ:
|
|
break; /* continue below */
|
|
case ATA_PROT_PIO:
|
|
mv_rw_multi_errata_sata24(qc);
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
default:
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
/* Fill in command request block
|
|
@@ -2113,12 +2113,10 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
|
* non-NCQ mode are: [RW] STREAM DMA and W DMA FUA EXT, none
|
|
* of which are defined/used by Linux. If we get here, this
|
|
* driver needs work.
|
|
- *
|
|
- * FIXME: modify libata to give qc_prep a return value and
|
|
- * return error here.
|
|
*/
|
|
- BUG_ON(tf->command);
|
|
- break;
|
|
+ ata_port_err(ap, "%s: unsupported command: %.2x\n", __func__,
|
|
+ tf->command);
|
|
+ return AC_ERR_INVALID;
|
|
}
|
|
mv_crqb_pack_cmd(cw++, tf->nsect, ATA_REG_NSECT, 0);
|
|
mv_crqb_pack_cmd(cw++, tf->hob_lbal, ATA_REG_LBAL, 0);
|
|
@@ -2131,8 +2129,10 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
|
mv_crqb_pack_cmd(cw++, tf->command, ATA_REG_CMD, 1); /* last */
|
|
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
mv_fill_sg(qc);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
/**
|
|
@@ -2147,7 +2147,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
|
* LOCKING:
|
|
* Inherited from caller.
|
|
*/
|
|
-static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct mv_port_priv *pp = ap->private_data;
|
|
@@ -2158,9 +2158,9 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
|
|
|
if ((tf->protocol != ATA_PROT_DMA) &&
|
|
(tf->protocol != ATA_PROT_NCQ))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
if (tf->command == ATA_CMD_DSM)
|
|
- return; /* use bmdma for this */
|
|
+ return AC_ERR_OK; /* use bmdma for this */
|
|
|
|
/* Fill in Gen IIE command request block */
|
|
if (!(tf->flags & ATA_TFLAG_WRITE))
|
|
@@ -2201,8 +2201,10 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
|
);
|
|
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
mv_fill_sg(qc);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
/**
|
|
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
|
|
index 734f563b8d37b..bb098c4ae1775 100644
|
|
--- a/drivers/ata/sata_nv.c
|
|
+++ b/drivers/ata/sata_nv.c
|
|
@@ -313,7 +313,7 @@ static void nv_ck804_freeze(struct ata_port *ap);
|
|
static void nv_ck804_thaw(struct ata_port *ap);
|
|
static int nv_adma_slave_config(struct scsi_device *sdev);
|
|
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
|
-static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
|
|
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance);
|
|
static void nv_adma_irq_clear(struct ata_port *ap);
|
|
@@ -335,7 +335,7 @@ static void nv_mcp55_freeze(struct ata_port *ap);
|
|
static void nv_swncq_error_handler(struct ata_port *ap);
|
|
static int nv_swncq_slave_config(struct scsi_device *sdev);
|
|
static int nv_swncq_port_start(struct ata_port *ap);
|
|
-static void nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
|
|
static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc);
|
|
static void nv_swncq_irq_clear(struct ata_port *ap, u16 fis);
|
|
@@ -1382,7 +1382,7 @@ static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc)
|
|
return 1;
|
|
}
|
|
|
|
-static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
|
struct nv_adma_cpb *cpb = &pp->cpb[qc->tag];
|
|
@@ -1394,7 +1394,7 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
|
(qc->flags & ATA_QCFLAG_DMAMAP));
|
|
nv_adma_register_mode(qc->ap);
|
|
ata_bmdma_qc_prep(qc);
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
cpb->resp_flags = NV_CPB_RESP_DONE;
|
|
@@ -1426,6 +1426,8 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
|
cpb->ctl_flags = ctl_flags;
|
|
wmb();
|
|
cpb->resp_flags = 0;
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
|
|
@@ -1989,17 +1991,19 @@ static int nv_swncq_port_start(struct ata_port *ap)
|
|
return 0;
|
|
}
|
|
|
|
-static void nv_swncq_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
if (qc->tf.protocol != ATA_PROT_NCQ) {
|
|
ata_bmdma_qc_prep(qc);
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
nv_swncq_fill_sg(qc);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
|
|
index 0fa211e2831cd..8ad8b376a642c 100644
|
|
--- a/drivers/ata/sata_promise.c
|
|
+++ b/drivers/ata/sata_promise.c
|
|
@@ -155,7 +155,7 @@ static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 va
|
|
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
|
static int pdc_common_port_start(struct ata_port *ap);
|
|
static int pdc_sata_port_start(struct ata_port *ap);
|
|
-static void pdc_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors pdc_qc_prep(struct ata_queued_cmd *qc);
|
|
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
|
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
|
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
|
|
@@ -649,7 +649,7 @@ static void pdc_fill_sg(struct ata_queued_cmd *qc)
|
|
prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
|
}
|
|
|
|
-static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors pdc_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct pdc_port_priv *pp = qc->ap->private_data;
|
|
unsigned int i;
|
|
@@ -681,6 +681,8 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
|
default:
|
|
break;
|
|
}
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static int pdc_is_sataii_tx4(unsigned long flags)
|
|
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c
|
|
index af987a4f33d19..80ff3bbfc8269 100644
|
|
--- a/drivers/ata/sata_qstor.c
|
|
+++ b/drivers/ata/sata_qstor.c
|
|
@@ -116,7 +116,7 @@ static int qs_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
|
static int qs_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
|
static int qs_port_start(struct ata_port *ap);
|
|
static void qs_host_stop(struct ata_host *host);
|
|
-static void qs_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors qs_qc_prep(struct ata_queued_cmd *qc);
|
|
static unsigned int qs_qc_issue(struct ata_queued_cmd *qc);
|
|
static int qs_check_atapi_dma(struct ata_queued_cmd *qc);
|
|
static void qs_freeze(struct ata_port *ap);
|
|
@@ -276,7 +276,7 @@ static unsigned int qs_fill_sg(struct ata_queued_cmd *qc)
|
|
return si;
|
|
}
|
|
|
|
-static void qs_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors qs_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct qs_port_priv *pp = qc->ap->private_data;
|
|
u8 dflags = QS_DF_PORD, *buf = pp->pkt;
|
|
@@ -288,7 +288,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
|
|
|
|
qs_enter_reg_mode(qc->ap);
|
|
if (qc->tf.protocol != ATA_PROT_DMA)
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
nelem = qs_fill_sg(qc);
|
|
|
|
@@ -311,6 +311,8 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
|
|
|
|
/* frame information structure (FIS) */
|
|
ata_tf_to_fis(&qc->tf, 0, 1, &buf[32]);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static inline void qs_packet_start(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c
|
|
index 21b80f5ee0920..4199f7a39be0b 100644
|
|
--- a/drivers/ata/sata_rcar.c
|
|
+++ b/drivers/ata/sata_rcar.c
|
|
@@ -551,12 +551,14 @@ static void sata_rcar_bmdma_fill_sg(struct ata_queued_cmd *qc)
|
|
prd[si - 1].addr |= cpu_to_le32(SATA_RCAR_DTEND);
|
|
}
|
|
|
|
-static void sata_rcar_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors sata_rcar_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
sata_rcar_bmdma_fill_sg(qc);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static void sata_rcar_bmdma_setup(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
|
|
index 29bcff086bced..73156a301912f 100644
|
|
--- a/drivers/ata/sata_sil.c
|
|
+++ b/drivers/ata/sata_sil.c
|
|
@@ -119,7 +119,7 @@ static void sil_dev_config(struct ata_device *dev);
|
|
static int sil_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
|
|
static int sil_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
|
static int sil_set_mode(struct ata_link *link, struct ata_device **r_failed);
|
|
-static void sil_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors sil_qc_prep(struct ata_queued_cmd *qc);
|
|
static void sil_bmdma_setup(struct ata_queued_cmd *qc);
|
|
static void sil_bmdma_start(struct ata_queued_cmd *qc);
|
|
static void sil_bmdma_stop(struct ata_queued_cmd *qc);
|
|
@@ -333,12 +333,14 @@ static void sil_fill_sg(struct ata_queued_cmd *qc)
|
|
last_prd->flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
|
}
|
|
|
|
-static void sil_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors sil_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
|
- return;
|
|
+ return AC_ERR_OK;
|
|
|
|
sil_fill_sg(qc);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static unsigned char sil_get_device_cache_line(struct pci_dev *pdev)
|
|
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
|
|
index 4b1995e2d044b..ffa3bf724054d 100644
|
|
--- a/drivers/ata/sata_sil24.c
|
|
+++ b/drivers/ata/sata_sil24.c
|
|
@@ -336,7 +336,7 @@ static void sil24_dev_config(struct ata_device *dev);
|
|
static int sil24_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val);
|
|
static int sil24_scr_write(struct ata_link *link, unsigned sc_reg, u32 val);
|
|
static int sil24_qc_defer(struct ata_queued_cmd *qc);
|
|
-static void sil24_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors sil24_qc_prep(struct ata_queued_cmd *qc);
|
|
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
|
|
static bool sil24_qc_fill_rtf(struct ata_queued_cmd *qc);
|
|
static void sil24_pmp_attach(struct ata_port *ap);
|
|
@@ -840,7 +840,7 @@ static int sil24_qc_defer(struct ata_queued_cmd *qc)
|
|
return ata_std_qc_defer(qc);
|
|
}
|
|
|
|
-static void sil24_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors sil24_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct sil24_port_priv *pp = ap->private_data;
|
|
@@ -884,6 +884,8 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc)
|
|
|
|
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
|
sil24_fill_sg(qc, sge);
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc)
|
|
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
|
|
index fab504fd9cfd7..a7cd2c7ee1388 100644
|
|
--- a/drivers/ata/sata_sx4.c
|
|
+++ b/drivers/ata/sata_sx4.c
|
|
@@ -218,7 +218,7 @@ static void pdc_error_handler(struct ata_port *ap);
|
|
static void pdc_freeze(struct ata_port *ap);
|
|
static void pdc_thaw(struct ata_port *ap);
|
|
static int pdc_port_start(struct ata_port *ap);
|
|
-static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
|
|
+static enum ata_completion_errors pdc20621_qc_prep(struct ata_queued_cmd *qc);
|
|
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
|
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
|
static unsigned int pdc20621_dimm_init(struct ata_host *host);
|
|
@@ -546,7 +546,7 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
|
|
VPRINTK("ata pkt buf ofs %u, mmio copied\n", i);
|
|
}
|
|
|
|
-static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
|
+static enum ata_completion_errors pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
|
{
|
|
switch (qc->tf.protocol) {
|
|
case ATA_PROT_DMA:
|
|
@@ -558,6 +558,8 @@ static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
|
default:
|
|
break;
|
|
}
|
|
+
|
|
+ return AC_ERR_OK;
|
|
}
|
|
|
|
static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
|
|
diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c
|
|
index ad591a2f7c822..340a1ee79d280 100644
|
|
--- a/drivers/atm/eni.c
|
|
+++ b/drivers/atm/eni.c
|
|
@@ -2242,7 +2242,7 @@ static int eni_init_one(struct pci_dev *pci_dev,
|
|
|
|
rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
|
|
if (rc < 0)
|
|
- goto out;
|
|
+ goto err_disable;
|
|
|
|
rc = -ENOMEM;
|
|
eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
|
|
diff --git a/drivers/char/tlclk.c b/drivers/char/tlclk.c
|
|
index 100cd1de9939d..59e1e94d12c01 100644
|
|
--- a/drivers/char/tlclk.c
|
|
+++ b/drivers/char/tlclk.c
|
|
@@ -777,17 +777,21 @@ static int __init tlclk_init(void)
|
|
{
|
|
int ret;
|
|
|
|
+ telclk_interrupt = (inb(TLCLK_REG7) & 0x0f);
|
|
+
|
|
+ alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL);
|
|
+ if (!alarm_events) {
|
|
+ ret = -ENOMEM;
|
|
+ goto out1;
|
|
+ }
|
|
+
|
|
ret = register_chrdev(tlclk_major, "telco_clock", &tlclk_fops);
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "tlclk: can't get major %d.\n", tlclk_major);
|
|
+ kfree(alarm_events);
|
|
return ret;
|
|
}
|
|
tlclk_major = ret;
|
|
- alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL);
|
|
- if (!alarm_events) {
|
|
- ret = -ENOMEM;
|
|
- goto out1;
|
|
- }
|
|
|
|
/* Read telecom clock IRQ number (Set by BIOS) */
|
|
if (!request_region(TLCLK_BASE, 8, "telco_clock")) {
|
|
@@ -796,7 +800,6 @@ static int __init tlclk_init(void)
|
|
ret = -EBUSY;
|
|
goto out2;
|
|
}
|
|
- telclk_interrupt = (inb(TLCLK_REG7) & 0x0f);
|
|
|
|
if (0x0F == telclk_interrupt ) { /* not MCPBL0010 ? */
|
|
printk(KERN_ERR "telclk_interrupt = 0x%x non-mcpbl0010 hw.\n",
|
|
@@ -837,8 +840,8 @@ out3:
|
|
release_region(TLCLK_BASE, 8);
|
|
out2:
|
|
kfree(alarm_events);
|
|
-out1:
|
|
unregister_chrdev(tlclk_major, "telco_clock");
|
|
+out1:
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c
|
|
index 3e6a22658b63b..d4cc1a1ac1f73 100644
|
|
--- a/drivers/char/tpm/tpm_ibmvtpm.c
|
|
+++ b/drivers/char/tpm/tpm_ibmvtpm.c
|
|
@@ -543,6 +543,7 @@ static irqreturn_t ibmvtpm_interrupt(int irq, void *vtpm_instance)
|
|
*/
|
|
while ((crq = ibmvtpm_crq_get_next(ibmvtpm)) != NULL) {
|
|
ibmvtpm_crq_process(crq, ibmvtpm);
|
|
+ wake_up_interruptible(&ibmvtpm->crq_queue.wq);
|
|
crq->valid = 0;
|
|
smp_wmb();
|
|
}
|
|
@@ -589,6 +590,7 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
|
}
|
|
|
|
crq_q->num_entry = CRQ_RES_BUF_SIZE / sizeof(*crq_q->crq_addr);
|
|
+ init_waitqueue_head(&crq_q->wq);
|
|
ibmvtpm->crq_dma_handle = dma_map_single(dev, crq_q->crq_addr,
|
|
CRQ_RES_BUF_SIZE,
|
|
DMA_BIDIRECTIONAL);
|
|
@@ -641,6 +643,13 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
|
if (rc)
|
|
goto init_irq_cleanup;
|
|
|
|
+ if (!wait_event_timeout(ibmvtpm->crq_queue.wq,
|
|
+ ibmvtpm->rtce_buf != NULL,
|
|
+ HZ)) {
|
|
+ dev_err(dev, "CRQ response timed out\n");
|
|
+ goto init_irq_cleanup;
|
|
+ }
|
|
+
|
|
return tpm_chip_register(chip);
|
|
init_irq_cleanup:
|
|
do {
|
|
diff --git a/drivers/char/tpm/tpm_ibmvtpm.h b/drivers/char/tpm/tpm_ibmvtpm.h
|
|
index 6af92890518f8..1a8c3b698f104 100644
|
|
--- a/drivers/char/tpm/tpm_ibmvtpm.h
|
|
+++ b/drivers/char/tpm/tpm_ibmvtpm.h
|
|
@@ -31,6 +31,7 @@ struct ibmvtpm_crq_queue {
|
|
struct ibmvtpm_crq *crq_addr;
|
|
u32 index;
|
|
u32 num_entry;
|
|
+ wait_queue_head_t wq;
|
|
};
|
|
|
|
struct ibmvtpm_dev {
|
|
diff --git a/drivers/devfreq/tegra-devfreq.c b/drivers/devfreq/tegra-devfreq.c
|
|
index 64a2e02b87d78..0b0de6a049afb 100644
|
|
--- a/drivers/devfreq/tegra-devfreq.c
|
|
+++ b/drivers/devfreq/tegra-devfreq.c
|
|
@@ -79,6 +79,8 @@
|
|
|
|
#define KHZ 1000
|
|
|
|
+#define KHZ_MAX (ULONG_MAX / KHZ)
|
|
+
|
|
/* Assume that the bus is saturated if the utilization is 25% */
|
|
#define BUS_SATURATION_RATIO 25
|
|
|
|
@@ -179,7 +181,7 @@ struct tegra_actmon_emc_ratio {
|
|
};
|
|
|
|
static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = {
|
|
- { 1400000, ULONG_MAX },
|
|
+ { 1400000, KHZ_MAX },
|
|
{ 1200000, 750000 },
|
|
{ 1100000, 600000 },
|
|
{ 1000000, 500000 },
|
|
diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c
|
|
index b5cf5d36de2b4..68c460a2b16ea 100644
|
|
--- a/drivers/dma/tegra20-apb-dma.c
|
|
+++ b/drivers/dma/tegra20-apb-dma.c
|
|
@@ -1207,8 +1207,7 @@ static void tegra_dma_free_chan_resources(struct dma_chan *dc)
|
|
|
|
dev_dbg(tdc2dev(tdc), "Freeing channel %d\n", tdc->id);
|
|
|
|
- if (tdc->busy)
|
|
- tegra_dma_terminate_all(dc);
|
|
+ tegra_dma_terminate_all(dc);
|
|
|
|
spin_lock_irqsave(&tdc->lock, flags);
|
|
list_splice_init(&tdc->pending_sg_req, &sg_req_list);
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/atom.c b/drivers/gpu/drm/amd/amdgpu/atom.c
|
|
index 1b50e6c13fb3f..5fbf99d600587 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/atom.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/atom.c
|
|
@@ -748,8 +748,8 @@ static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg)
|
|
cjiffies = jiffies;
|
|
if (time_after(cjiffies, ctx->last_jump_jiffies)) {
|
|
cjiffies -= ctx->last_jump_jiffies;
|
|
- if ((jiffies_to_msecs(cjiffies) > 5000)) {
|
|
- DRM_ERROR("atombios stuck in loop for more than 5secs aborting\n");
|
|
+ if ((jiffies_to_msecs(cjiffies) > 10000)) {
|
|
+ DRM_ERROR("atombios stuck in loop for more than 10secs aborting\n");
|
|
ctx->abort = true;
|
|
}
|
|
} else {
|
|
diff --git a/drivers/gpu/drm/gma500/cdv_intel_display.c b/drivers/gpu/drm/gma500/cdv_intel_display.c
|
|
index 7d47b3d5cc0d0..54d554d720004 100644
|
|
--- a/drivers/gpu/drm/gma500/cdv_intel_display.c
|
|
+++ b/drivers/gpu/drm/gma500/cdv_intel_display.c
|
|
@@ -415,6 +415,8 @@ static bool cdv_intel_find_dp_pll(const struct gma_limit_t *limit,
|
|
struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
|
|
struct gma_clock_t clock;
|
|
|
|
+ memset(&clock, 0, sizeof(clock));
|
|
+
|
|
switch (refclk) {
|
|
case 27000:
|
|
if (target < 200000) {
|
|
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c
|
|
index 3e4d3d5560bf1..6315f77b4a58c 100644
|
|
--- a/drivers/infiniband/core/ucma.c
|
|
+++ b/drivers/infiniband/core/ucma.c
|
|
@@ -1295,13 +1295,13 @@ static ssize_t ucma_set_option(struct ucma_file *file, const char __user *inbuf,
|
|
if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
|
|
return -EFAULT;
|
|
|
|
+ if (unlikely(cmd.optlen > KMALLOC_MAX_SIZE))
|
|
+ return -EINVAL;
|
|
+
|
|
ctx = ucma_get_ctx(file, cmd.id);
|
|
if (IS_ERR(ctx))
|
|
return PTR_ERR(ctx);
|
|
|
|
- if (unlikely(cmd.optlen > KMALLOC_MAX_SIZE))
|
|
- return -EINVAL;
|
|
-
|
|
optval = memdup_user((void __user *) (unsigned long) cmd.optval,
|
|
cmd.optlen);
|
|
if (IS_ERR(optval)) {
|
|
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
|
|
index 7fe7df56fa334..f0939fc1cfe55 100644
|
|
--- a/drivers/md/bcache/bcache.h
|
|
+++ b/drivers/md/bcache/bcache.h
|
|
@@ -547,6 +547,7 @@ struct cache_set {
|
|
*/
|
|
wait_queue_head_t btree_cache_wait;
|
|
struct task_struct *btree_cache_alloc_lock;
|
|
+ spinlock_t btree_cannibalize_lock;
|
|
|
|
/*
|
|
* When we free a btree node, we increment the gen of the bucket the
|
|
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
|
|
index 122d975220945..bdf6071c1b184 100644
|
|
--- a/drivers/md/bcache/btree.c
|
|
+++ b/drivers/md/bcache/btree.c
|
|
@@ -841,15 +841,17 @@ out:
|
|
|
|
static int mca_cannibalize_lock(struct cache_set *c, struct btree_op *op)
|
|
{
|
|
- struct task_struct *old;
|
|
-
|
|
- old = cmpxchg(&c->btree_cache_alloc_lock, NULL, current);
|
|
- if (old && old != current) {
|
|
+ spin_lock(&c->btree_cannibalize_lock);
|
|
+ if (likely(c->btree_cache_alloc_lock == NULL)) {
|
|
+ c->btree_cache_alloc_lock = current;
|
|
+ } else if (c->btree_cache_alloc_lock != current) {
|
|
if (op)
|
|
prepare_to_wait(&c->btree_cache_wait, &op->wait,
|
|
TASK_UNINTERRUPTIBLE);
|
|
+ spin_unlock(&c->btree_cannibalize_lock);
|
|
return -EINTR;
|
|
}
|
|
+ spin_unlock(&c->btree_cannibalize_lock);
|
|
|
|
return 0;
|
|
}
|
|
@@ -884,10 +886,12 @@ static struct btree *mca_cannibalize(struct cache_set *c, struct btree_op *op,
|
|
*/
|
|
static void bch_cannibalize_unlock(struct cache_set *c)
|
|
{
|
|
+ spin_lock(&c->btree_cannibalize_lock);
|
|
if (c->btree_cache_alloc_lock == current) {
|
|
c->btree_cache_alloc_lock = NULL;
|
|
wake_up(&c->btree_cache_wait);
|
|
}
|
|
+ spin_unlock(&c->btree_cannibalize_lock);
|
|
}
|
|
|
|
static struct btree *mca_alloc(struct cache_set *c, struct btree_op *op,
|
|
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
|
|
index f7f8fb079d2a9..d73f9ea776861 100644
|
|
--- a/drivers/md/bcache/super.c
|
|
+++ b/drivers/md/bcache/super.c
|
|
@@ -1511,6 +1511,7 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
|
|
sema_init(&c->sb_write_mutex, 1);
|
|
mutex_init(&c->bucket_lock);
|
|
init_waitqueue_head(&c->btree_cache_wait);
|
|
+ spin_lock_init(&c->btree_cannibalize_lock);
|
|
init_waitqueue_head(&c->bucket_wait);
|
|
init_waitqueue_head(&c->gc_wait);
|
|
sema_init(&c->uuid_write_mutex, 1);
|
|
diff --git a/drivers/media/dvb-frontends/tda10071.c b/drivers/media/dvb-frontends/tda10071.c
|
|
index 119d47596ac81..b81887c4f72a9 100644
|
|
--- a/drivers/media/dvb-frontends/tda10071.c
|
|
+++ b/drivers/media/dvb-frontends/tda10071.c
|
|
@@ -483,10 +483,11 @@ static int tda10071_read_status(struct dvb_frontend *fe, enum fe_status *status)
|
|
goto error;
|
|
|
|
if (dev->delivery_system == SYS_DVBS) {
|
|
- dev->dvbv3_ber = buf[0] << 24 | buf[1] << 16 |
|
|
- buf[2] << 8 | buf[3] << 0;
|
|
- dev->post_bit_error += buf[0] << 24 | buf[1] << 16 |
|
|
- buf[2] << 8 | buf[3] << 0;
|
|
+ u32 bit_error = buf[0] << 24 | buf[1] << 16 |
|
|
+ buf[2] << 8 | buf[3] << 0;
|
|
+
|
|
+ dev->dvbv3_ber = bit_error;
|
|
+ dev->post_bit_error += bit_error;
|
|
c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
|
|
c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
|
|
dev->block_error += buf[4] << 8 | buf[5] << 0;
|
|
diff --git a/drivers/media/usb/go7007/go7007-usb.c b/drivers/media/usb/go7007/go7007-usb.c
|
|
index 4857c467e76cd..4490786936a02 100644
|
|
--- a/drivers/media/usb/go7007/go7007-usb.c
|
|
+++ b/drivers/media/usb/go7007/go7007-usb.c
|
|
@@ -1052,6 +1052,7 @@ static int go7007_usb_probe(struct usb_interface *intf,
|
|
struct go7007_usb *usb;
|
|
const struct go7007_usb_board *board;
|
|
struct usb_device *usbdev = interface_to_usbdev(intf);
|
|
+ struct usb_host_endpoint *ep;
|
|
unsigned num_i2c_devs;
|
|
char *name;
|
|
int video_pipe, i, v_urb_len;
|
|
@@ -1147,7 +1148,8 @@ static int go7007_usb_probe(struct usb_interface *intf,
|
|
if (usb->intr_urb->transfer_buffer == NULL)
|
|
goto allocfail;
|
|
|
|
- if (go->board_id == GO7007_BOARDID_SENSORAY_2250)
|
|
+ ep = usb->usbdev->ep_in[4];
|
|
+ if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
|
|
usb_fill_bulk_urb(usb->intr_urb, usb->usbdev,
|
|
usb_rcvbulkpipe(usb->usbdev, 4),
|
|
usb->intr_urb->transfer_buffer, 2*sizeof(u16),
|
|
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
|
|
index 215bb5eeb5acf..c57e375fad6ed 100644
|
|
--- a/drivers/mfd/mfd-core.c
|
|
+++ b/drivers/mfd/mfd-core.c
|
|
@@ -31,6 +31,11 @@ int mfd_cell_enable(struct platform_device *pdev)
|
|
const struct mfd_cell *cell = mfd_get_cell(pdev);
|
|
int err = 0;
|
|
|
|
+ if (!cell->enable) {
|
|
+ dev_dbg(&pdev->dev, "No .enable() call-back registered\n");
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
/* only call enable hook if the cell wasn't previously enabled */
|
|
if (atomic_inc_return(cell->usage_count) == 1)
|
|
err = cell->enable(pdev);
|
|
@@ -48,6 +53,11 @@ int mfd_cell_disable(struct platform_device *pdev)
|
|
const struct mfd_cell *cell = mfd_get_cell(pdev);
|
|
int err = 0;
|
|
|
|
+ if (!cell->disable) {
|
|
+ dev_dbg(&pdev->dev, "No .disable() call-back registered\n");
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
/* only disable if no other clients are using it */
|
|
if (atomic_dec_return(cell->usage_count) == 0)
|
|
err = cell->disable(pdev);
|
|
diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
|
|
index 972935f1b2f7e..3a3da0eeef1fb 100644
|
|
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
|
|
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
|
|
@@ -724,7 +724,6 @@ static struct mtd_info *cfi_amdstd_setup(struct mtd_info *mtd)
|
|
kfree(mtd->eraseregions);
|
|
kfree(mtd);
|
|
kfree(cfi->cmdset_priv);
|
|
- kfree(cfi->cfiq);
|
|
return NULL;
|
|
}
|
|
|
|
diff --git a/drivers/mtd/cmdlinepart.c b/drivers/mtd/cmdlinepart.c
|
|
index 08f62987cc37c..ffbc9b304beb2 100644
|
|
--- a/drivers/mtd/cmdlinepart.c
|
|
+++ b/drivers/mtd/cmdlinepart.c
|
|
@@ -228,12 +228,29 @@ static int mtdpart_setup_real(char *s)
|
|
struct cmdline_mtd_partition *this_mtd;
|
|
struct mtd_partition *parts;
|
|
int mtd_id_len, num_parts;
|
|
- char *p, *mtd_id;
|
|
+ char *p, *mtd_id, *semicol;
|
|
+
|
|
+ /*
|
|
+ * Replace the first ';' by a NULL char so strrchr can work
|
|
+ * properly.
|
|
+ */
|
|
+ semicol = strchr(s, ';');
|
|
+ if (semicol)
|
|
+ *semicol = '\0';
|
|
|
|
mtd_id = s;
|
|
|
|
- /* fetch <mtd-id> */
|
|
- p = strchr(s, ':');
|
|
+ /*
|
|
+ * fetch <mtd-id>. We use strrchr to ignore all ':' that could
|
|
+ * be present in the MTD name, only the last one is interpreted
|
|
+ * as an <mtd-id>/<part-definition> separator.
|
|
+ */
|
|
+ p = strrchr(s, ':');
|
|
+
|
|
+ /* Restore the ';' now. */
|
|
+ if (semicol)
|
|
+ *semicol = ';';
|
|
+
|
|
if (!p) {
|
|
pr_err("no mtd-id\n");
|
|
return -EINVAL;
|
|
diff --git a/drivers/mtd/nand/omap_elm.c b/drivers/mtd/nand/omap_elm.c
|
|
index 235ec7992b4cf..e46b11847082a 100644
|
|
--- a/drivers/mtd/nand/omap_elm.c
|
|
+++ b/drivers/mtd/nand/omap_elm.c
|
|
@@ -421,6 +421,7 @@ static int elm_probe(struct platform_device *pdev)
|
|
pm_runtime_enable(&pdev->dev);
|
|
if (pm_runtime_get_sync(&pdev->dev) < 0) {
|
|
ret = -EINVAL;
|
|
+ pm_runtime_put_sync(&pdev->dev);
|
|
pm_runtime_disable(&pdev->dev);
|
|
dev_err(&pdev->dev, "can't enable clock\n");
|
|
return ret;
|
|
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c
|
|
index f958188207fd6..e57aca6239f8e 100644
|
|
--- a/drivers/net/ethernet/intel/e1000/e1000_main.c
|
|
+++ b/drivers/net/ethernet/intel/e1000/e1000_main.c
|
|
@@ -568,8 +568,13 @@ void e1000_reinit_locked(struct e1000_adapter *adapter)
|
|
WARN_ON(in_interrupt());
|
|
while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
|
|
msleep(1);
|
|
- e1000_down(adapter);
|
|
- e1000_up(adapter);
|
|
+
|
|
+ /* only run the task if not already down */
|
|
+ if (!test_bit(__E1000_DOWN, &adapter->flags)) {
|
|
+ e1000_down(adapter);
|
|
+ e1000_up(adapter);
|
|
+ }
|
|
+
|
|
clear_bit(__E1000_RESETTING, &adapter->flags);
|
|
}
|
|
|
|
@@ -1456,10 +1461,15 @@ static int e1000_close(struct net_device *netdev)
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
int count = E1000_CHECK_RESET_COUNT;
|
|
|
|
- while (test_bit(__E1000_RESETTING, &adapter->flags) && count--)
|
|
+ while (test_and_set_bit(__E1000_RESETTING, &adapter->flags) && count--)
|
|
usleep_range(10000, 20000);
|
|
|
|
- WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
|
|
+ WARN_ON(count < 0);
|
|
+
|
|
+ /* signal that we're down so that the reset task will no longer run */
|
|
+ set_bit(__E1000_DOWN, &adapter->flags);
|
|
+ clear_bit(__E1000_RESETTING, &adapter->flags);
|
|
+
|
|
e1000_down(adapter);
|
|
e1000_power_down_phy(adapter);
|
|
e1000_free_irq(adapter);
|
|
diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c
|
|
index 4842344a96f1d..a2559f213daed 100644
|
|
--- a/drivers/net/wan/hdlc_ppp.c
|
|
+++ b/drivers/net/wan/hdlc_ppp.c
|
|
@@ -386,11 +386,8 @@ static void ppp_cp_parse_cr(struct net_device *dev, u16 pid, u8 id,
|
|
}
|
|
|
|
for (opt = data; len; len -= opt[1], opt += opt[1]) {
|
|
- if (len < 2 || len < opt[1]) {
|
|
- dev->stats.rx_errors++;
|
|
- kfree(out);
|
|
- return; /* bad packet, drop silently */
|
|
- }
|
|
+ if (len < 2 || opt[1] < 2 || len < opt[1])
|
|
+ goto err_out;
|
|
|
|
if (pid == PID_LCP)
|
|
switch (opt[0]) {
|
|
@@ -398,6 +395,8 @@ static void ppp_cp_parse_cr(struct net_device *dev, u16 pid, u8 id,
|
|
continue; /* MRU always OK and > 1500 bytes? */
|
|
|
|
case LCP_OPTION_ACCM: /* async control character map */
|
|
+ if (opt[1] < sizeof(valid_accm))
|
|
+ goto err_out;
|
|
if (!memcmp(opt, valid_accm,
|
|
sizeof(valid_accm)))
|
|
continue;
|
|
@@ -409,6 +408,8 @@ static void ppp_cp_parse_cr(struct net_device *dev, u16 pid, u8 id,
|
|
}
|
|
break;
|
|
case LCP_OPTION_MAGIC:
|
|
+ if (len < 6)
|
|
+ goto err_out;
|
|
if (opt[1] != 6 || (!opt[2] && !opt[3] &&
|
|
!opt[4] && !opt[5]))
|
|
break; /* reject invalid magic number */
|
|
@@ -427,6 +428,11 @@ static void ppp_cp_parse_cr(struct net_device *dev, u16 pid, u8 id,
|
|
ppp_cp_event(dev, pid, RCR_GOOD, CP_CONF_ACK, id, req_len, data);
|
|
|
|
kfree(out);
|
|
+ return;
|
|
+
|
|
+err_out:
|
|
+ dev->stats.rx_errors++;
|
|
+ kfree(out);
|
|
}
|
|
|
|
static int ppp_rx(struct sk_buff *skb)
|
|
diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c
|
|
index 5bf22057459e6..bc6330b437958 100644
|
|
--- a/drivers/net/wireless/ath/ar5523/ar5523.c
|
|
+++ b/drivers/net/wireless/ath/ar5523/ar5523.c
|
|
@@ -1774,6 +1774,8 @@ static struct usb_device_id ar5523_id_table[] = {
|
|
AR5523_DEVICE_UX(0x0846, 0x4300), /* Netgear / WG111U */
|
|
AR5523_DEVICE_UG(0x0846, 0x4250), /* Netgear / WG111T */
|
|
AR5523_DEVICE_UG(0x0846, 0x5f00), /* Netgear / WPN111 */
|
|
+ AR5523_DEVICE_UG(0x083a, 0x4506), /* SMC / EZ Connect
|
|
+ SMCWUSBT-G2 */
|
|
AR5523_DEVICE_UG(0x157e, 0x3006), /* Umedia / AR5523_1 */
|
|
AR5523_DEVICE_UX(0x157e, 0x3205), /* Umedia / AR5523_2 */
|
|
AR5523_DEVICE_UG(0x157e, 0x3006), /* Umedia / TEW444UBEU */
|
|
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h
|
|
index 9a5eb9ed89215..233af2292366d 100644
|
|
--- a/drivers/net/wireless/mwifiex/fw.h
|
|
+++ b/drivers/net/wireless/mwifiex/fw.h
|
|
@@ -848,7 +848,7 @@ struct mwifiex_tkip_param {
|
|
struct mwifiex_aes_param {
|
|
u8 pn[WPA_PN_SIZE];
|
|
__le16 key_len;
|
|
- u8 key[WLAN_KEY_LEN_CCMP];
|
|
+ u8 key[WLAN_KEY_LEN_CCMP_256];
|
|
} __packed;
|
|
|
|
struct mwifiex_wapi_param {
|
|
diff --git a/drivers/net/wireless/mwifiex/sta_cmdresp.c b/drivers/net/wireless/mwifiex/sta_cmdresp.c
|
|
index 9e3853c8a22da..32b0b06b74f1d 100644
|
|
--- a/drivers/net/wireless/mwifiex/sta_cmdresp.c
|
|
+++ b/drivers/net/wireless/mwifiex/sta_cmdresp.c
|
|
@@ -631,7 +631,7 @@ static int mwifiex_ret_802_11_key_material_v2(struct mwifiex_private *priv,
|
|
key_v2 = &resp->params.key_material_v2;
|
|
|
|
len = le16_to_cpu(key_v2->key_param_set.key_params.aes.key_len);
|
|
- if (len > WLAN_KEY_LEN_CCMP)
|
|
+ if (len > sizeof(key_v2->key_param_set.key_params.aes.key))
|
|
return -EINVAL;
|
|
|
|
if (le16_to_cpu(key_v2->action) == HostCmd_ACT_GEN_SET) {
|
|
@@ -647,7 +647,7 @@ static int mwifiex_ret_802_11_key_material_v2(struct mwifiex_private *priv,
|
|
return 0;
|
|
|
|
memset(priv->aes_key_v2.key_param_set.key_params.aes.key, 0,
|
|
- WLAN_KEY_LEN_CCMP);
|
|
+ sizeof(key_v2->key_param_set.key_params.aes.key));
|
|
priv->aes_key_v2.key_param_set.key_params.aes.key_len =
|
|
cpu_to_le16(len);
|
|
memcpy(priv->aes_key_v2.key_param_set.key_params.aes.key,
|
|
diff --git a/drivers/phy/phy-s5pv210-usb2.c b/drivers/phy/phy-s5pv210-usb2.c
|
|
index 004d320767e4d..bb36cfd4e3e90 100644
|
|
--- a/drivers/phy/phy-s5pv210-usb2.c
|
|
+++ b/drivers/phy/phy-s5pv210-usb2.c
|
|
@@ -142,6 +142,10 @@ static void s5pv210_phy_pwr(struct samsung_usb2_phy_instance *inst, bool on)
|
|
udelay(10);
|
|
rst &= ~rstbits;
|
|
writel(rst, drv->reg_phy + S5PV210_UPHYRST);
|
|
+ /* The following delay is necessary for the reset sequence to be
|
|
+ * completed
|
|
+ */
|
|
+ udelay(80);
|
|
} else {
|
|
pwr = readl(drv->reg_phy + S5PV210_UPHYPWR);
|
|
pwr |= phypwr;
|
|
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
|
|
index de33801ca31ea..0614d05a990a6 100644
|
|
--- a/drivers/scsi/aacraid/aachba.c
|
|
+++ b/drivers/scsi/aacraid/aachba.c
|
|
@@ -1938,13 +1938,13 @@ static int aac_read(struct scsi_cmnd * scsicmd)
|
|
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
|
|
SAM_STAT_CHECK_CONDITION;
|
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
|
- HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
|
|
+ ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
|
|
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
|
|
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
|
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
|
SCSI_SENSE_BUFFERSIZE));
|
|
scsicmd->scsi_done(scsicmd);
|
|
- return 1;
|
|
+ return 0;
|
|
}
|
|
|
|
dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %llu, t = %ld.\n",
|
|
@@ -2035,13 +2035,13 @@ static int aac_write(struct scsi_cmnd * scsicmd)
|
|
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
|
|
SAM_STAT_CHECK_CONDITION;
|
|
set_sense(&dev->fsa_dev[cid].sense_data,
|
|
- HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
|
|
+ ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
|
|
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
|
|
memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
|
|
min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
|
|
SCSI_SENSE_BUFFERSIZE));
|
|
scsicmd->scsi_done(scsicmd);
|
|
- return 1;
|
|
+ return 0;
|
|
}
|
|
|
|
dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n",
|
|
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
|
|
index 7a94c2d352390..97c0d79a2601f 100644
|
|
--- a/drivers/scsi/lpfc/lpfc_sli.c
|
|
+++ b/drivers/scsi/lpfc/lpfc_sli.c
|
|
@@ -15445,6 +15445,10 @@ lpfc_prep_seq(struct lpfc_vport *vport, struct hbq_dmabuf *seq_dmabuf)
|
|
list_add_tail(&iocbq->list, &first_iocbq->list);
|
|
}
|
|
}
|
|
+ /* Free the sequence's header buffer */
|
|
+ if (!first_iocbq)
|
|
+ lpfc_in_buf_free(vport->phba, &seq_dmabuf->dbuf);
|
|
+
|
|
return first_iocbq;
|
|
}
|
|
|
|
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
|
|
index e9ea9005a984e..f24fa99da69f5 100644
|
|
--- a/drivers/tty/serial/8250/8250_core.c
|
|
+++ b/drivers/tty/serial/8250/8250_core.c
|
|
@@ -1037,8 +1037,10 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
|
|
|
|
ret = uart_add_one_port(&serial8250_reg,
|
|
&uart->port);
|
|
- if (ret == 0)
|
|
- ret = uart->port.line;
|
|
+ if (ret)
|
|
+ goto err;
|
|
+
|
|
+ ret = uart->port.line;
|
|
} else {
|
|
dev_info(uart->port.dev,
|
|
"skipping CIR port at 0x%lx / 0x%llx, IRQ %d\n",
|
|
@@ -1052,6 +1054,11 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
|
|
mutex_unlock(&serial_mutex);
|
|
|
|
return ret;
|
|
+
|
|
+err:
|
|
+ uart->port.dev = NULL;
|
|
+ mutex_unlock(&serial_mutex);
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL(serial8250_register_8250_port);
|
|
|
|
diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
|
|
index c4383573cf668..0377b35d62b80 100644
|
|
--- a/drivers/tty/serial/8250/8250_omap.c
|
|
+++ b/drivers/tty/serial/8250/8250_omap.c
|
|
@@ -1188,11 +1188,11 @@ static int omap8250_probe(struct platform_device *pdev)
|
|
spin_lock_init(&priv->rx_dma_lock);
|
|
|
|
device_init_wakeup(&pdev->dev, true);
|
|
+ pm_runtime_enable(&pdev->dev);
|
|
pm_runtime_use_autosuspend(&pdev->dev);
|
|
pm_runtime_set_autosuspend_delay(&pdev->dev, -1);
|
|
|
|
pm_runtime_irq_safe(&pdev->dev);
|
|
- pm_runtime_enable(&pdev->dev);
|
|
|
|
pm_runtime_get_sync(&pdev->dev);
|
|
|
|
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
|
|
index 70a51d0bc6044..42aa37515e9bd 100644
|
|
--- a/drivers/tty/serial/samsung.c
|
|
+++ b/drivers/tty/serial/samsung.c
|
|
@@ -1151,14 +1151,14 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
|
|
struct s3c24xx_uart_info *info = ourport->info;
|
|
struct clk *clk;
|
|
unsigned long rate;
|
|
- unsigned int cnt, baud, quot, clk_sel, best_quot = 0;
|
|
+ unsigned int cnt, baud, quot, best_quot = 0;
|
|
char clkname[MAX_CLK_NAME_LENGTH];
|
|
int calc_deviation, deviation = (1 << 30) - 1;
|
|
|
|
- clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel :
|
|
- ourport->info->def_clk_sel;
|
|
for (cnt = 0; cnt < info->num_clks; cnt++) {
|
|
- if (!(clk_sel & (1 << cnt)))
|
|
+ /* Keep selected clock if provided */
|
|
+ if (ourport->cfg->clk_sel &&
|
|
+ !(ourport->cfg->clk_sel & (1 << cnt)))
|
|
continue;
|
|
|
|
sprintf(clkname, "clk_uart_baud%d", cnt);
|
|
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
|
|
index 0e4f54832fc79..01aeffcdf9849 100644
|
|
--- a/drivers/tty/vt/vt.c
|
|
+++ b/drivers/tty/vt/vt.c
|
|
@@ -2484,7 +2484,7 @@ static void console_callback(struct work_struct *ignored)
|
|
if (scrollback_delta) {
|
|
struct vc_data *vc = vc_cons[fg_console].d;
|
|
clear_selection();
|
|
- if (vc->vc_mode == KD_TEXT)
|
|
+ if (vc->vc_mode == KD_TEXT && vc->vc_sw->con_scrolldelta)
|
|
vc->vc_sw->con_scrolldelta(vc, scrollback_delta);
|
|
scrollback_delta = 0;
|
|
}
|
|
diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c
|
|
index 849806a75f1ce..b29610899c9f6 100644
|
|
--- a/drivers/usb/host/ehci-mv.c
|
|
+++ b/drivers/usb/host/ehci-mv.c
|
|
@@ -196,12 +196,10 @@ static int mv_ehci_probe(struct platform_device *pdev)
|
|
hcd->rsrc_len = resource_size(r);
|
|
hcd->regs = ehci_mv->op_regs;
|
|
|
|
- hcd->irq = platform_get_irq(pdev, 0);
|
|
- if (!hcd->irq) {
|
|
- dev_err(&pdev->dev, "Cannot get irq.");
|
|
- retval = -ENODEV;
|
|
+ retval = platform_get_irq(pdev, 0);
|
|
+ if (retval < 0)
|
|
goto err_disable_clk;
|
|
- }
|
|
+ hcd->irq = retval;
|
|
|
|
ehci = hcd_to_ehci(hcd);
|
|
ehci->caps = (struct ehci_caps *) ehci_mv->cap_regs;
|
|
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
|
|
index 7a82735d53087..8276ef7f3e834 100644
|
|
--- a/drivers/vfio/pci/vfio_pci.c
|
|
+++ b/drivers/vfio/pci/vfio_pci.c
|
|
@@ -255,6 +255,19 @@ static void vfio_pci_release(void *device_data)
|
|
if (!(--vdev->refcnt)) {
|
|
vfio_spapr_pci_eeh_release(vdev->pdev);
|
|
vfio_pci_disable(vdev);
|
|
+ mutex_lock(&vdev->igate);
|
|
+ if (vdev->err_trigger) {
|
|
+ eventfd_ctx_put(vdev->err_trigger);
|
|
+ vdev->err_trigger = NULL;
|
|
+ }
|
|
+ mutex_unlock(&vdev->igate);
|
|
+
|
|
+ mutex_lock(&vdev->igate);
|
|
+ if (vdev->req_trigger) {
|
|
+ eventfd_ctx_put(vdev->req_trigger);
|
|
+ vdev->req_trigger = NULL;
|
|
+ }
|
|
+ mutex_unlock(&vdev->igate);
|
|
}
|
|
|
|
mutex_unlock(&driver_lock);
|
|
diff --git a/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c b/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c
|
|
index 8b6f6d5fdd68b..43186fa8a13c9 100644
|
|
--- a/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c
|
|
+++ b/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c
|
|
@@ -194,7 +194,7 @@ static int __init omapdss_boot_init(void)
|
|
dss = of_find_matching_node(NULL, omapdss_of_match);
|
|
|
|
if (dss == NULL || !of_device_is_available(dss))
|
|
- return 0;
|
|
+ goto put_node;
|
|
|
|
omapdss_walk_device(dss, true);
|
|
|
|
@@ -221,6 +221,8 @@ static int __init omapdss_boot_init(void)
|
|
kfree(n);
|
|
}
|
|
|
|
+put_node:
|
|
+ of_node_put(dss);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/fs/block_dev.c b/fs/block_dev.c
|
|
index b2ebfd96785b7..a71d442ef7d0e 100644
|
|
--- a/fs/block_dev.c
|
|
+++ b/fs/block_dev.c
|
|
@@ -1515,6 +1515,16 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
|
|
struct gendisk *disk = bdev->bd_disk;
|
|
struct block_device *victim = NULL;
|
|
|
|
+ /*
|
|
+ * Sync early if it looks like we're the last one. If someone else
|
|
+ * opens the block device between now and the decrement of bd_openers
|
|
+ * then we did a sync that we didn't need to, but that's not the end
|
|
+ * of the world and we want to avoid long (could be several minute)
|
|
+ * syncs while holding the mutex.
|
|
+ */
|
|
+ if (bdev->bd_openers == 1)
|
|
+ sync_blockdev(bdev);
|
|
+
|
|
mutex_lock_nested(&bdev->bd_mutex, for_part);
|
|
if (for_part)
|
|
bdev->bd_part_count--;
|
|
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
|
|
index 3d0497421e62b..49e693232916f 100644
|
|
--- a/fs/ceph/caps.c
|
|
+++ b/fs/ceph/caps.c
|
|
@@ -1777,12 +1777,24 @@ ack:
|
|
if (mutex_trylock(&session->s_mutex) == 0) {
|
|
dout("inverting session/ino locks on %p\n",
|
|
session);
|
|
+ session = ceph_get_mds_session(session);
|
|
spin_unlock(&ci->i_ceph_lock);
|
|
if (took_snap_rwsem) {
|
|
up_read(&mdsc->snap_rwsem);
|
|
took_snap_rwsem = 0;
|
|
}
|
|
- mutex_lock(&session->s_mutex);
|
|
+ if (session) {
|
|
+ mutex_lock(&session->s_mutex);
|
|
+ ceph_put_mds_session(session);
|
|
+ } else {
|
|
+ /*
|
|
+ * Because we take the reference while
|
|
+ * holding the i_ceph_lock, it should
|
|
+ * never be NULL. Throw a warning if it
|
|
+ * ever is.
|
|
+ */
|
|
+ WARN_ON_ONCE(true);
|
|
+ }
|
|
goto retry;
|
|
}
|
|
}
|
|
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
|
|
index 8142f6bf3d310..fc265f4b839ae 100644
|
|
--- a/fs/fuse/dev.c
|
|
+++ b/fs/fuse/dev.c
|
|
@@ -850,7 +850,6 @@ static int fuse_check_page(struct page *page)
|
|
{
|
|
if (page_mapcount(page) ||
|
|
page->mapping != NULL ||
|
|
- page_count(page) != 1 ||
|
|
(page->flags & PAGE_FLAGS_CHECK_AT_PREP &
|
|
~(1 << PG_locked |
|
|
1 << PG_referenced |
|
|
diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c
|
|
index 97be412153328..9213a9e046ae0 100644
|
|
--- a/fs/ubifs/io.c
|
|
+++ b/fs/ubifs/io.c
|
|
@@ -237,7 +237,7 @@ int ubifs_is_mapped(const struct ubifs_info *c, int lnum)
|
|
int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
|
|
int offs, int quiet, int must_chk_crc)
|
|
{
|
|
- int err = -EINVAL, type, node_len;
|
|
+ int err = -EINVAL, type, node_len, dump_node = 1;
|
|
uint32_t crc, node_crc, magic;
|
|
const struct ubifs_ch *ch = buf;
|
|
|
|
@@ -290,10 +290,22 @@ int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
|
|
out_len:
|
|
if (!quiet)
|
|
ubifs_err(c, "bad node length %d", node_len);
|
|
+ if (type == UBIFS_DATA_NODE && node_len > UBIFS_DATA_NODE_SZ)
|
|
+ dump_node = 0;
|
|
out:
|
|
if (!quiet) {
|
|
ubifs_err(c, "bad node at LEB %d:%d", lnum, offs);
|
|
- ubifs_dump_node(c, buf);
|
|
+ if (dump_node) {
|
|
+ ubifs_dump_node(c, buf);
|
|
+ } else {
|
|
+ int safe_len = min3(node_len, c->leb_size - offs,
|
|
+ (int)UBIFS_MAX_DATA_NODE_SZ);
|
|
+ pr_err("\tprevent out-of-bounds memory access\n");
|
|
+ pr_err("\ttruncated data node length %d\n", safe_len);
|
|
+ pr_err("\tcorrupted data node:\n");
|
|
+ print_hex_dump(KERN_ERR, "\t", DUMP_PREFIX_OFFSET, 32, 1,
|
|
+ buf, safe_len, 0);
|
|
+ }
|
|
dump_stack();
|
|
}
|
|
return err;
|
|
diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c
|
|
index da8747b870df3..4539ff4d351f9 100644
|
|
--- a/fs/xfs/libxfs/xfs_attr_leaf.c
|
|
+++ b/fs/xfs/libxfs/xfs_attr_leaf.c
|
|
@@ -1326,7 +1326,9 @@ xfs_attr3_leaf_add_work(
|
|
for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) {
|
|
if (ichdr->freemap[i].base == tmp) {
|
|
ichdr->freemap[i].base += sizeof(xfs_attr_leaf_entry_t);
|
|
- ichdr->freemap[i].size -= sizeof(xfs_attr_leaf_entry_t);
|
|
+ ichdr->freemap[i].size -=
|
|
+ min_t(uint16_t, ichdr->freemap[i].size,
|
|
+ sizeof(xfs_attr_leaf_entry_t));
|
|
}
|
|
}
|
|
ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index);
|
|
diff --git a/include/linux/libata.h b/include/linux/libata.h
|
|
index af561d33221d6..ec49344f7555d 100644
|
|
--- a/include/linux/libata.h
|
|
+++ b/include/linux/libata.h
|
|
@@ -500,6 +500,7 @@ enum hsm_task_states {
|
|
};
|
|
|
|
enum ata_completion_errors {
|
|
+ AC_ERR_OK = 0, /* no error */
|
|
AC_ERR_DEV = (1 << 0), /* device reported error */
|
|
AC_ERR_HSM = (1 << 1), /* host state machine violation */
|
|
AC_ERR_TIMEOUT = (1 << 2), /* timeout */
|
|
@@ -896,9 +897,9 @@ struct ata_port_operations {
|
|
/*
|
|
* Command execution
|
|
*/
|
|
- int (*qc_defer)(struct ata_queued_cmd *qc);
|
|
- int (*check_atapi_dma)(struct ata_queued_cmd *qc);
|
|
- void (*qc_prep)(struct ata_queued_cmd *qc);
|
|
+ int (*qc_defer)(struct ata_queued_cmd *qc);
|
|
+ int (*check_atapi_dma)(struct ata_queued_cmd *qc);
|
|
+ enum ata_completion_errors (*qc_prep)(struct ata_queued_cmd *qc);
|
|
unsigned int (*qc_issue)(struct ata_queued_cmd *qc);
|
|
bool (*qc_fill_rtf)(struct ata_queued_cmd *qc);
|
|
|
|
@@ -1190,7 +1191,7 @@ extern int ata_xfer_mode2shift(unsigned long xfer_mode);
|
|
extern const char *ata_mode_string(unsigned long xfer_mask);
|
|
extern unsigned long ata_id_xfermask(const u16 *id);
|
|
extern int ata_std_qc_defer(struct ata_queued_cmd *qc);
|
|
-extern void ata_noop_qc_prep(struct ata_queued_cmd *qc);
|
|
+extern enum ata_completion_errors ata_noop_qc_prep(struct ata_queued_cmd *qc);
|
|
extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
|
|
unsigned int n_elem);
|
|
extern unsigned int ata_dev_classify(const struct ata_taskfile *tf);
|
|
@@ -1881,9 +1882,9 @@ extern const struct ata_port_operations ata_bmdma_port_ops;
|
|
.sg_tablesize = LIBATA_MAX_PRD, \
|
|
.dma_boundary = ATA_DMA_BOUNDARY
|
|
|
|
-extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc);
|
|
+extern enum ata_completion_errors ata_bmdma_qc_prep(struct ata_queued_cmd *qc);
|
|
extern unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc);
|
|
-extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc);
|
|
+extern enum ata_completion_errors ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc);
|
|
extern unsigned int ata_bmdma_port_intr(struct ata_port *ap,
|
|
struct ata_queued_cmd *qc);
|
|
extern irqreturn_t ata_bmdma_interrupt(int irq, void *dev_instance);
|
|
diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h
|
|
index 676d3d2a1a0a9..d8bae7cb86f39 100644
|
|
--- a/include/linux/mtd/map.h
|
|
+++ b/include/linux/mtd/map.h
|
|
@@ -307,7 +307,7 @@ void map_destroy(struct mtd_info *mtd);
|
|
({ \
|
|
int i, ret = 1; \
|
|
for (i = 0; i < map_words(map); i++) { \
|
|
- if (((val1).x[i] & (val2).x[i]) != (val2).x[i]) { \
|
|
+ if (((val1).x[i] & (val2).x[i]) != (val3).x[i]) { \
|
|
ret = 0; \
|
|
break; \
|
|
} \
|
|
diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h
|
|
index e0582106ef4fa..a10f363784178 100644
|
|
--- a/include/linux/seqlock.h
|
|
+++ b/include/linux/seqlock.h
|
|
@@ -242,6 +242,13 @@ static inline void raw_write_seqcount_end(seqcount_t *s)
|
|
* usual consistency guarantee. It is one wmb cheaper, because we can
|
|
* collapse the two back-to-back wmb()s.
|
|
*
|
|
+ * Note that, writes surrounding the barrier should be declared atomic (e.g.
|
|
+ * via WRITE_ONCE): a) to ensure the writes become visible to other threads
|
|
+ * atomically, avoiding compiler optimizations; b) to document which writes are
|
|
+ * meant to propagate to the reader critical section. This is necessary because
|
|
+ * neither writes before and after the barrier are enclosed in a seq-writer
|
|
+ * critical section that would ensure readers are aware of ongoing writes.
|
|
+ *
|
|
* seqcount_t seq;
|
|
* bool X = true, Y = false;
|
|
*
|
|
@@ -261,11 +268,11 @@ static inline void raw_write_seqcount_end(seqcount_t *s)
|
|
*
|
|
* void write(void)
|
|
* {
|
|
- * Y = true;
|
|
+ * WRITE_ONCE(Y, true);
|
|
*
|
|
* raw_write_seqcount_barrier(seq);
|
|
*
|
|
- * X = false;
|
|
+ * WRITE_ONCE(X, false);
|
|
* }
|
|
*/
|
|
static inline void raw_write_seqcount_barrier(seqcount_t *s)
|
|
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
|
|
index 735ff1525f485..95feb153fe9a8 100644
|
|
--- a/include/linux/skbuff.h
|
|
+++ b/include/linux/skbuff.h
|
|
@@ -1438,6 +1438,18 @@ static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
|
|
return list_->qlen;
|
|
}
|
|
|
|
+/**
|
|
+ * skb_queue_len_lockless - get queue length
|
|
+ * @list_: list to measure
|
|
+ *
|
|
+ * Return the length of an &sk_buff queue.
|
|
+ * This variant can be used in lockless contexts.
|
|
+ */
|
|
+static inline __u32 skb_queue_len_lockless(const struct sk_buff_head *list_)
|
|
+{
|
|
+ return READ_ONCE(list_->qlen);
|
|
+}
|
|
+
|
|
/**
|
|
* __skb_queue_head_init - initialize non-spinlock portions of sk_buff_head
|
|
* @list: queue to initialize
|
|
@@ -1641,7 +1653,7 @@ static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)
|
|
{
|
|
struct sk_buff *next, *prev;
|
|
|
|
- list->qlen--;
|
|
+ WRITE_ONCE(list->qlen, list->qlen - 1);
|
|
next = skb->next;
|
|
prev = skb->prev;
|
|
skb->next = skb->prev = NULL;
|
|
@@ -2651,7 +2663,7 @@ static inline int skb_padto(struct sk_buff *skb, unsigned int len)
|
|
* is untouched. Otherwise it is extended. Returns zero on
|
|
* success. The skb is freed on error.
|
|
*/
|
|
-static inline int skb_put_padto(struct sk_buff *skb, unsigned int len)
|
|
+static inline int __must_check skb_put_padto(struct sk_buff *skb, unsigned int len)
|
|
{
|
|
unsigned int size = skb->len;
|
|
|
|
diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c
|
|
index f45a9a5d3e47a..af453f3c2b3dd 100644
|
|
--- a/kernel/audit_watch.c
|
|
+++ b/kernel/audit_watch.c
|
|
@@ -316,8 +316,6 @@ static void audit_update_watch(struct audit_parent *parent,
|
|
if (oentry->rule.exe)
|
|
audit_remove_mark(oentry->rule.exe);
|
|
|
|
- audit_watch_log_rule_change(r, owatch, "updated_rules");
|
|
-
|
|
call_rcu(&oentry->rcu, audit_free_rule_rcu);
|
|
}
|
|
|
|
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
|
|
index 9241a29a1f9de..33c37dbc56a05 100644
|
|
--- a/kernel/kprobes.c
|
|
+++ b/kernel/kprobes.c
|
|
@@ -2012,6 +2012,9 @@ static void kill_kprobe(struct kprobe *p)
|
|
{
|
|
struct kprobe *kp;
|
|
|
|
+ if (WARN_ON_ONCE(kprobe_gone(p)))
|
|
+ return;
|
|
+
|
|
p->flags |= KPROBE_FLAG_GONE;
|
|
if (kprobe_aggrprobe(p)) {
|
|
/*
|
|
@@ -2032,9 +2035,10 @@ static void kill_kprobe(struct kprobe *p)
|
|
|
|
/*
|
|
* The module is going away. We should disarm the kprobe which
|
|
- * is using ftrace.
|
|
+ * is using ftrace, because ftrace framework is still available at
|
|
+ * MODULE_STATE_GOING notification.
|
|
*/
|
|
- if (kprobe_ftrace(p))
|
|
+ if (kprobe_ftrace(p) && !kprobe_disabled(p) && !kprobes_all_disarmed)
|
|
disarm_kprobe_ftrace(p);
|
|
}
|
|
|
|
@@ -2154,7 +2158,10 @@ static int kprobes_module_callback(struct notifier_block *nb,
|
|
mutex_lock(&kprobe_mutex);
|
|
for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
|
|
head = &kprobe_table[i];
|
|
- hlist_for_each_entry_rcu(p, head, hlist)
|
|
+ hlist_for_each_entry_rcu(p, head, hlist) {
|
|
+ if (kprobe_gone(p))
|
|
+ continue;
|
|
+
|
|
if (within_module_init((unsigned long)p->addr, mod) ||
|
|
(checkcore &&
|
|
within_module_core((unsigned long)p->addr, mod))) {
|
|
@@ -2165,6 +2172,7 @@ static int kprobes_module_callback(struct notifier_block *nb,
|
|
*/
|
|
kill_kprobe(p);
|
|
}
|
|
+ }
|
|
}
|
|
mutex_unlock(&kprobe_mutex);
|
|
return NOTIFY_DONE;
|
|
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
|
|
index e53a976ca28ea..b55dfb3e801f9 100644
|
|
--- a/kernel/printk/printk.c
|
|
+++ b/kernel/printk/printk.c
|
|
@@ -2032,6 +2032,9 @@ static int __init console_setup(char *str)
|
|
char *s, *options, *brl_options = NULL;
|
|
int idx;
|
|
|
|
+ if (str[0] == 0)
|
|
+ return 1;
|
|
+
|
|
if (_braille_console_setup(&str, &brl_options))
|
|
return 1;
|
|
|
|
diff --git a/kernel/sys.c b/kernel/sys.c
|
|
index 1855f1bf113e4..e98664039cb23 100644
|
|
--- a/kernel/sys.c
|
|
+++ b/kernel/sys.c
|
|
@@ -1183,11 +1183,13 @@ SYSCALL_DEFINE1(uname, struct old_utsname __user *, name)
|
|
|
|
SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)
|
|
{
|
|
- struct oldold_utsname tmp = {};
|
|
+ struct oldold_utsname tmp;
|
|
|
|
if (!name)
|
|
return -EFAULT;
|
|
|
|
+ memset(&tmp, 0, sizeof(tmp));
|
|
+
|
|
down_read(&uts_sem);
|
|
memcpy(&tmp.sysname, &utsname()->sysname, __OLD_UTS_LEN);
|
|
memcpy(&tmp.nodename, &utsname()->nodename, __OLD_UTS_LEN);
|
|
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
|
|
index e4c6f89b6b11f..89ed01911a9a2 100644
|
|
--- a/kernel/trace/ftrace.c
|
|
+++ b/kernel/trace/ftrace.c
|
|
@@ -2823,8 +2823,11 @@ static int referenced_filters(struct dyn_ftrace *rec)
|
|
int cnt = 0;
|
|
|
|
for (ops = ftrace_ops_list; ops != &ftrace_list_end; ops = ops->next) {
|
|
- if (ops_references_rec(ops, rec))
|
|
- cnt++;
|
|
+ if (ops_references_rec(ops, rec)) {
|
|
+ cnt++;
|
|
+ if (ops->flags & FTRACE_OPS_FL_SAVE_REGS)
|
|
+ rec->flags |= FTRACE_FL_REGS;
|
|
+ }
|
|
}
|
|
|
|
return cnt;
|
|
@@ -2874,7 +2877,7 @@ static int ftrace_update_code(struct module *mod, struct ftrace_page *new_pgs)
|
|
p = &pg->records[i];
|
|
if (test)
|
|
cnt += referenced_filters(p);
|
|
- p->flags = cnt;
|
|
+ p->flags += cnt;
|
|
|
|
/*
|
|
* Do the initial record conversion from mcount jump
|
|
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
|
|
index 06efd18bf3e38..e4a0c0308b507 100644
|
|
--- a/kernel/trace/trace.c
|
|
+++ b/kernel/trace/trace.c
|
|
@@ -2271,6 +2271,9 @@ int trace_array_printk(struct trace_array *tr,
|
|
if (!(global_trace.trace_flags & TRACE_ITER_PRINTK))
|
|
return 0;
|
|
|
|
+ if (!tr)
|
|
+ return -ENOENT;
|
|
+
|
|
va_start(ap, fmt);
|
|
ret = trace_array_vprintk(tr, ip, fmt, ap);
|
|
va_end(ap);
|
|
@@ -7260,7 +7263,7 @@ __init static int tracer_alloc_buffers(void)
|
|
goto out_free_buffer_mask;
|
|
|
|
/* Only allocate trace_printk buffers if a trace_printk exists */
|
|
- if (__stop___trace_bprintk_fmt != __start___trace_bprintk_fmt)
|
|
+ if (&__stop___trace_bprintk_fmt != &__start___trace_bprintk_fmt)
|
|
/* Must be called before global_trace.buffer is allocated */
|
|
trace_printk_init_buffers();
|
|
|
|
diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h
|
|
index ee7b94a4810af..246db27dbdc99 100644
|
|
--- a/kernel/trace/trace_entries.h
|
|
+++ b/kernel/trace/trace_entries.h
|
|
@@ -178,7 +178,7 @@ FTRACE_ENTRY(kernel_stack, stack_entry,
|
|
|
|
F_STRUCT(
|
|
__field( int, size )
|
|
- __dynamic_array(unsigned long, caller )
|
|
+ __array( unsigned long, caller, FTRACE_STACK_ENTRIES )
|
|
),
|
|
|
|
F_printk("\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n"
|
|
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
|
|
index bd4c0bb61ad72..9d6e755d17546 100644
|
|
--- a/kernel/trace/trace_events.c
|
|
+++ b/kernel/trace/trace_events.c
|
|
@@ -755,6 +755,8 @@ static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set)
|
|
char *event = NULL, *sub = NULL, *match;
|
|
int ret;
|
|
|
|
+ if (!tr)
|
|
+ return -ENOENT;
|
|
/*
|
|
* The buf format can be <subsystem>:<event-name>
|
|
* *:<event-name> means any event by that name.
|
|
diff --git a/lib/string.c b/lib/string.c
|
|
index c7cf65ac42ad7..c9983dc01e727 100644
|
|
--- a/lib/string.c
|
|
+++ b/lib/string.c
|
|
@@ -235,6 +235,30 @@ ssize_t strscpy(char *dest, const char *src, size_t count)
|
|
EXPORT_SYMBOL(strscpy);
|
|
#endif
|
|
|
|
+/**
|
|
+ * stpcpy - copy a string from src to dest returning a pointer to the new end
|
|
+ * of dest, including src's %NUL-terminator. May overrun dest.
|
|
+ * @dest: pointer to end of string being copied into. Must be large enough
|
|
+ * to receive copy.
|
|
+ * @src: pointer to the beginning of string being copied from. Must not overlap
|
|
+ * dest.
|
|
+ *
|
|
+ * stpcpy differs from strcpy in a key way: the return value is a pointer
|
|
+ * to the new %NUL-terminating character in @dest. (For strcpy, the return
|
|
+ * value is a pointer to the start of @dest). This interface is considered
|
|
+ * unsafe as it doesn't perform bounds checking of the inputs. As such it's
|
|
+ * not recommended for usage. Instead, its definition is provided in case
|
|
+ * the compiler lowers other libcalls to stpcpy.
|
|
+ */
|
|
+char *stpcpy(char *__restrict__ dest, const char *__restrict__ src);
|
|
+char *stpcpy(char *__restrict__ dest, const char *__restrict__ src)
|
|
+{
|
|
+ while ((*dest++ = *src++) != '\0')
|
|
+ /* nothing */;
|
|
+ return --dest;
|
|
+}
|
|
+EXPORT_SYMBOL(stpcpy);
|
|
+
|
|
#ifndef __HAVE_ARCH_STRCAT
|
|
/**
|
|
* strcat - Append one %NUL-terminated string to another
|
|
diff --git a/mm/filemap.c b/mm/filemap.c
|
|
index f217120973ebe..3d0a0e409cbf5 100644
|
|
--- a/mm/filemap.c
|
|
+++ b/mm/filemap.c
|
|
@@ -2313,6 +2313,14 @@ filler:
|
|
unlock_page(page);
|
|
goto out;
|
|
}
|
|
+
|
|
+ /*
|
|
+ * A previous I/O error may have been due to temporary
|
|
+ * failures.
|
|
+ * Clear page error before actual read, PG_error will be
|
|
+ * set again if read page fails.
|
|
+ */
|
|
+ ClearPageError(page);
|
|
goto filler;
|
|
|
|
out:
|
|
diff --git a/mm/mmap.c b/mm/mmap.c
|
|
index 135cccce41f88..d48a654cbd237 100644
|
|
--- a/mm/mmap.c
|
|
+++ b/mm/mmap.c
|
|
@@ -1993,6 +1993,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|
info.low_limit = mm->mmap_base;
|
|
info.high_limit = TASK_SIZE;
|
|
info.align_mask = 0;
|
|
+ info.align_offset = 0;
|
|
return vm_unmapped_area(&info);
|
|
}
|
|
#endif
|
|
@@ -2034,6 +2035,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
|
info.low_limit = max(PAGE_SIZE, mmap_min_addr);
|
|
info.high_limit = mm->mmap_base;
|
|
info.align_mask = 0;
|
|
+ info.align_offset = 0;
|
|
addr = vm_unmapped_area(&info);
|
|
|
|
/*
|
|
diff --git a/mm/pagewalk.c b/mm/pagewalk.c
|
|
index c2cbd26201696..a024667a9c041 100644
|
|
--- a/mm/pagewalk.c
|
|
+++ b/mm/pagewalk.c
|
|
@@ -14,9 +14,9 @@ static int walk_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
|
|
err = walk->pte_entry(pte, addr, addr + PAGE_SIZE, walk);
|
|
if (err)
|
|
break;
|
|
- addr += PAGE_SIZE;
|
|
- if (addr == end)
|
|
+ if (addr >= end - PAGE_SIZE)
|
|
break;
|
|
+ addr += PAGE_SIZE;
|
|
pte++;
|
|
}
|
|
|
|
diff --git a/net/atm/lec.c b/net/atm/lec.c
|
|
index e4afac94ff158..a38680e194436 100644
|
|
--- a/net/atm/lec.c
|
|
+++ b/net/atm/lec.c
|
|
@@ -1290,6 +1290,12 @@ static void lec_arp_clear_vccs(struct lec_arp_table *entry)
|
|
entry->vcc = NULL;
|
|
}
|
|
if (entry->recv_vcc) {
|
|
+ struct atm_vcc *vcc = entry->recv_vcc;
|
|
+ struct lec_vcc_priv *vpriv = LEC_VCC_PRIV(vcc);
|
|
+
|
|
+ kfree(vpriv);
|
|
+ vcc->user_back = NULL;
|
|
+
|
|
entry->recv_vcc->push = entry->old_recv_push;
|
|
vcc_release_async(entry->recv_vcc, -EPIPE);
|
|
entry->recv_vcc = NULL;
|
|
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
|
index 9aa5daa551273..1267cbb1a329a 100644
|
|
--- a/net/batman-adv/bridge_loop_avoidance.c
|
|
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
|
@@ -73,11 +73,12 @@ static inline u32 batadv_choose_claim(const void *data, u32 size)
|
|
/* return the index of the backbone gateway */
|
|
static inline u32 batadv_choose_backbone_gw(const void *data, u32 size)
|
|
{
|
|
- const struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
|
|
+ const struct batadv_bla_backbone_gw *gw;
|
|
u32 hash = 0;
|
|
|
|
- hash = jhash(&claim->addr, sizeof(claim->addr), hash);
|
|
- hash = jhash(&claim->vid, sizeof(claim->vid), hash);
|
|
+ gw = (struct batadv_bla_backbone_gw *)data;
|
|
+ hash = jhash(&gw->orig, sizeof(gw->orig), hash);
|
|
+ hash = jhash(&gw->vid, sizeof(gw->vid), hash);
|
|
|
|
return hash % size;
|
|
}
|
|
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
|
|
index b3e8b0e3073c2..e470410abb44d 100644
|
|
--- a/net/batman-adv/routing.c
|
|
+++ b/net/batman-adv/routing.c
|
|
@@ -782,6 +782,10 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
|
vid = batadv_get_vid(skb, hdr_len);
|
|
ethhdr = (struct ethhdr *)(skb->data + hdr_len);
|
|
|
|
+ /* do not reroute multicast frames in a unicast header */
|
|
+ if (is_multicast_ether_addr(ethhdr->h_dest))
|
|
+ return true;
|
|
+
|
|
/* check if the destination client was served by this node and it is now
|
|
* roaming. In this case, it means that the node has got a ROAM_ADV
|
|
* message and that it knows the new destination in the mesh to re-route
|
|
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
|
|
index 16cf5633eae3e..03319ab8a7c6e 100644
|
|
--- a/net/bluetooth/hci_event.c
|
|
+++ b/net/bluetooth/hci_event.c
|
|
@@ -41,12 +41,27 @@
|
|
|
|
/* Handle HCI Event packets */
|
|
|
|
-static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
|
|
+static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb,
|
|
+ u8 *new_status)
|
|
{
|
|
__u8 status = *((__u8 *) skb->data);
|
|
|
|
BT_DBG("%s status 0x%2.2x", hdev->name, status);
|
|
|
|
+ /* It is possible that we receive Inquiry Complete event right
|
|
+ * before we receive Inquiry Cancel Command Complete event, in
|
|
+ * which case the latter event should have status of Command
|
|
+ * Disallowed (0x0c). This should not be treated as error, since
|
|
+ * we actually achieve what Inquiry Cancel wants to achieve,
|
|
+ * which is to end the last Inquiry session.
|
|
+ */
|
|
+ if (status == 0x0c && !test_bit(HCI_INQUIRY, &hdev->flags)) {
|
|
+ bt_dev_warn(hdev, "Ignoring error of Inquiry Cancel command");
|
|
+ status = 0x00;
|
|
+ }
|
|
+
|
|
+ *new_status = status;
|
|
+
|
|
if (status)
|
|
return;
|
|
|
|
@@ -2758,7 +2773,7 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
|
|
|
|
switch (*opcode) {
|
|
case HCI_OP_INQUIRY_CANCEL:
|
|
- hci_cc_inquiry_cancel(hdev, skb);
|
|
+ hci_cc_inquiry_cancel(hdev, skb, status);
|
|
break;
|
|
|
|
case HCI_OP_PERIODIC_INQ:
|
|
@@ -5230,6 +5245,11 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
|
|
u8 status = 0, event = hdr->evt, req_evt = 0;
|
|
u16 opcode = HCI_OP_NOP;
|
|
|
|
+ if (!event) {
|
|
+ bt_dev_warn(hdev, "Received unexpected HCI Event 00000000");
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
|
|
struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
|
|
opcode = __le16_to_cpu(cmd_hdr->opcode);
|
|
@@ -5441,6 +5461,7 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
|
|
req_complete_skb(hdev, status, opcode, orig_skb);
|
|
}
|
|
|
|
+done:
|
|
kfree_skb(orig_skb);
|
|
kfree_skb(skb);
|
|
hdev->stat.evt_rx++;
|
|
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
|
|
index 0e31bbe1256cd..f2db50da8ce2e 100644
|
|
--- a/net/bluetooth/l2cap_core.c
|
|
+++ b/net/bluetooth/l2cap_core.c
|
|
@@ -403,6 +403,9 @@ static void l2cap_chan_timeout(struct work_struct *work)
|
|
BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
|
|
|
|
mutex_lock(&conn->chan_lock);
|
|
+ /* __set_chan_timer() calls l2cap_chan_hold(chan) while scheduling
|
|
+ * this work. No need to call l2cap_chan_hold(chan) here again.
|
|
+ */
|
|
l2cap_chan_lock(chan);
|
|
|
|
if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
|
|
@@ -415,12 +418,12 @@ static void l2cap_chan_timeout(struct work_struct *work)
|
|
|
|
l2cap_chan_close(chan, reason);
|
|
|
|
- l2cap_chan_unlock(chan);
|
|
-
|
|
chan->ops->close(chan);
|
|
- mutex_unlock(&conn->chan_lock);
|
|
|
|
+ l2cap_chan_unlock(chan);
|
|
l2cap_chan_put(chan);
|
|
+
|
|
+ mutex_unlock(&conn->chan_lock);
|
|
}
|
|
|
|
struct l2cap_chan *l2cap_chan_create(void)
|
|
@@ -1714,9 +1717,9 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err)
|
|
|
|
l2cap_chan_del(chan, err);
|
|
|
|
- l2cap_chan_unlock(chan);
|
|
-
|
|
chan->ops->close(chan);
|
|
+
|
|
+ l2cap_chan_unlock(chan);
|
|
l2cap_chan_put(chan);
|
|
}
|
|
|
|
@@ -4093,7 +4096,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn,
|
|
return 0;
|
|
}
|
|
|
|
- if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
|
|
+ if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2 &&
|
|
+ chan->state != BT_CONNECTED) {
|
|
cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
|
|
chan->dcid);
|
|
goto unlock;
|
|
@@ -4316,6 +4320,7 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
|
|
return 0;
|
|
}
|
|
|
|
+ l2cap_chan_hold(chan);
|
|
l2cap_chan_lock(chan);
|
|
|
|
rsp.dcid = cpu_to_le16(chan->scid);
|
|
@@ -4324,12 +4329,11 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
|
|
|
|
chan->ops->set_shutdown(chan);
|
|
|
|
- l2cap_chan_hold(chan);
|
|
l2cap_chan_del(chan, ECONNRESET);
|
|
|
|
- l2cap_chan_unlock(chan);
|
|
-
|
|
chan->ops->close(chan);
|
|
+
|
|
+ l2cap_chan_unlock(chan);
|
|
l2cap_chan_put(chan);
|
|
|
|
mutex_unlock(&conn->chan_lock);
|
|
@@ -4361,20 +4365,21 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
|
|
return 0;
|
|
}
|
|
|
|
+ l2cap_chan_hold(chan);
|
|
l2cap_chan_lock(chan);
|
|
|
|
if (chan->state != BT_DISCONN) {
|
|
l2cap_chan_unlock(chan);
|
|
+ l2cap_chan_put(chan);
|
|
mutex_unlock(&conn->chan_lock);
|
|
return 0;
|
|
}
|
|
|
|
- l2cap_chan_hold(chan);
|
|
l2cap_chan_del(chan, 0);
|
|
|
|
- l2cap_chan_unlock(chan);
|
|
-
|
|
chan->ops->close(chan);
|
|
+
|
|
+ l2cap_chan_unlock(chan);
|
|
l2cap_chan_put(chan);
|
|
|
|
mutex_unlock(&conn->chan_lock);
|
|
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
|
|
index d9bbbded49ef8..e562385d9440e 100644
|
|
--- a/net/bluetooth/l2cap_sock.c
|
|
+++ b/net/bluetooth/l2cap_sock.c
|
|
@@ -1038,7 +1038,7 @@ done:
|
|
}
|
|
|
|
/* Kill socket (only if zapped and orphan)
|
|
- * Must be called on unlocked socket.
|
|
+ * Must be called on unlocked socket, with l2cap channel lock.
|
|
*/
|
|
static void l2cap_sock_kill(struct sock *sk)
|
|
{
|
|
@@ -1189,6 +1189,7 @@ static int l2cap_sock_release(struct socket *sock)
|
|
{
|
|
struct sock *sk = sock->sk;
|
|
int err;
|
|
+ struct l2cap_chan *chan;
|
|
|
|
BT_DBG("sock %p, sk %p", sock, sk);
|
|
|
|
@@ -1198,9 +1199,17 @@ static int l2cap_sock_release(struct socket *sock)
|
|
bt_sock_unlink(&l2cap_sk_list, sk);
|
|
|
|
err = l2cap_sock_shutdown(sock, 2);
|
|
+ chan = l2cap_pi(sk)->chan;
|
|
+
|
|
+ l2cap_chan_hold(chan);
|
|
+ l2cap_chan_lock(chan);
|
|
|
|
sock_orphan(sk);
|
|
l2cap_sock_kill(sk);
|
|
+
|
|
+ l2cap_chan_unlock(chan);
|
|
+ l2cap_chan_put(chan);
|
|
+
|
|
return err;
|
|
}
|
|
|
|
@@ -1218,12 +1227,15 @@ static void l2cap_sock_cleanup_listen(struct sock *parent)
|
|
BT_DBG("child chan %p state %s", chan,
|
|
state_to_string(chan->state));
|
|
|
|
+ l2cap_chan_hold(chan);
|
|
l2cap_chan_lock(chan);
|
|
+
|
|
__clear_chan_timer(chan);
|
|
l2cap_chan_close(chan, ECONNRESET);
|
|
- l2cap_chan_unlock(chan);
|
|
-
|
|
l2cap_sock_kill(sk);
|
|
+
|
|
+ l2cap_chan_unlock(chan);
|
|
+ l2cap_chan_put(chan);
|
|
}
|
|
}
|
|
|
|
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
|
|
index 9849f1f4cf4f7..40d33431bc585 100644
|
|
--- a/net/core/neighbour.c
|
|
+++ b/net/core/neighbour.c
|
|
@@ -2798,6 +2798,7 @@ static void *neigh_stat_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
*pos = cpu+1;
|
|
return per_cpu_ptr(tbl->stats, cpu);
|
|
}
|
|
+ (*pos)++;
|
|
return NULL;
|
|
}
|
|
|
|
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
|
|
index d940c9e0eb024..0355f125d8361 100644
|
|
--- a/net/ipv4/ip_output.c
|
|
+++ b/net/ipv4/ip_output.c
|
|
@@ -73,6 +73,7 @@
|
|
#include <net/icmp.h>
|
|
#include <net/checksum.h>
|
|
#include <net/inetpeer.h>
|
|
+#include <net/inet_ecn.h>
|
|
#include <linux/igmp.h>
|
|
#include <linux/netfilter_ipv4.h>
|
|
#include <linux/netfilter_bridge.h>
|
|
@@ -1597,7 +1598,7 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
|
|
if (IS_ERR(rt))
|
|
return;
|
|
|
|
- inet_sk(sk)->tos = arg->tos;
|
|
+ inet_sk(sk)->tos = arg->tos & ~INET_ECN_MASK;
|
|
|
|
sk->sk_priority = skb->priority;
|
|
sk->sk_protocol = ip_hdr(skb)->protocol;
|
|
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
|
index 542f6e0f438f1..ea1c319100a5d 100644
|
|
--- a/net/ipv4/route.c
|
|
+++ b/net/ipv4/route.c
|
|
@@ -271,6 +271,7 @@ static void *rt_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
*pos = cpu+1;
|
|
return &per_cpu(rt_cache_stat, cpu);
|
|
}
|
|
+ (*pos)++;
|
|
return NULL;
|
|
|
|
}
|
|
diff --git a/net/key/af_key.c b/net/key/af_key.c
|
|
index d2ec620319d76..76a008b1cbe5f 100644
|
|
--- a/net/key/af_key.c
|
|
+++ b/net/key/af_key.c
|
|
@@ -1873,6 +1873,13 @@ static int pfkey_dump(struct sock *sk, struct sk_buff *skb, const struct sadb_ms
|
|
if (ext_hdrs[SADB_X_EXT_FILTER - 1]) {
|
|
struct sadb_x_filter *xfilter = ext_hdrs[SADB_X_EXT_FILTER - 1];
|
|
|
|
+ if ((xfilter->sadb_x_filter_splen >=
|
|
+ (sizeof(xfrm_address_t) << 3)) ||
|
|
+ (xfilter->sadb_x_filter_dplen >=
|
|
+ (sizeof(xfrm_address_t) << 3))) {
|
|
+ mutex_unlock(&pfk->dump_lock);
|
|
+ return -EINVAL;
|
|
+ }
|
|
filter = kmalloc(sizeof(*filter), GFP_KERNEL);
|
|
if (filter == NULL) {
|
|
mutex_unlock(&pfk->dump_lock);
|
|
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
|
|
index 2b8e80c721db1..a7cd031656801 100644
|
|
--- a/net/sunrpc/svc_xprt.c
|
|
+++ b/net/sunrpc/svc_xprt.c
|
|
@@ -97,8 +97,17 @@ void svc_unreg_xprt_class(struct svc_xprt_class *xcl)
|
|
}
|
|
EXPORT_SYMBOL_GPL(svc_unreg_xprt_class);
|
|
|
|
-/*
|
|
- * Format the transport list for printing
|
|
+/**
|
|
+ * svc_print_xprts - Format the transport list for printing
|
|
+ * @buf: target buffer for formatted address
|
|
+ * @maxlen: length of target buffer
|
|
+ *
|
|
+ * Fills in @buf with a string containing a list of transport names, each name
|
|
+ * terminated with '\n'. If the buffer is too small, some entries may be
|
|
+ * missing, but it is guaranteed that all lines in the output buffer are
|
|
+ * complete.
|
|
+ *
|
|
+ * Returns positive length of the filled-in string.
|
|
*/
|
|
int svc_print_xprts(char *buf, int maxlen)
|
|
{
|
|
@@ -111,9 +120,9 @@ int svc_print_xprts(char *buf, int maxlen)
|
|
list_for_each_entry(xcl, &svc_xprt_class_list, xcl_list) {
|
|
int slen;
|
|
|
|
- sprintf(tmpstr, "%s %d\n", xcl->xcl_name, xcl->xcl_max_payload);
|
|
- slen = strlen(tmpstr);
|
|
- if (len + slen > maxlen)
|
|
+ slen = snprintf(tmpstr, sizeof(tmpstr), "%s %d\n",
|
|
+ xcl->xcl_name, xcl->xcl_max_payload);
|
|
+ if (slen >= sizeof(tmpstr) || len + slen >= maxlen)
|
|
break;
|
|
len += slen;
|
|
strcat(buf, tmpstr);
|
|
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
|
|
index 67bddcb2ff466..fc1aa8bcb185d 100644
|
|
--- a/net/tipc/msg.c
|
|
+++ b/net/tipc/msg.c
|
|
@@ -138,7 +138,8 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)
|
|
if (fragid == FIRST_FRAGMENT) {
|
|
if (unlikely(head))
|
|
goto err;
|
|
- if (unlikely(skb_unclone(frag, GFP_ATOMIC)))
|
|
+ frag = skb_unshare(frag, GFP_ATOMIC);
|
|
+ if (unlikely(!frag))
|
|
goto err;
|
|
head = *headbuf = frag;
|
|
*buf = NULL;
|
|
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
|
index b5e2ef242efe7..ac78c5ac82846 100644
|
|
--- a/net/unix/af_unix.c
|
|
+++ b/net/unix/af_unix.c
|
|
@@ -191,11 +191,17 @@ static inline int unix_may_send(struct sock *sk, struct sock *osk)
|
|
return unix_peer(osk) == NULL || unix_our_peer(sk, osk);
|
|
}
|
|
|
|
-static inline int unix_recvq_full(struct sock const *sk)
|
|
+static inline int unix_recvq_full(const struct sock *sk)
|
|
{
|
|
return skb_queue_len(&sk->sk_receive_queue) > sk->sk_max_ack_backlog;
|
|
}
|
|
|
|
+static inline int unix_recvq_full_lockless(const struct sock *sk)
|
|
+{
|
|
+ return skb_queue_len_lockless(&sk->sk_receive_queue) >
|
|
+ READ_ONCE(sk->sk_max_ack_backlog);
|
|
+}
|
|
+
|
|
struct sock *unix_peer_get(struct sock *s)
|
|
{
|
|
struct sock *peer;
|
|
@@ -1792,7 +1798,8 @@ restart_locked:
|
|
* - unix_peer(sk) == sk by time of get but disconnected before lock
|
|
*/
|
|
if (other != sk &&
|
|
- unlikely(unix_peer(other) != sk && unix_recvq_full(other))) {
|
|
+ unlikely(unix_peer(other) != sk &&
|
|
+ unix_recvq_full_lockless(other))) {
|
|
if (timeo) {
|
|
timeo = unix_wait_for_peer(other, timeo);
|
|
|
|
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
|
|
index c02da25d7b631..7778e28cce9d7 100644
|
|
--- a/security/selinux/selinuxfs.c
|
|
+++ b/security/selinux/selinuxfs.c
|
|
@@ -1370,6 +1370,7 @@ static struct avc_cache_stats *sel_avc_get_stat_idx(loff_t *idx)
|
|
*idx = cpu + 1;
|
|
return &per_cpu(avc_cache_stats, cpu);
|
|
}
|
|
+ (*idx)++;
|
|
return NULL;
|
|
}
|
|
|
|
diff --git a/sound/hda/hdac_bus.c b/sound/hda/hdac_bus.c
|
|
index 0e81ea89a5965..e3f68a76d90eb 100644
|
|
--- a/sound/hda/hdac_bus.c
|
|
+++ b/sound/hda/hdac_bus.c
|
|
@@ -155,6 +155,7 @@ static void process_unsol_events(struct work_struct *work)
|
|
struct hdac_driver *drv;
|
|
unsigned int rp, caddr, res;
|
|
|
|
+ spin_lock_irq(&bus->reg_lock);
|
|
while (bus->unsol_rp != bus->unsol_wp) {
|
|
rp = (bus->unsol_rp + 1) % HDA_UNSOL_QUEUE_SIZE;
|
|
bus->unsol_rp = rp;
|
|
@@ -166,10 +167,13 @@ static void process_unsol_events(struct work_struct *work)
|
|
codec = bus->caddr_tbl[caddr & 0x0f];
|
|
if (!codec || !codec->dev.driver)
|
|
continue;
|
|
+ spin_unlock_irq(&bus->reg_lock);
|
|
drv = drv_to_hdac_driver(codec->dev.driver);
|
|
if (drv->unsol_event)
|
|
drv->unsol_event(codec, res);
|
|
+ spin_lock_irq(&bus->reg_lock);
|
|
}
|
|
+ spin_unlock_irq(&bus->reg_lock);
|
|
}
|
|
|
|
/**
|
|
diff --git a/sound/pci/asihpi/hpioctl.c b/sound/pci/asihpi/hpioctl.c
|
|
index 7a32abbe0cef8..4bdcb7443b1f5 100644
|
|
--- a/sound/pci/asihpi/hpioctl.c
|
|
+++ b/sound/pci/asihpi/hpioctl.c
|
|
@@ -346,7 +346,7 @@ int asihpi_adapter_probe(struct pci_dev *pci_dev,
|
|
struct hpi_message hm;
|
|
struct hpi_response hr;
|
|
struct hpi_adapter adapter;
|
|
- struct hpi_pci pci;
|
|
+ struct hpi_pci pci = { 0 };
|
|
|
|
memset(&adapter, 0, sizeof(adapter));
|
|
|
|
@@ -502,7 +502,7 @@ int asihpi_adapter_probe(struct pci_dev *pci_dev,
|
|
return 0;
|
|
|
|
err:
|
|
- for (idx = 0; idx < HPI_MAX_ADAPTER_MEM_SPACES; idx++) {
|
|
+ while (--idx >= 0) {
|
|
if (pci.ap_mem_base[idx]) {
|
|
iounmap(pci.ap_mem_base[idx]);
|
|
pci.ap_mem_base[idx] = NULL;
|
|
diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c
|
|
index dbfdfe99c69df..231c7d97333c7 100644
|
|
--- a/sound/soc/kirkwood/kirkwood-dma.c
|
|
+++ b/sound/soc/kirkwood/kirkwood-dma.c
|
|
@@ -136,7 +136,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
|
|
err = request_irq(priv->irq, kirkwood_dma_irq, IRQF_SHARED,
|
|
"kirkwood-i2s", priv);
|
|
if (err)
|
|
- return -EBUSY;
|
|
+ return err;
|
|
|
|
/*
|
|
* Enable Error interrupts. We're only ack'ing them but
|
|
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
|
|
index 5c4a3d6c42341..934540042bc2e 100644
|
|
--- a/sound/usb/midi.c
|
|
+++ b/sound/usb/midi.c
|
|
@@ -1803,6 +1803,28 @@ static int snd_usbmidi_create_endpoints(struct snd_usb_midi *umidi,
|
|
return 0;
|
|
}
|
|
|
|
+static struct usb_ms_endpoint_descriptor *find_usb_ms_endpoint_descriptor(
|
|
+ struct usb_host_endpoint *hostep)
|
|
+{
|
|
+ unsigned char *extra = hostep->extra;
|
|
+ int extralen = hostep->extralen;
|
|
+
|
|
+ while (extralen > 3) {
|
|
+ struct usb_ms_endpoint_descriptor *ms_ep =
|
|
+ (struct usb_ms_endpoint_descriptor *)extra;
|
|
+
|
|
+ if (ms_ep->bLength > 3 &&
|
|
+ ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT &&
|
|
+ ms_ep->bDescriptorSubtype == UAC_MS_GENERAL)
|
|
+ return ms_ep;
|
|
+ if (!extra[0])
|
|
+ break;
|
|
+ extralen -= extra[0];
|
|
+ extra += extra[0];
|
|
+ }
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
/*
|
|
* Returns MIDIStreaming device capabilities.
|
|
*/
|
|
@@ -1840,11 +1862,8 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi *umidi,
|
|
ep = get_ep_desc(hostep);
|
|
if (!usb_endpoint_xfer_bulk(ep) && !usb_endpoint_xfer_int(ep))
|
|
continue;
|
|
- ms_ep = (struct usb_ms_endpoint_descriptor *)hostep->extra;
|
|
- if (hostep->extralen < 4 ||
|
|
- ms_ep->bLength < 4 ||
|
|
- ms_ep->bDescriptorType != USB_DT_CS_ENDPOINT ||
|
|
- ms_ep->bDescriptorSubtype != UAC_MS_GENERAL)
|
|
+ ms_ep = find_usb_ms_endpoint_descriptor(hostep);
|
|
+ if (!ms_ep)
|
|
continue;
|
|
if (usb_endpoint_dir_out(ep)) {
|
|
if (endpoints[epidx].out_ep) {
|
|
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
|
|
index 2070c02de3af5..ea55cb6b614f4 100644
|
|
--- a/tools/perf/util/symbol-elf.c
|
|
+++ b/tools/perf/util/symbol-elf.c
|
|
@@ -1390,6 +1390,7 @@ struct kcore_copy_info {
|
|
u64 first_symbol;
|
|
u64 last_symbol;
|
|
u64 first_module;
|
|
+ u64 first_module_symbol;
|
|
u64 last_module_symbol;
|
|
struct phdr_data kernel_map;
|
|
struct phdr_data modules_map;
|
|
@@ -1404,6 +1405,8 @@ static int kcore_copy__process_kallsyms(void *arg, const char *name, char type,
|
|
return 0;
|
|
|
|
if (strchr(name, '[')) {
|
|
+ if (!kci->first_module_symbol || start < kci->first_module_symbol)
|
|
+ kci->first_module_symbol = start;
|
|
if (start > kci->last_module_symbol)
|
|
kci->last_module_symbol = start;
|
|
return 0;
|
|
@@ -1528,6 +1531,10 @@ static int kcore_copy__calc_maps(struct kcore_copy_info *kci, const char *dir,
|
|
kci->etext += page_size;
|
|
}
|
|
|
|
+ if (kci->first_module_symbol &&
|
|
+ (!kci->first_module || kci->first_module_symbol < kci->first_module))
|
|
+ kci->first_module = kci->first_module_symbol;
|
|
+
|
|
kci->first_module = round_down(kci->first_module, page_size);
|
|
|
|
if (kci->last_module_symbol) {
|
|
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
|
|
index 82f3a9d78cab4..ba8e8840b94b2 100644
|
|
--- a/virt/kvm/kvm_main.c
|
|
+++ b/virt/kvm/kvm_main.c
|
|
@@ -3392,7 +3392,7 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,
|
|
void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
|
|
struct kvm_io_device *dev)
|
|
{
|
|
- int i;
|
|
+ int i, j;
|
|
struct kvm_io_bus *new_bus, *bus;
|
|
|
|
bus = kvm->buses[bus_idx];
|
|
@@ -3409,17 +3409,20 @@ void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,
|
|
|
|
new_bus = kmalloc(sizeof(*bus) + ((bus->dev_count - 1) *
|
|
sizeof(struct kvm_io_range)), GFP_KERNEL);
|
|
- if (!new_bus) {
|
|
+ if (new_bus) {
|
|
+ memcpy(new_bus, bus, sizeof(*bus) + i * sizeof(struct kvm_io_range));
|
|
+ new_bus->dev_count--;
|
|
+ memcpy(new_bus->range + i, bus->range + i + 1,
|
|
+ (new_bus->dev_count - i) * sizeof(struct kvm_io_range));
|
|
+ } else {
|
|
pr_err("kvm: failed to shrink bus, removing it completely\n");
|
|
- goto broken;
|
|
+ for (j = 0; j < bus->dev_count; j++) {
|
|
+ if (j == i)
|
|
+ continue;
|
|
+ kvm_iodevice_destructor(bus->range[j].dev);
|
|
+ }
|
|
}
|
|
|
|
- memcpy(new_bus, bus, sizeof(*bus) + i * sizeof(struct kvm_io_range));
|
|
- new_bus->dev_count--;
|
|
- memcpy(new_bus->range + i, bus->range + i + 1,
|
|
- (new_bus->dev_count - i) * sizeof(struct kvm_io_range));
|
|
-
|
|
-broken:
|
|
rcu_assign_pointer(kvm->buses[bus_idx], new_bus);
|
|
synchronize_srcu_expedited(&kvm->srcu);
|
|
kfree(bus);
|