mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-21 22:31:51 +00:00
700 lines
22 KiB
Diff
700 lines
22 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index fee84602e999..d71c40a34b30 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 14
|
|
-SUBLEVEL = 49
|
|
+SUBLEVEL = 50
|
|
EXTRAVERSION =
|
|
NAME = Remembering Coco
|
|
|
|
diff --git a/arch/arc/include/asm/ptrace.h b/arch/arc/include/asm/ptrace.h
|
|
index 1bfeec2c0558..2a58af7a2e3a 100644
|
|
--- a/arch/arc/include/asm/ptrace.h
|
|
+++ b/arch/arc/include/asm/ptrace.h
|
|
@@ -63,7 +63,7 @@ struct callee_regs {
|
|
long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
|
|
};
|
|
|
|
-#define instruction_pointer(regs) ((regs)->ret)
|
|
+#define instruction_pointer(regs) (unsigned long)((regs)->ret)
|
|
#define profile_pc(regs) instruction_pointer(regs)
|
|
|
|
/* return 1 if user mode or 0 if kernel mode */
|
|
diff --git a/arch/avr32/mach-at32ap/clock.c b/arch/avr32/mach-at32ap/clock.c
|
|
index 23b1a97fae7a..52c179bec0cc 100644
|
|
--- a/arch/avr32/mach-at32ap/clock.c
|
|
+++ b/arch/avr32/mach-at32ap/clock.c
|
|
@@ -80,6 +80,9 @@ int clk_enable(struct clk *clk)
|
|
{
|
|
unsigned long flags;
|
|
|
|
+ if (!clk)
|
|
+ return 0;
|
|
+
|
|
spin_lock_irqsave(&clk_lock, flags);
|
|
__clk_enable(clk);
|
|
spin_unlock_irqrestore(&clk_lock, flags);
|
|
@@ -106,6 +109,9 @@ void clk_disable(struct clk *clk)
|
|
{
|
|
unsigned long flags;
|
|
|
|
+ if (IS_ERR_OR_NULL(clk))
|
|
+ return;
|
|
+
|
|
spin_lock_irqsave(&clk_lock, flags);
|
|
__clk_disable(clk);
|
|
spin_unlock_irqrestore(&clk_lock, flags);
|
|
@@ -117,6 +123,9 @@ unsigned long clk_get_rate(struct clk *clk)
|
|
unsigned long flags;
|
|
unsigned long rate;
|
|
|
|
+ if (!clk)
|
|
+ return 0;
|
|
+
|
|
spin_lock_irqsave(&clk_lock, flags);
|
|
rate = clk->get_rate(clk);
|
|
spin_unlock_irqrestore(&clk_lock, flags);
|
|
@@ -129,6 +138,9 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
|
|
{
|
|
unsigned long flags, actual_rate;
|
|
|
|
+ if (!clk)
|
|
+ return 0;
|
|
+
|
|
if (!clk->set_rate)
|
|
return -ENOSYS;
|
|
|
|
@@ -145,6 +157,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
|
|
unsigned long flags;
|
|
long ret;
|
|
|
|
+ if (!clk)
|
|
+ return 0;
|
|
+
|
|
if (!clk->set_rate)
|
|
return -ENOSYS;
|
|
|
|
@@ -161,6 +176,9 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
|
|
unsigned long flags;
|
|
int ret;
|
|
|
|
+ if (!clk)
|
|
+ return 0;
|
|
+
|
|
if (!clk->set_parent)
|
|
return -ENOSYS;
|
|
|
|
@@ -174,7 +192,7 @@ EXPORT_SYMBOL(clk_set_parent);
|
|
|
|
struct clk *clk_get_parent(struct clk *clk)
|
|
{
|
|
- return clk->parent;
|
|
+ return !clk ? NULL : clk->parent;
|
|
}
|
|
EXPORT_SYMBOL(clk_get_parent);
|
|
|
|
diff --git a/arch/s390/kernel/sclp.S b/arch/s390/kernel/sclp.S
|
|
index 29bd7bec4176..1ecd47b5e250 100644
|
|
--- a/arch/s390/kernel/sclp.S
|
|
+++ b/arch/s390/kernel/sclp.S
|
|
@@ -276,6 +276,8 @@ ENTRY(_sclp_print_early)
|
|
jno .Lesa2
|
|
ahi %r15,-80
|
|
stmh %r6,%r15,96(%r15) # store upper register halves
|
|
+ basr %r13,0
|
|
+ lmh %r0,%r15,.Lzeroes-.(%r13) # clear upper register halves
|
|
.Lesa2:
|
|
#endif
|
|
lr %r10,%r2 # save string pointer
|
|
@@ -299,6 +301,8 @@ ENTRY(_sclp_print_early)
|
|
#endif
|
|
lm %r6,%r15,120(%r15) # restore registers
|
|
br %r14
|
|
+.Lzeroes:
|
|
+ .fill 64,4,0
|
|
|
|
.LwritedataS4:
|
|
.long 0x00760005 # SCLP command for write data
|
|
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
|
|
index 74c91729a62a..bdb3ecf8e168 100644
|
|
--- a/arch/tile/kernel/setup.c
|
|
+++ b/arch/tile/kernel/setup.c
|
|
@@ -1146,7 +1146,7 @@ static void __init load_hv_initrd(void)
|
|
|
|
void __init free_initrd_mem(unsigned long begin, unsigned long end)
|
|
{
|
|
- free_bootmem(__pa(begin), end - begin);
|
|
+ free_bootmem_late(__pa(begin), end - begin);
|
|
}
|
|
|
|
static int __init setup_initrd(char *str)
|
|
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
|
|
index 78cbb2db5a85..ec5a3c7fac7a 100644
|
|
--- a/arch/x86/boot/compressed/eboot.c
|
|
+++ b/arch/x86/boot/compressed/eboot.c
|
|
@@ -560,6 +560,10 @@ static efi_status_t setup_e820(struct boot_params *params,
|
|
unsigned int e820_type = 0;
|
|
unsigned long m = efi->efi_memmap;
|
|
|
|
+#ifdef CONFIG_X86_64
|
|
+ m |= (u64)efi->efi_memmap_hi << 32;
|
|
+#endif
|
|
+
|
|
d = (efi_memory_desc_t *)(m + (i * efi->efi_memdesc_size));
|
|
switch (d->type) {
|
|
case EFI_RESERVED_TYPE:
|
|
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
|
|
index c5b56ed10aff..a814c80eb580 100644
|
|
--- a/arch/x86/boot/compressed/head_32.S
|
|
+++ b/arch/x86/boot/compressed/head_32.S
|
|
@@ -54,7 +54,7 @@ ENTRY(efi_pe_entry)
|
|
call reloc
|
|
reloc:
|
|
popl %ecx
|
|
- subl reloc, %ecx
|
|
+ subl $reloc, %ecx
|
|
movl %ecx, BP_code32_start(%eax)
|
|
|
|
sub $0x4, %esp
|
|
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
|
|
index d8f80e733cf8..a7175855b6ed 100644
|
|
--- a/block/blk-cgroup.c
|
|
+++ b/block/blk-cgroup.c
|
|
@@ -703,8 +703,12 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
|
return -EINVAL;
|
|
|
|
disk = get_gendisk(MKDEV(major, minor), &part);
|
|
- if (!disk || part)
|
|
+ if (!disk)
|
|
return -EINVAL;
|
|
+ if (part) {
|
|
+ put_disk(disk);
|
|
+ return -EINVAL;
|
|
+ }
|
|
|
|
rcu_read_lock();
|
|
spin_lock_irq(disk->queue->queue_lock);
|
|
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
|
|
index 7ccc084bf1df..85aa76116a30 100644
|
|
--- a/drivers/ata/libata-pmp.c
|
|
+++ b/drivers/ata/libata-pmp.c
|
|
@@ -460,6 +460,13 @@ static void sata_pmp_quirks(struct ata_port *ap)
|
|
ATA_LFLAG_NO_SRST |
|
|
ATA_LFLAG_ASSUME_ATA;
|
|
}
|
|
+ } else if (vendor == 0x11ab && devid == 0x4140) {
|
|
+ /* Marvell 4140 quirks */
|
|
+ ata_for_each_link(link, ap, EDGE) {
|
|
+ /* port 4 is for SEMB device and it doesn't like SRST */
|
|
+ if (link->pmp == 4)
|
|
+ link->flags |= ATA_LFLAG_DISABLED;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
|
|
index a0966331a89b..c6f7e918b2b1 100644
|
|
--- a/drivers/input/touchscreen/usbtouchscreen.c
|
|
+++ b/drivers/input/touchscreen/usbtouchscreen.c
|
|
@@ -625,6 +625,9 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
|
|
goto err_out;
|
|
}
|
|
|
|
+ /* TSC-25 data sheet specifies a delay after the RESET command */
|
|
+ msleep(150);
|
|
+
|
|
/* set coordinate output rate */
|
|
buf[0] = buf[1] = 0xFF;
|
|
ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
|
|
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
|
|
index b96ee9d78aa3..9be97e0bd149 100644
|
|
--- a/drivers/md/raid1.c
|
|
+++ b/drivers/md/raid1.c
|
|
@@ -336,7 +336,7 @@ static void raid1_end_read_request(struct bio *bio, int error)
|
|
spin_lock_irqsave(&conf->device_lock, flags);
|
|
if (r1_bio->mddev->degraded == conf->raid_disks ||
|
|
(r1_bio->mddev->degraded == conf->raid_disks-1 &&
|
|
- !test_bit(Faulty, &conf->mirrors[mirror].rdev->flags)))
|
|
+ test_bit(In_sync, &conf->mirrors[mirror].rdev->flags)))
|
|
uptodate = 1;
|
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
|
}
|
|
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
|
|
index a7d9f95a7b03..7fd86becfd1a 100644
|
|
--- a/drivers/mmc/host/sdhci-esdhc.h
|
|
+++ b/drivers/mmc/host/sdhci-esdhc.h
|
|
@@ -47,6 +47,6 @@
|
|
#define ESDHC_DMA_SYSCTL 0x40c
|
|
#define ESDHC_DMA_SNOOP 0x00000040
|
|
|
|
-#define ESDHC_HOST_CONTROL_RES 0x05
|
|
+#define ESDHC_HOST_CONTROL_RES 0x01
|
|
|
|
#endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
|
|
diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c
|
|
index 561c6b4907a1..b80766699249 100644
|
|
--- a/drivers/mmc/host/sdhci-pxav3.c
|
|
+++ b/drivers/mmc/host/sdhci-pxav3.c
|
|
@@ -257,6 +257,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
|
|
goto err_of_parse;
|
|
sdhci_get_of_property(pdev);
|
|
pdata = pxav3_get_mmc_pdata(dev);
|
|
+ pdev->dev.platform_data = pdata;
|
|
} else if (pdata) {
|
|
/* on-chip device */
|
|
if (pdata->flags & PXA_FLAG_CARD_PERMANENT)
|
|
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
|
|
index a1d6986261a3..f3109828c6df 100644
|
|
--- a/drivers/scsi/st.c
|
|
+++ b/drivers/scsi/st.c
|
|
@@ -1262,9 +1262,9 @@ static int st_open(struct inode *inode, struct file *filp)
|
|
spin_lock(&st_use_lock);
|
|
STp->in_use = 0;
|
|
spin_unlock(&st_use_lock);
|
|
- scsi_tape_put(STp);
|
|
if (resumed)
|
|
scsi_autopm_put_device(STp->device);
|
|
+ scsi_tape_put(STp);
|
|
return retval;
|
|
|
|
}
|
|
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
|
|
index c8d7b3009c7e..55ec9b4b97cc 100644
|
|
--- a/drivers/target/iscsi/iscsi_target.c
|
|
+++ b/drivers/target/iscsi/iscsi_target.c
|
|
@@ -4476,7 +4476,18 @@ static void iscsit_logout_post_handler_closesession(
|
|
struct iscsi_conn *conn)
|
|
{
|
|
struct iscsi_session *sess = conn->sess;
|
|
- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
+ int sleep = 1;
|
|
+ /*
|
|
+ * Traditional iscsi/tcp will invoke this logic from TX thread
|
|
+ * context during session logout, so clear tx_thread_active and
|
|
+ * sleep if iscsit_close_connection() has not already occured.
|
|
+ *
|
|
+ * Since iser-target invokes this logic from it's own workqueue,
|
|
+ * always sleep waiting for RX/TX thread shutdown to complete
|
|
+ * within iscsit_close_connection().
|
|
+ */
|
|
+ if (conn->conn_transport->transport_type == ISCSI_TCP)
|
|
+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
|
|
atomic_set(&conn->conn_logout_remove, 0);
|
|
complete(&conn->conn_logout_comp);
|
|
@@ -4490,7 +4501,10 @@ static void iscsit_logout_post_handler_closesession(
|
|
static void iscsit_logout_post_handler_samecid(
|
|
struct iscsi_conn *conn)
|
|
{
|
|
- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
+ int sleep = 1;
|
|
+
|
|
+ if (conn->conn_transport->transport_type == ISCSI_TCP)
|
|
+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
|
|
atomic_set(&conn->conn_logout_remove, 0);
|
|
complete(&conn->conn_logout_comp);
|
|
@@ -4709,6 +4723,7 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
|
|
struct iscsi_session *sess;
|
|
struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
|
|
struct se_session *se_sess, *se_sess_tmp;
|
|
+ LIST_HEAD(free_list);
|
|
int session_count = 0;
|
|
|
|
spin_lock_bh(&se_tpg->session_lock);
|
|
@@ -4730,14 +4745,17 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
|
|
}
|
|
atomic_set(&sess->session_reinstatement, 1);
|
|
spin_unlock(&sess->conn_lock);
|
|
- spin_unlock_bh(&se_tpg->session_lock);
|
|
|
|
- iscsit_free_session(sess);
|
|
- spin_lock_bh(&se_tpg->session_lock);
|
|
+ list_move_tail(&se_sess->sess_list, &free_list);
|
|
+ }
|
|
+ spin_unlock_bh(&se_tpg->session_lock);
|
|
|
|
+ list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) {
|
|
+ sess = (struct iscsi_session *)se_sess->fabric_sess_ptr;
|
|
+
|
|
+ iscsit_free_session(sess);
|
|
session_count++;
|
|
}
|
|
- spin_unlock_bh(&se_tpg->session_lock);
|
|
|
|
pr_debug("Released %d iSCSI Session(s) from Target Portal"
|
|
" Group: %hu\n", session_count, tpg->tpgt);
|
|
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
|
|
index b9e16abb0fab..5c957658a04a 100644
|
|
--- a/drivers/usb/host/xhci-hub.c
|
|
+++ b/drivers/usb/host/xhci-hub.c
|
|
@@ -480,10 +480,13 @@ static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci,
|
|
u32 pls = status_reg & PORT_PLS_MASK;
|
|
|
|
/* resume state is a xHCI internal state.
|
|
- * Do not report it to usb core.
|
|
+ * Do not report it to usb core, instead, pretend to be U3,
|
|
+ * thus usb core knows it's not ready for transfer
|
|
*/
|
|
- if (pls == XDEV_RESUME)
|
|
+ if (pls == XDEV_RESUME) {
|
|
+ *status |= USB_SS_PORT_LS_U3;
|
|
return;
|
|
+ }
|
|
|
|
/* When the CAS bit is set then warm reset
|
|
* should be performed on port
|
|
@@ -584,7 +587,14 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
|
|
status |= USB_PORT_STAT_C_RESET << 16;
|
|
/* USB3.0 only */
|
|
if (hcd->speed == HCD_USB3) {
|
|
- if ((raw_port_status & PORT_PLC))
|
|
+ /* Port link change with port in resume state should not be
|
|
+ * reported to usbcore, as this is an internal state to be
|
|
+ * handled by xhci driver. Reporting PLC to usbcore may
|
|
+ * cause usbcore clearing PLC first and port change event
|
|
+ * irq won't be generated.
|
|
+ */
|
|
+ if ((raw_port_status & PORT_PLC) &&
|
|
+ (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME)
|
|
status |= USB_PORT_STAT_C_LINK_STATE << 16;
|
|
if ((raw_port_status & PORT_WRC))
|
|
status |= USB_PORT_STAT_C_BH_RESET << 16;
|
|
@@ -1114,10 +1124,10 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
|
spin_lock_irqsave(&xhci->lock, flags);
|
|
|
|
if (hcd->self.root_hub->do_remote_wakeup) {
|
|
- if (bus_state->resuming_ports) {
|
|
+ if (bus_state->resuming_ports || /* USB2 */
|
|
+ bus_state->port_remote_wakeup) { /* USB3 */
|
|
spin_unlock_irqrestore(&xhci->lock, flags);
|
|
- xhci_dbg(xhci, "suspend failed because "
|
|
- "a port is resuming\n");
|
|
+ xhci_dbg(xhci, "suspend failed because a port is resuming\n");
|
|
return -EBUSY;
|
|
}
|
|
}
|
|
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
|
|
index f615712e8251..bcc43a21fd12 100644
|
|
--- a/drivers/usb/host/xhci-ring.c
|
|
+++ b/drivers/usb/host/xhci-ring.c
|
|
@@ -1740,6 +1740,9 @@ static void handle_port_status(struct xhci_hcd *xhci,
|
|
usb_hcd_resume_root_hub(hcd);
|
|
}
|
|
|
|
+ if (hcd->speed == HCD_USB3 && (temp & PORT_PLS_MASK) == XDEV_INACTIVE)
|
|
+ bus_state->port_remote_wakeup &= ~(1 << faked_port_index);
|
|
+
|
|
if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) {
|
|
xhci_dbg(xhci, "port resume event for port %d\n", port_id);
|
|
|
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
|
index 16f4f8dc1ae9..fc61e663b00a 100644
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -3424,6 +3424,9 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ if (virt_dev->tt_info)
|
|
+ old_active_eps = virt_dev->tt_info->active_eps;
|
|
+
|
|
if (virt_dev->udev != udev) {
|
|
/* If the virt_dev and the udev does not match, this virt_dev
|
|
* may belong to another udev.
|
|
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
|
|
index 70facb725105..c167485e0653 100644
|
|
--- a/drivers/usb/host/xhci.h
|
|
+++ b/drivers/usb/host/xhci.h
|
|
@@ -285,6 +285,7 @@ struct xhci_op_regs {
|
|
#define XDEV_U0 (0x0 << 5)
|
|
#define XDEV_U2 (0x2 << 5)
|
|
#define XDEV_U3 (0x3 << 5)
|
|
+#define XDEV_INACTIVE (0x6 << 5)
|
|
#define XDEV_RESUME (0xf << 5)
|
|
/* true: port has power (see HCC_PPC) */
|
|
#define PORT_POWER (1 << 9)
|
|
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
|
|
index 821e1e2f70f6..da380a99c6b8 100644
|
|
--- a/drivers/usb/storage/unusual_devs.h
|
|
+++ b/drivers/usb/storage/unusual_devs.h
|
|
@@ -2032,6 +2032,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
|
|
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
|
US_FL_NO_READ_DISC_INFO ),
|
|
|
|
+/* Reported by Oliver Neukum <oneukum@suse.com>
|
|
+ * This device morphes spontaneously into another device if the access
|
|
+ * pattern of Windows isn't followed. Thus writable media would be dirty
|
|
+ * if the initial instance is used. So the device is limited to its
|
|
+ * virtual CD.
|
|
+ * And yes, the concept that BCD goes up to 9 is not heeded */
|
|
+UNUSUAL_DEV( 0x19d2, 0x1225, 0x0000, 0xffff,
|
|
+ "ZTE,Incorporated",
|
|
+ "ZTE WCDMA Technologies MSM",
|
|
+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
|
+ US_FL_SINGLE_LUN ),
|
|
+
|
|
/* Reported by Sven Geggus <sven-usbst@geggus.net>
|
|
* This encrypted pen drive returns bogus data for the initial READ(10).
|
|
*/
|
|
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
|
|
index 78987e481bc6..85095d7aa51c 100644
|
|
--- a/drivers/vhost/vhost.c
|
|
+++ b/drivers/vhost/vhost.c
|
|
@@ -876,6 +876,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
|
|
}
|
|
if (eventfp != d->log_file) {
|
|
filep = d->log_file;
|
|
+ d->log_file = eventfp;
|
|
ctx = d->log_ctx;
|
|
d->log_ctx = eventfp ?
|
|
eventfd_ctx_fileget(eventfp) : NULL;
|
|
diff --git a/fs/dcache.c b/fs/dcache.c
|
|
index aa24f7de1b92..3d2f27b4cd38 100644
|
|
--- a/fs/dcache.c
|
|
+++ b/fs/dcache.c
|
|
@@ -587,6 +587,9 @@ repeat:
|
|
if (unlikely(d_unhashed(dentry)))
|
|
goto kill_it;
|
|
|
|
+ if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED))
|
|
+ goto kill_it;
|
|
+
|
|
if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) {
|
|
if (dentry->d_op->d_delete(dentry))
|
|
goto kill_it;
|
|
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c
|
|
index 9065107f083e..7a5237a1bce5 100644
|
|
--- a/kernel/irq/resend.c
|
|
+++ b/kernel/irq/resend.c
|
|
@@ -75,13 +75,21 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq)
|
|
!desc->irq_data.chip->irq_retrigger(&desc->irq_data)) {
|
|
#ifdef CONFIG_HARDIRQS_SW_RESEND
|
|
/*
|
|
- * If the interrupt has a parent irq and runs
|
|
- * in the thread context of the parent irq,
|
|
- * retrigger the parent.
|
|
+ * If the interrupt is running in the thread
|
|
+ * context of the parent irq we need to be
|
|
+ * careful, because we cannot trigger it
|
|
+ * directly.
|
|
*/
|
|
- if (desc->parent_irq &&
|
|
- irq_settings_is_nested_thread(desc))
|
|
+ if (irq_settings_is_nested_thread(desc)) {
|
|
+ /*
|
|
+ * If the parent_irq is valid, we
|
|
+ * retrigger the parent, otherwise we
|
|
+ * do nothing.
|
|
+ */
|
|
+ if (!desc->parent_irq)
|
|
+ return;
|
|
irq = desc->parent_irq;
|
|
+ }
|
|
/* Set it pending and activate the softirq: */
|
|
set_bit(irq, irqs_resend);
|
|
tasklet_schedule(&resend_tasklet);
|
|
diff --git a/mm/memory.c b/mm/memory.c
|
|
index 749e1c68d490..e9ddc7aceefa 100644
|
|
--- a/mm/memory.c
|
|
+++ b/mm/memory.c
|
|
@@ -3234,6 +3234,10 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
|
pte_unmap(page_table);
|
|
|
|
+ /* File mapping without ->vm_ops ? */
|
|
+ if (vma->vm_flags & VM_SHARED)
|
|
+ return VM_FAULT_SIGBUS;
|
|
+
|
|
/* Check if we need to add a guard page to the stack */
|
|
if (check_stack_guard_page(vma, address) < 0)
|
|
return VM_FAULT_SIGSEGV;
|
|
@@ -3502,6 +3506,9 @@ static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
- vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
|
|
|
|
pte_unmap(page_table);
|
|
+ /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */
|
|
+ if (!vma->vm_ops->fault)
|
|
+ return VM_FAULT_SIGBUS;
|
|
return __do_fault(mm, vma, address, pmd, pgoff, flags, orig_pte);
|
|
}
|
|
|
|
@@ -3650,11 +3657,9 @@ static int handle_pte_fault(struct mm_struct *mm,
|
|
entry = ACCESS_ONCE(*pte);
|
|
if (!pte_present(entry)) {
|
|
if (pte_none(entry)) {
|
|
- if (vma->vm_ops) {
|
|
- if (likely(vma->vm_ops->fault))
|
|
- return do_linear_fault(mm, vma, address,
|
|
+ if (vma->vm_ops)
|
|
+ return do_linear_fault(mm, vma, address,
|
|
pte, pmd, flags, entry);
|
|
- }
|
|
return do_anonymous_page(mm, vma, address,
|
|
pte, pmd, flags);
|
|
}
|
|
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c
|
|
index 653ce5d9e6e0..5d8bc1f6b5a1 100644
|
|
--- a/net/mac80211/debugfs_netdev.c
|
|
+++ b/net/mac80211/debugfs_netdev.c
|
|
@@ -712,6 +712,7 @@ void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata)
|
|
|
|
debugfs_remove_recursive(sdata->vif.debugfs_dir);
|
|
sdata->vif.debugfs_dir = NULL;
|
|
+ sdata->debugfs.subdir_stations = NULL;
|
|
}
|
|
|
|
void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata)
|
|
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c
|
|
index e8fdb172adbb..a985158d95d5 100644
|
|
--- a/net/rds/ib_rdma.c
|
|
+++ b/net/rds/ib_rdma.c
|
|
@@ -759,8 +759,10 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
|
|
}
|
|
|
|
ibmr = rds_ib_alloc_fmr(rds_ibdev);
|
|
- if (IS_ERR(ibmr))
|
|
+ if (IS_ERR(ibmr)) {
|
|
+ rds_ib_dev_put(rds_ibdev);
|
|
return ibmr;
|
|
+ }
|
|
|
|
ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents);
|
|
if (ret == 0)
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index 2f503c0836a9..907371d87312 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -2282,7 +2282,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
|
|
SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
|
|
SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
|
|
- SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),
|
|
+ SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
|
|
|
|
SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
|
|
SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
|
|
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
|
|
index b16be3944213..9a3e1076a5b1 100644
|
|
--- a/sound/usb/mixer_maps.c
|
|
+++ b/sound/usb/mixer_maps.c
|
|
@@ -336,6 +336,20 @@ static const struct usbmix_name_map scms_usb3318_map[] = {
|
|
{ 0 }
|
|
};
|
|
|
|
+/* Bose companion 5, the dB conversion factor is 16 instead of 256 */
|
|
+static struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
|
|
+static struct usbmix_name_map bose_companion5_map[] = {
|
|
+ { 3, NULL, .dB = &bose_companion5_dB },
|
|
+ { 0 } /* terminator */
|
|
+};
|
|
+
|
|
+/* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */
|
|
+static struct usbmix_dB_map dragonfly_1_2_dB = {0, 5000};
|
|
+static struct usbmix_name_map dragonfly_1_2_map[] = {
|
|
+ { 7, NULL, .dB = &dragonfly_1_2_dB },
|
|
+ { 0 } /* terminator */
|
|
+};
|
|
+
|
|
/*
|
|
* Control map entries
|
|
*/
|
|
@@ -442,6 +456,16 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|
.id = USB_ID(0x25c4, 0x0003),
|
|
.map = scms_usb3318_map,
|
|
},
|
|
+ {
|
|
+ /* Bose Companion 5 */
|
|
+ .id = USB_ID(0x05a7, 0x1020),
|
|
+ .map = bose_companion5_map,
|
|
+ },
|
|
+ {
|
|
+ /* Dragonfly DAC 1.2 */
|
|
+ .id = USB_ID(0x21b4, 0x0081),
|
|
+ .map = dragonfly_1_2_map,
|
|
+ },
|
|
{ 0 } /* terminator */
|
|
};
|
|
|
|
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
|
|
index 5293b5ac8b9d..7c24088bcaa4 100644
|
|
--- a/sound/usb/quirks-table.h
|
|
+++ b/sound/usb/quirks-table.h
|
|
@@ -2516,6 +2516,74 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
|
}
|
|
},
|
|
|
|
+/* Steinberg devices */
|
|
+{
|
|
+ /* Steinberg MI2 */
|
|
+ USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x2040),
|
|
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
|
+ .ifnum = QUIRK_ANY_INTERFACE,
|
|
+ .type = QUIRK_COMPOSITE,
|
|
+ .data = & (const struct snd_usb_audio_quirk[]) {
|
|
+ {
|
|
+ .ifnum = 0,
|
|
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
|
+ },
|
|
+ {
|
|
+ .ifnum = 1,
|
|
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
|
+ },
|
|
+ {
|
|
+ .ifnum = 2,
|
|
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
|
+ },
|
|
+ {
|
|
+ .ifnum = 3,
|
|
+ .type = QUIRK_MIDI_FIXED_ENDPOINT,
|
|
+ .data = &(const struct snd_usb_midi_endpoint_info) {
|
|
+ .out_cables = 0x0001,
|
|
+ .in_cables = 0x0001
|
|
+ }
|
|
+ },
|
|
+ {
|
|
+ .ifnum = -1
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+},
|
|
+{
|
|
+ /* Steinberg MI4 */
|
|
+ USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x4040),
|
|
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
|
+ .ifnum = QUIRK_ANY_INTERFACE,
|
|
+ .type = QUIRK_COMPOSITE,
|
|
+ .data = & (const struct snd_usb_audio_quirk[]) {
|
|
+ {
|
|
+ .ifnum = 0,
|
|
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
|
+ },
|
|
+ {
|
|
+ .ifnum = 1,
|
|
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
|
+ },
|
|
+ {
|
|
+ .ifnum = 2,
|
|
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
|
|
+ },
|
|
+ {
|
|
+ .ifnum = 3,
|
|
+ .type = QUIRK_MIDI_FIXED_ENDPOINT,
|
|
+ .data = &(const struct snd_usb_midi_endpoint_info) {
|
|
+ .out_cables = 0x0001,
|
|
+ .in_cables = 0x0001
|
|
+ }
|
|
+ },
|
|
+ {
|
|
+ .ifnum = -1
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+},
|
|
+
|
|
/* TerraTec devices */
|
|
{
|
|
USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
|