mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 09:11:49 +00:00
1099 lines
38 KiB
Diff
1099 lines
38 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index ce277ff0fd72..2d084a418789 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 74
|
|
+SUBLEVEL = 75
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
|
|
index 48f36246a5d7..e09e5211bace 100644
|
|
--- a/arch/arm/kernel/process.c
|
|
+++ b/arch/arm/kernel/process.c
|
|
@@ -503,6 +503,7 @@ EXPORT_SYMBOL(kernel_thread);
|
|
unsigned long get_wchan(struct task_struct *p)
|
|
{
|
|
struct stackframe frame;
|
|
+ unsigned long stack_page;
|
|
int count = 0;
|
|
if (!p || p == current || p->state == TASK_RUNNING)
|
|
return 0;
|
|
@@ -511,9 +512,11 @@ unsigned long get_wchan(struct task_struct *p)
|
|
frame.sp = thread_saved_sp(p);
|
|
frame.lr = 0; /* recovered from the stack */
|
|
frame.pc = thread_saved_pc(p);
|
|
+ stack_page = (unsigned long)task_stack_page(p);
|
|
do {
|
|
- int ret = unwind_frame(&frame);
|
|
- if (ret < 0)
|
|
+ if (frame.sp < stack_page ||
|
|
+ frame.sp >= stack_page + THREAD_SIZE ||
|
|
+ unwind_frame(&frame) < 0)
|
|
return 0;
|
|
if (!in_sched_functions(frame.pc))
|
|
return frame.pc;
|
|
diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c
|
|
index 00f79e59985b..af4e8c8a5422 100644
|
|
--- a/arch/arm/kernel/stacktrace.c
|
|
+++ b/arch/arm/kernel/stacktrace.c
|
|
@@ -31,7 +31,7 @@ int notrace unwind_frame(struct stackframe *frame)
|
|
high = ALIGN(low, THREAD_SIZE);
|
|
|
|
/* check current frame pointer is within bounds */
|
|
- if (fp < (low + 12) || fp + 4 >= high)
|
|
+ if (fp < low + 12 || fp > high - 4)
|
|
return -EINVAL;
|
|
|
|
/* restore the registers from the stack frame */
|
|
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
|
|
index 7144ae651d3d..bb7ed98ab9af 100644
|
|
--- a/arch/arm/mach-omap2/omap_hwmod.c
|
|
+++ b/arch/arm/mach-omap2/omap_hwmod.c
|
|
@@ -317,7 +317,7 @@ static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v)
|
|
}
|
|
|
|
/**
|
|
- * _set_softreset: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v
|
|
+ * _set_softreset: set OCP_SYSCONFIG.SOFTRESET bit in @v
|
|
* @oh: struct omap_hwmod *
|
|
* @v: pointer to register contents to modify
|
|
*
|
|
@@ -1378,6 +1378,36 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)
|
|
}
|
|
|
|
/**
|
|
+ * _clear_softreset: clear OCP_SYSCONFIG.SOFTRESET bit in @v
|
|
+ * @oh: struct omap_hwmod *
|
|
+ * @v: pointer to register contents to modify
|
|
+ *
|
|
+ * Clear the SOFTRESET bit in @v for hwmod @oh. Returns -EINVAL upon
|
|
+ * error or 0 upon success.
|
|
+ */
|
|
+static int _clear_softreset(struct omap_hwmod *oh, u32 *v)
|
|
+{
|
|
+ u32 softrst_mask;
|
|
+
|
|
+ if (!oh->class->sysc ||
|
|
+ !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (!oh->class->sysc->sysc_fields) {
|
|
+ WARN(1,
|
|
+ "omap_hwmod: %s: sysc_fields absent for sysconfig class\n",
|
|
+ oh->name);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
|
|
+
|
|
+ *v &= ~softrst_mask;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/**
|
|
* _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit
|
|
* @oh: struct omap_hwmod *
|
|
*
|
|
@@ -1420,6 +1450,12 @@ static int _ocp_softreset(struct omap_hwmod *oh)
|
|
ret = _set_softreset(oh, &v);
|
|
if (ret)
|
|
goto dis_opt_clks;
|
|
+
|
|
+ _write_sysconfig(v, oh);
|
|
+ ret = _clear_softreset(oh, &v);
|
|
+ if (ret)
|
|
+ goto dis_opt_clks;
|
|
+
|
|
_write_sysconfig(v, oh);
|
|
|
|
if (oh->class->sysc->srst_udelay)
|
|
@@ -1918,6 +1954,11 @@ int omap_hwmod_softreset(struct omap_hwmod *oh)
|
|
goto error;
|
|
_write_sysconfig(v, oh);
|
|
|
|
+ ret = _clear_softreset(oh, &v);
|
|
+ if (ret)
|
|
+ goto error;
|
|
+ _write_sysconfig(v, oh);
|
|
+
|
|
error:
|
|
return ret;
|
|
}
|
|
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
|
|
index db86ce90c69f..a875de49aa9c 100644
|
|
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
|
|
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
|
|
@@ -3347,7 +3347,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = {
|
|
.syss_offs = 0x0014,
|
|
.sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
|
|
SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
|
|
- SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
|
|
+ SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
|
|
+ SYSS_HAS_RESET_STATUS),
|
|
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
|
MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
|
|
.sysc_fields = &omap_hwmod_sysc_type1,
|
|
@@ -3465,15 +3466,7 @@ static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = {
|
|
* hence HWMOD_SWSUP_MSTANDBY
|
|
*/
|
|
|
|
- /*
|
|
- * During system boot; If the hwmod framework resets the module
|
|
- * the module will have smart idle settings; which can lead to deadlock
|
|
- * (above Errata Id:i660); so, dont reset the module during boot;
|
|
- * Use HWMOD_INIT_NO_RESET.
|
|
- */
|
|
-
|
|
- .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY |
|
|
- HWMOD_INIT_NO_RESET,
|
|
+ .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
|
|
};
|
|
|
|
/*
|
|
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
|
|
index 4d4eb60bad1e..aeb7c10daf56 100644
|
|
--- a/arch/arm/mach-pxa/tosa.c
|
|
+++ b/arch/arm/mach-pxa/tosa.c
|
|
@@ -424,57 +424,57 @@ static struct platform_device tosa_power_device = {
|
|
* Tosa Keyboard
|
|
*/
|
|
static const uint32_t tosakbd_keymap[] = {
|
|
- KEY(0, 2, KEY_W),
|
|
- KEY(0, 6, KEY_K),
|
|
- KEY(0, 7, KEY_BACKSPACE),
|
|
- KEY(0, 8, KEY_P),
|
|
- KEY(1, 1, KEY_Q),
|
|
- KEY(1, 2, KEY_E),
|
|
- KEY(1, 3, KEY_T),
|
|
- KEY(1, 4, KEY_Y),
|
|
- KEY(1, 6, KEY_O),
|
|
- KEY(1, 7, KEY_I),
|
|
- KEY(1, 8, KEY_COMMA),
|
|
- KEY(2, 1, KEY_A),
|
|
- KEY(2, 2, KEY_D),
|
|
- KEY(2, 3, KEY_G),
|
|
- KEY(2, 4, KEY_U),
|
|
- KEY(2, 6, KEY_L),
|
|
- KEY(2, 7, KEY_ENTER),
|
|
- KEY(2, 8, KEY_DOT),
|
|
- KEY(3, 1, KEY_Z),
|
|
- KEY(3, 2, KEY_C),
|
|
- KEY(3, 3, KEY_V),
|
|
- KEY(3, 4, KEY_J),
|
|
- KEY(3, 5, TOSA_KEY_ADDRESSBOOK),
|
|
- KEY(3, 6, TOSA_KEY_CANCEL),
|
|
- KEY(3, 7, TOSA_KEY_CENTER),
|
|
- KEY(3, 8, TOSA_KEY_OK),
|
|
- KEY(3, 9, KEY_LEFTSHIFT),
|
|
- KEY(4, 1, KEY_S),
|
|
- KEY(4, 2, KEY_R),
|
|
- KEY(4, 3, KEY_B),
|
|
- KEY(4, 4, KEY_N),
|
|
- KEY(4, 5, TOSA_KEY_CALENDAR),
|
|
- KEY(4, 6, TOSA_KEY_HOMEPAGE),
|
|
- KEY(4, 7, KEY_LEFTCTRL),
|
|
- KEY(4, 8, TOSA_KEY_LIGHT),
|
|
- KEY(4, 10, KEY_RIGHTSHIFT),
|
|
- KEY(5, 1, KEY_TAB),
|
|
- KEY(5, 2, KEY_SLASH),
|
|
- KEY(5, 3, KEY_H),
|
|
- KEY(5, 4, KEY_M),
|
|
- KEY(5, 5, TOSA_KEY_MENU),
|
|
- KEY(5, 7, KEY_UP),
|
|
- KEY(5, 11, TOSA_KEY_FN),
|
|
- KEY(6, 1, KEY_X),
|
|
- KEY(6, 2, KEY_F),
|
|
- KEY(6, 3, KEY_SPACE),
|
|
- KEY(6, 4, KEY_APOSTROPHE),
|
|
- KEY(6, 5, TOSA_KEY_MAIL),
|
|
- KEY(6, 6, KEY_LEFT),
|
|
- KEY(6, 7, KEY_DOWN),
|
|
- KEY(6, 8, KEY_RIGHT),
|
|
+ KEY(0, 1, KEY_W),
|
|
+ KEY(0, 5, KEY_K),
|
|
+ KEY(0, 6, KEY_BACKSPACE),
|
|
+ KEY(0, 7, KEY_P),
|
|
+ KEY(1, 0, KEY_Q),
|
|
+ KEY(1, 1, KEY_E),
|
|
+ KEY(1, 2, KEY_T),
|
|
+ KEY(1, 3, KEY_Y),
|
|
+ KEY(1, 5, KEY_O),
|
|
+ KEY(1, 6, KEY_I),
|
|
+ KEY(1, 7, KEY_COMMA),
|
|
+ KEY(2, 0, KEY_A),
|
|
+ KEY(2, 1, KEY_D),
|
|
+ KEY(2, 2, KEY_G),
|
|
+ KEY(2, 3, KEY_U),
|
|
+ KEY(2, 5, KEY_L),
|
|
+ KEY(2, 6, KEY_ENTER),
|
|
+ KEY(2, 7, KEY_DOT),
|
|
+ KEY(3, 0, KEY_Z),
|
|
+ KEY(3, 1, KEY_C),
|
|
+ KEY(3, 2, KEY_V),
|
|
+ KEY(3, 3, KEY_J),
|
|
+ KEY(3, 4, TOSA_KEY_ADDRESSBOOK),
|
|
+ KEY(3, 5, TOSA_KEY_CANCEL),
|
|
+ KEY(3, 6, TOSA_KEY_CENTER),
|
|
+ KEY(3, 7, TOSA_KEY_OK),
|
|
+ KEY(3, 8, KEY_LEFTSHIFT),
|
|
+ KEY(4, 0, KEY_S),
|
|
+ KEY(4, 1, KEY_R),
|
|
+ KEY(4, 2, KEY_B),
|
|
+ KEY(4, 3, KEY_N),
|
|
+ KEY(4, 4, TOSA_KEY_CALENDAR),
|
|
+ KEY(4, 5, TOSA_KEY_HOMEPAGE),
|
|
+ KEY(4, 6, KEY_LEFTCTRL),
|
|
+ KEY(4, 7, TOSA_KEY_LIGHT),
|
|
+ KEY(4, 9, KEY_RIGHTSHIFT),
|
|
+ KEY(5, 0, KEY_TAB),
|
|
+ KEY(5, 1, KEY_SLASH),
|
|
+ KEY(5, 2, KEY_H),
|
|
+ KEY(5, 3, KEY_M),
|
|
+ KEY(5, 4, TOSA_KEY_MENU),
|
|
+ KEY(5, 6, KEY_UP),
|
|
+ KEY(5, 10, TOSA_KEY_FN),
|
|
+ KEY(6, 0, KEY_X),
|
|
+ KEY(6, 1, KEY_F),
|
|
+ KEY(6, 2, KEY_SPACE),
|
|
+ KEY(6, 3, KEY_APOSTROPHE),
|
|
+ KEY(6, 4, TOSA_KEY_MAIL),
|
|
+ KEY(6, 5, KEY_LEFT),
|
|
+ KEY(6, 6, KEY_DOWN),
|
|
+ KEY(6, 7, KEY_RIGHT),
|
|
};
|
|
|
|
static struct matrix_keymap_data tosakbd_keymap_data = {
|
|
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
|
|
index 3fab2046c8a4..0eea2d2e8563 100644
|
|
--- a/arch/mips/mm/dma-default.c
|
|
+++ b/arch/mips/mm/dma-default.c
|
|
@@ -30,16 +30,20 @@ static inline struct page *dma_addr_to_page(struct device *dev,
|
|
}
|
|
|
|
/*
|
|
+ * The affected CPUs below in 'cpu_needs_post_dma_flush()' can
|
|
+ * speculatively fill random cachelines with stale data at any time,
|
|
+ * requiring an extra flush post-DMA.
|
|
+ *
|
|
* Warning on the terminology - Linux calls an uncached area coherent;
|
|
* MIPS terminology calls memory areas with hardware maintained coherency
|
|
* coherent.
|
|
*/
|
|
-
|
|
-static inline int cpu_is_noncoherent_r10000(struct device *dev)
|
|
+static inline int cpu_needs_post_dma_flush(struct device *dev)
|
|
{
|
|
return !plat_device_is_coherent(dev) &&
|
|
(current_cpu_type() == CPU_R10000 ||
|
|
- current_cpu_type() == CPU_R12000);
|
|
+ current_cpu_type() == CPU_R12000 ||
|
|
+ current_cpu_type() == CPU_BMIPS5000);
|
|
}
|
|
|
|
static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
|
@@ -209,7 +213,7 @@ static inline void __dma_sync(struct page *page,
|
|
static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
|
|
size_t size, enum dma_data_direction direction, struct dma_attrs *attrs)
|
|
{
|
|
- if (cpu_is_noncoherent_r10000(dev))
|
|
+ if (cpu_needs_post_dma_flush(dev))
|
|
__dma_sync(dma_addr_to_page(dev, dma_addr),
|
|
dma_addr & ~PAGE_MASK, size, direction);
|
|
|
|
@@ -260,7 +264,7 @@ static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
|
|
static void mips_dma_sync_single_for_cpu(struct device *dev,
|
|
dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
|
|
{
|
|
- if (cpu_is_noncoherent_r10000(dev))
|
|
+ if (cpu_needs_post_dma_flush(dev))
|
|
__dma_sync(dma_addr_to_page(dev, dma_handle),
|
|
dma_handle & ~PAGE_MASK, size, direction);
|
|
}
|
|
@@ -281,7 +285,7 @@ static void mips_dma_sync_sg_for_cpu(struct device *dev,
|
|
|
|
/* Make sure that gcc doesn't leave the empty loop body. */
|
|
for (i = 0; i < nelems; i++, sg++) {
|
|
- if (cpu_is_noncoherent_r10000(dev))
|
|
+ if (cpu_needs_post_dma_flush(dev))
|
|
__dma_sync(sg_page(sg), sg->offset, sg->length,
|
|
direction);
|
|
}
|
|
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
|
|
index 454548c309f1..8a67b7c019b8 100644
|
|
--- a/arch/x86/platform/efi/efi.c
|
|
+++ b/arch/x86/platform/efi/efi.c
|
|
@@ -744,13 +744,6 @@ void __init efi_init(void)
|
|
|
|
set_bit(EFI_MEMMAP, &x86_efi_facility);
|
|
|
|
-#ifdef CONFIG_X86_32
|
|
- if (efi_is_native()) {
|
|
- x86_platform.get_wallclock = efi_get_time;
|
|
- x86_platform.set_wallclock = efi_set_rtc_mmss;
|
|
- }
|
|
-#endif
|
|
-
|
|
#if EFI_DEBUG
|
|
print_efi_memmap();
|
|
#endif
|
|
diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
|
|
index 585c3b279feb..850246206b12 100644
|
|
--- a/crypto/algif_hash.c
|
|
+++ b/crypto/algif_hash.c
|
|
@@ -117,9 +117,6 @@ static ssize_t hash_sendpage(struct socket *sock, struct page *page,
|
|
if (flags & MSG_SENDPAGE_NOTLAST)
|
|
flags |= MSG_MORE;
|
|
|
|
- if (flags & MSG_SENDPAGE_NOTLAST)
|
|
- flags |= MSG_MORE;
|
|
-
|
|
lock_sock(sk);
|
|
sg_init_table(ctx->sgl.sg, 1);
|
|
sg_set_page(ctx->sgl.sg, page, size, offset);
|
|
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
|
|
index 918a3b4148b8..a19c027b29bd 100644
|
|
--- a/crypto/algif_skcipher.c
|
|
+++ b/crypto/algif_skcipher.c
|
|
@@ -381,9 +381,6 @@ static ssize_t skcipher_sendpage(struct socket *sock, struct page *page,
|
|
if (flags & MSG_SENDPAGE_NOTLAST)
|
|
flags |= MSG_MORE;
|
|
|
|
- if (flags & MSG_SENDPAGE_NOTLAST)
|
|
- flags |= MSG_MORE;
|
|
-
|
|
lock_sock(sk);
|
|
if (!ctx->more && ctx->used)
|
|
goto unlock;
|
|
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
|
|
index bd1f18c341d5..c22b5e7849f8 100644
|
|
--- a/drivers/gpu/drm/radeon/si.c
|
|
+++ b/drivers/gpu/drm/radeon/si.c
|
|
@@ -2479,8 +2479,15 @@ static int si_mc_init(struct radeon_device *rdev)
|
|
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
|
|
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
|
|
/* size in MB on si */
|
|
- rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
|
- rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
|
+ tmp = RREG32(CONFIG_MEMSIZE);
|
|
+ /* some boards may have garbage in the upper 16 bits */
|
|
+ if (tmp & 0xffff0000) {
|
|
+ DRM_INFO("Probable bad vram size: 0x%08x\n", tmp);
|
|
+ if (tmp & 0xffff)
|
|
+ tmp &= 0xffff;
|
|
+ }
|
|
+ rdev->mc.mc_vram_size = tmp * 1024ULL * 1024ULL;
|
|
+ rdev->mc.real_vram_size = rdev->mc.mc_vram_size;
|
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
|
si_vram_gtt_location(rdev, &rdev->mc);
|
|
radeon_update_bandwidth_info(rdev);
|
|
diff --git a/drivers/hwmon/w83l786ng.c b/drivers/hwmon/w83l786ng.c
|
|
index 5850b7706088..a97a62063356 100644
|
|
--- a/drivers/hwmon/w83l786ng.c
|
|
+++ b/drivers/hwmon/w83l786ng.c
|
|
@@ -510,7 +510,7 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr,
|
|
mutex_lock(&data->update_lock);
|
|
reg = w83l786ng_read_value(client, W83L786NG_REG_FAN_CFG);
|
|
data->pwm_enable[nr] = val;
|
|
- reg &= ~(0x02 << W83L786NG_PWM_ENABLE_SHIFT[nr]);
|
|
+ reg &= ~(0x03 << W83L786NG_PWM_ENABLE_SHIFT[nr]);
|
|
reg |= (val - 1) << W83L786NG_PWM_ENABLE_SHIFT[nr];
|
|
w83l786ng_write_value(client, W83L786NG_REG_FAN_CFG, reg);
|
|
mutex_unlock(&data->update_lock);
|
|
@@ -781,7 +781,7 @@ static struct w83l786ng_data *w83l786ng_update_device(struct device *dev)
|
|
((pwmcfg >> W83L786NG_PWM_MODE_SHIFT[i]) & 1)
|
|
? 0 : 1;
|
|
data->pwm_enable[i] =
|
|
- ((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 2) + 1;
|
|
+ ((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 3) + 1;
|
|
data->pwm[i] = w83l786ng_read_value(client,
|
|
W83L786NG_REG_PWM[i]);
|
|
}
|
|
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
|
|
index 22cd96f58c99..ce384a449a65 100644
|
|
--- a/drivers/input/touchscreen/usbtouchscreen.c
|
|
+++ b/drivers/input/touchscreen/usbtouchscreen.c
|
|
@@ -106,6 +106,7 @@ struct usbtouch_device_info {
|
|
struct usbtouch_usb {
|
|
unsigned char *data;
|
|
dma_addr_t data_dma;
|
|
+ int data_size;
|
|
unsigned char *buffer;
|
|
int buf_len;
|
|
struct urb *irq;
|
|
@@ -1474,7 +1475,7 @@ static int usbtouch_reset_resume(struct usb_interface *intf)
|
|
static void usbtouch_free_buffers(struct usb_device *udev,
|
|
struct usbtouch_usb *usbtouch)
|
|
{
|
|
- usb_free_coherent(udev, usbtouch->type->rept_size,
|
|
+ usb_free_coherent(udev, usbtouch->data_size,
|
|
usbtouch->data, usbtouch->data_dma);
|
|
kfree(usbtouch->buffer);
|
|
}
|
|
@@ -1519,7 +1520,20 @@ static int usbtouch_probe(struct usb_interface *intf,
|
|
if (!type->process_pkt)
|
|
type->process_pkt = usbtouch_process_pkt;
|
|
|
|
- usbtouch->data = usb_alloc_coherent(udev, type->rept_size,
|
|
+ usbtouch->data_size = type->rept_size;
|
|
+ if (type->get_pkt_len) {
|
|
+ /*
|
|
+ * When dealing with variable-length packets we should
|
|
+ * not request more than wMaxPacketSize bytes at once
|
|
+ * as we do not know if there is more data coming or
|
|
+ * we filled exactly wMaxPacketSize bytes and there is
|
|
+ * nothing else.
|
|
+ */
|
|
+ usbtouch->data_size = min(usbtouch->data_size,
|
|
+ usb_endpoint_maxp(endpoint));
|
|
+ }
|
|
+
|
|
+ usbtouch->data = usb_alloc_coherent(udev, usbtouch->data_size,
|
|
GFP_KERNEL, &usbtouch->data_dma);
|
|
if (!usbtouch->data)
|
|
goto out_free;
|
|
@@ -1578,12 +1592,12 @@ static int usbtouch_probe(struct usb_interface *intf,
|
|
if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT)
|
|
usb_fill_int_urb(usbtouch->irq, udev,
|
|
usb_rcvintpipe(udev, endpoint->bEndpointAddress),
|
|
- usbtouch->data, type->rept_size,
|
|
+ usbtouch->data, usbtouch->data_size,
|
|
usbtouch_irq, usbtouch, endpoint->bInterval);
|
|
else
|
|
usb_fill_bulk_urb(usbtouch->irq, udev,
|
|
usb_rcvbulkpipe(udev, endpoint->bEndpointAddress),
|
|
- usbtouch->data, type->rept_size,
|
|
+ usbtouch->data, usbtouch->data_size,
|
|
usbtouch_irq, usbtouch);
|
|
|
|
usbtouch->irq->dev = udev;
|
|
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
|
|
index cc06a1e52423..4c260dc7910e 100644
|
|
--- a/drivers/md/dm-bufio.c
|
|
+++ b/drivers/md/dm-bufio.c
|
|
@@ -1642,6 +1642,11 @@ static int __init dm_bufio_init(void)
|
|
{
|
|
__u64 mem;
|
|
|
|
+ dm_bufio_allocated_kmem_cache = 0;
|
|
+ dm_bufio_allocated_get_free_pages = 0;
|
|
+ dm_bufio_allocated_vmalloc = 0;
|
|
+ dm_bufio_current_allocated = 0;
|
|
+
|
|
memset(&dm_bufio_caches, 0, sizeof dm_bufio_caches);
|
|
memset(&dm_bufio_cache_names, 0, sizeof dm_bufio_cache_names);
|
|
|
|
diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c
|
|
index ee99912596cb..fb4bf9bac1a7 100644
|
|
--- a/drivers/md/dm-delay.c
|
|
+++ b/drivers/md/dm-delay.c
|
|
@@ -20,6 +20,7 @@
|
|
struct delay_c {
|
|
struct timer_list delay_timer;
|
|
struct mutex timer_lock;
|
|
+ struct workqueue_struct *kdelayd_wq;
|
|
struct work_struct flush_expired_bios;
|
|
struct list_head delayed_bios;
|
|
atomic_t may_delay;
|
|
@@ -45,14 +46,13 @@ struct dm_delay_info {
|
|
|
|
static DEFINE_MUTEX(delayed_bios_lock);
|
|
|
|
-static struct workqueue_struct *kdelayd_wq;
|
|
static struct kmem_cache *delayed_cache;
|
|
|
|
static void handle_delayed_timer(unsigned long data)
|
|
{
|
|
struct delay_c *dc = (struct delay_c *)data;
|
|
|
|
- queue_work(kdelayd_wq, &dc->flush_expired_bios);
|
|
+ queue_work(dc->kdelayd_wq, &dc->flush_expired_bios);
|
|
}
|
|
|
|
static void queue_timeout(struct delay_c *dc, unsigned long expires)
|
|
@@ -191,6 +191,12 @@ out:
|
|
goto bad_dev_write;
|
|
}
|
|
|
|
+ dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0);
|
|
+ if (!dc->kdelayd_wq) {
|
|
+ DMERR("Couldn't start kdelayd");
|
|
+ goto bad_queue;
|
|
+ }
|
|
+
|
|
setup_timer(&dc->delay_timer, handle_delayed_timer, (unsigned long)dc);
|
|
|
|
INIT_WORK(&dc->flush_expired_bios, flush_expired_bios);
|
|
@@ -203,6 +209,8 @@ out:
|
|
ti->private = dc;
|
|
return 0;
|
|
|
|
+bad_queue:
|
|
+ mempool_destroy(dc->delayed_pool);
|
|
bad_dev_write:
|
|
if (dc->dev_write)
|
|
dm_put_device(ti, dc->dev_write);
|
|
@@ -217,7 +225,7 @@ static void delay_dtr(struct dm_target *ti)
|
|
{
|
|
struct delay_c *dc = ti->private;
|
|
|
|
- flush_workqueue(kdelayd_wq);
|
|
+ destroy_workqueue(dc->kdelayd_wq);
|
|
|
|
dm_put_device(ti, dc->dev_read);
|
|
|
|
@@ -351,12 +359,6 @@ static int __init dm_delay_init(void)
|
|
{
|
|
int r = -ENOMEM;
|
|
|
|
- kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0);
|
|
- if (!kdelayd_wq) {
|
|
- DMERR("Couldn't start kdelayd");
|
|
- goto bad_queue;
|
|
- }
|
|
-
|
|
delayed_cache = KMEM_CACHE(dm_delay_info, 0);
|
|
if (!delayed_cache) {
|
|
DMERR("Couldn't create delayed bio cache.");
|
|
@@ -374,8 +376,6 @@ static int __init dm_delay_init(void)
|
|
bad_register:
|
|
kmem_cache_destroy(delayed_cache);
|
|
bad_memcache:
|
|
- destroy_workqueue(kdelayd_wq);
|
|
-bad_queue:
|
|
return r;
|
|
}
|
|
|
|
@@ -383,7 +383,6 @@ static void __exit dm_delay_exit(void)
|
|
{
|
|
dm_unregister_target(&delay_target);
|
|
kmem_cache_destroy(delayed_cache);
|
|
- destroy_workqueue(kdelayd_wq);
|
|
}
|
|
|
|
/* Module hooks */
|
|
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
|
|
index d509f236bd54..43e19b76af8c 100644
|
|
--- a/drivers/md/dm-table.c
|
|
+++ b/drivers/md/dm-table.c
|
|
@@ -215,6 +215,11 @@ int dm_table_create(struct dm_table **result, fmode_t mode,
|
|
|
|
num_targets = dm_round_up(num_targets, KEYS_PER_NODE);
|
|
|
|
+ if (!num_targets) {
|
|
+ kfree(t);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
if (alloc_targets(t, num_targets)) {
|
|
kfree(t);
|
|
t = NULL;
|
|
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c
|
|
index dc474bc6522d..7029c8016dd5 100644
|
|
--- a/drivers/rtc/rtc-at91rm9200.c
|
|
+++ b/drivers/rtc/rtc-at91rm9200.c
|
|
@@ -162,6 +162,8 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
|
|
|
at91_alarm_year = tm.tm_year;
|
|
|
|
+ tm.tm_mon = alrm->time.tm_mon;
|
|
+ tm.tm_mday = alrm->time.tm_mday;
|
|
tm.tm_hour = alrm->time.tm_hour;
|
|
tm.tm_min = alrm->time.tm_min;
|
|
tm.tm_sec = alrm->time.tm_sec;
|
|
diff --git a/drivers/staging/comedi/drivers/pcmuio.c b/drivers/staging/comedi/drivers/pcmuio.c
|
|
index 661ba2e03892..6e936c54f113 100644
|
|
--- a/drivers/staging/comedi/drivers/pcmuio.c
|
|
+++ b/drivers/staging/comedi/drivers/pcmuio.c
|
|
@@ -464,13 +464,13 @@ static int pcmuio_detach(struct comedi_device *dev)
|
|
if (dev->iobase)
|
|
release_region(dev->iobase, ASIC_IOSIZE * thisboard->num_asics);
|
|
|
|
- for (i = 0; i < MAX_ASICS; ++i) {
|
|
- if (devpriv->asics[i].irq)
|
|
- free_irq(devpriv->asics[i].irq, dev);
|
|
- }
|
|
-
|
|
- if (devpriv && devpriv->sprivs)
|
|
+ if (devpriv) {
|
|
+ for (i = 0; i < MAX_ASICS; ++i) {
|
|
+ if (devpriv->asics[i].irq)
|
|
+ free_irq(devpriv->asics[i].irq, dev);
|
|
+ }
|
|
kfree(devpriv->sprivs);
|
|
+ }
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/staging/comedi/drivers/ssv_dnp.c b/drivers/staging/comedi/drivers/ssv_dnp.c
|
|
index 526de2efa125..0316780103b5 100644
|
|
--- a/drivers/staging/comedi/drivers/ssv_dnp.c
|
|
+++ b/drivers/staging/comedi/drivers/ssv_dnp.c
|
|
@@ -251,11 +251,11 @@ static int dnp_dio_insn_bits(struct comedi_device *dev,
|
|
|
|
/* on return, data[1] contains the value of the digital input lines. */
|
|
outb(PADR, CSCIR);
|
|
- data[0] = inb(CSCDR);
|
|
+ data[1] = inb(CSCDR);
|
|
outb(PBDR, CSCIR);
|
|
- data[0] += inb(CSCDR) << 8;
|
|
+ data[1] += inb(CSCDR) << 8;
|
|
outb(PCDR, CSCIR);
|
|
- data[0] += ((inb(CSCDR) & 0xF0) << 12);
|
|
+ data[1] += ((inb(CSCDR) & 0xF0) << 12);
|
|
|
|
return 2;
|
|
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
index 82fce32ca229..14476faf9a00 100644
|
|
--- a/drivers/usb/core/hub.c
|
|
+++ b/drivers/usb/core/hub.c
|
|
@@ -3891,8 +3891,9 @@ static void hub_events(void)
|
|
hub->hdev->children[i - 1];
|
|
|
|
dev_dbg(hub_dev, "warm reset port %d\n", i);
|
|
- if (!udev || !(portstatus &
|
|
- USB_PORT_STAT_CONNECTION)) {
|
|
+ if (!udev ||
|
|
+ !(portstatus & USB_PORT_STAT_CONNECTION) ||
|
|
+ udev->state == USB_STATE_NOTATTACHED) {
|
|
status = hub_port_reset(hub, i,
|
|
NULL, HUB_BH_RESET_TIME,
|
|
true);
|
|
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
|
|
index e4d87d700554..5bf2bc00821b 100644
|
|
--- a/drivers/usb/dwc3/ep0.c
|
|
+++ b/drivers/usb/dwc3/ep0.c
|
|
@@ -380,6 +380,8 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
|
|
dep = dwc3_wIndex_to_dep(dwc, wIndex);
|
|
if (!dep)
|
|
return -EINVAL;
|
|
+ if (set == 0 && (dep->flags & DWC3_EP_WEDGE))
|
|
+ break;
|
|
ret = __dwc3_gadget_ep_set_halt(dep, set);
|
|
if (ret)
|
|
return -EINVAL;
|
|
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
|
|
index 6d6fb88913c8..80e3094c8e19 100644
|
|
--- a/drivers/usb/dwc3/gadget.c
|
|
+++ b/drivers/usb/dwc3/gadget.c
|
|
@@ -1101,9 +1101,6 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value)
|
|
else
|
|
dep->flags |= DWC3_EP_STALL;
|
|
} else {
|
|
- if (dep->flags & DWC3_EP_WEDGE)
|
|
- return 0;
|
|
-
|
|
ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
|
|
DWC3_DEPCMD_CLEARSTALL, ¶ms);
|
|
if (ret)
|
|
@@ -1111,7 +1108,7 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value)
|
|
value ? "set" : "clear",
|
|
dep->name);
|
|
else
|
|
- dep->flags &= ~DWC3_EP_STALL;
|
|
+ dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
|
|
}
|
|
|
|
return ret;
|
|
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
|
|
index baaebf2830fc..f28b6de05f90 100644
|
|
--- a/drivers/usb/gadget/composite.c
|
|
+++ b/drivers/usb/gadget/composite.c
|
|
@@ -584,6 +584,7 @@ static void reset_config(struct usb_composite_dev *cdev)
|
|
bitmap_zero(f->endpoints, 32);
|
|
}
|
|
cdev->config = NULL;
|
|
+ cdev->delayed_status = 0;
|
|
}
|
|
|
|
static int set_config(struct usb_composite_dev *cdev,
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
|
index a5477554ecb6..66f5e5472c17 100644
|
|
--- a/drivers/usb/serial/option.c
|
|
+++ b/drivers/usb/serial/option.c
|
|
@@ -85,6 +85,7 @@ static void option_instat_callback(struct urb *urb);
|
|
#define HUAWEI_PRODUCT_K4505 0x1464
|
|
#define HUAWEI_PRODUCT_K3765 0x1465
|
|
#define HUAWEI_PRODUCT_K4605 0x14C6
|
|
+#define HUAWEI_PRODUCT_E173S6 0x1C07
|
|
|
|
#define QUANTA_VENDOR_ID 0x0408
|
|
#define QUANTA_PRODUCT_Q101 0xEA02
|
|
@@ -586,6 +587,8 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff),
|
|
.driver_info = (kernel_ulong_t) &net_intf1_blacklist },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173S6, 0xff, 0xff, 0xff),
|
|
+ .driver_info = (kernel_ulong_t) &net_intf1_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1750, 0xff, 0xff, 0xff),
|
|
.driver_info = (kernel_ulong_t) &net_intf2_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1441, USB_CLASS_COMM, 0x02, 0xff) },
|
|
@@ -648,6 +651,10 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6D) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6E) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6F) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x72) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x73) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x74) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x75) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x78) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x79) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7A) },
|
|
@@ -702,6 +709,10 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6D) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6E) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6F) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x72) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x73) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x74) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x75) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x78) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x79) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) },
|
|
@@ -756,6 +767,10 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6D) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6E) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6F) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x72) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x73) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x74) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x75) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x78) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x79) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7A) },
|
|
@@ -810,6 +825,10 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6D) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6E) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6F) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x72) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x73) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x74) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x75) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x78) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x79) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7A) },
|
|
@@ -864,6 +883,10 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6D) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6E) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6F) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x72) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x73) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x74) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x75) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x78) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x79) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7A) },
|
|
@@ -918,6 +941,10 @@ static const struct usb_device_id option_ids[] = {
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6D) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6E) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6F) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x72) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x73) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x74) },
|
|
+ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x75) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) },
|
|
diff --git a/drivers/watchdog/sc1200wdt.c b/drivers/watchdog/sc1200wdt.c
|
|
index 3fb83b0c28c2..ab6d3f56cbca 100644
|
|
--- a/drivers/watchdog/sc1200wdt.c
|
|
+++ b/drivers/watchdog/sc1200wdt.c
|
|
@@ -409,8 +409,9 @@ static int __init sc1200wdt_init(void)
|
|
#if defined CONFIG_PNP
|
|
/* now that the user has specified an IO port and we haven't detected
|
|
* any devices, disable pnp support */
|
|
+ if (isapnp)
|
|
+ pnp_unregister_driver(&scl200wdt_pnp_driver);
|
|
isapnp = 0;
|
|
- pnp_unregister_driver(&scl200wdt_pnp_driver);
|
|
#endif
|
|
|
|
if (!request_region(io, io_len, SC1200_MODULE_NAME)) {
|
|
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c
|
|
index 89d2a5803ae3..5ecfffe25334 100644
|
|
--- a/fs/hpfs/file.c
|
|
+++ b/fs/hpfs/file.c
|
|
@@ -116,9 +116,12 @@ static int hpfs_write_begin(struct file *file, struct address_space *mapping,
|
|
hpfs_get_block,
|
|
&hpfs_i(mapping->host)->mmu_private);
|
|
if (unlikely(ret)) {
|
|
- loff_t isize = mapping->host->i_size;
|
|
+ loff_t isize;
|
|
+ hpfs_lock(mapping->host->i_sb);
|
|
+ isize = mapping->host->i_size;
|
|
if (pos + len > isize)
|
|
vmtruncate(mapping->host, isize);
|
|
+ hpfs_unlock(mapping->host->i_sb);
|
|
}
|
|
|
|
return ret;
|
|
diff --git a/fs/nfs/blocklayout/extents.c b/fs/nfs/blocklayout/extents.c
|
|
index 1f9a6032796b..51f9ff25d475 100644
|
|
--- a/fs/nfs/blocklayout/extents.c
|
|
+++ b/fs/nfs/blocklayout/extents.c
|
|
@@ -44,7 +44,7 @@
|
|
static inline sector_t normalize(sector_t s, int base)
|
|
{
|
|
sector_t tmp = s; /* Since do_div modifies its argument */
|
|
- return s - do_div(tmp, base);
|
|
+ return s - sector_div(tmp, base);
|
|
}
|
|
|
|
static inline sector_t normalize_up(sector_t s, int base)
|
|
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
|
|
index 91f8ff547ab3..6a6c1fdb7892 100644
|
|
--- a/fs/xfs/xfs_ioctl.c
|
|
+++ b/fs/xfs/xfs_ioctl.c
|
|
@@ -400,7 +400,8 @@ xfs_attrlist_by_handle(
|
|
return -XFS_ERROR(EPERM);
|
|
if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t)))
|
|
return -XFS_ERROR(EFAULT);
|
|
- if (al_hreq.buflen > XATTR_LIST_MAX)
|
|
+ if (al_hreq.buflen < sizeof(struct attrlist) ||
|
|
+ al_hreq.buflen > XATTR_LIST_MAX)
|
|
return -XFS_ERROR(EINVAL);
|
|
|
|
/*
|
|
diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c
|
|
index a849a5473aff..745ea4ea98ab 100644
|
|
--- a/fs/xfs/xfs_ioctl32.c
|
|
+++ b/fs/xfs/xfs_ioctl32.c
|
|
@@ -361,7 +361,8 @@ xfs_compat_attrlist_by_handle(
|
|
if (copy_from_user(&al_hreq, arg,
|
|
sizeof(compat_xfs_fsop_attrlist_handlereq_t)))
|
|
return -XFS_ERROR(EFAULT);
|
|
- if (al_hreq.buflen > XATTR_LIST_MAX)
|
|
+ if (al_hreq.buflen < sizeof(struct attrlist) ||
|
|
+ al_hreq.buflen > XATTR_LIST_MAX)
|
|
return -XFS_ERROR(EINVAL);
|
|
|
|
/*
|
|
diff --git a/include/sound/memalloc.h b/include/sound/memalloc.h
|
|
index c42506212649..ab240bb608a8 100644
|
|
--- a/include/sound/memalloc.h
|
|
+++ b/include/sound/memalloc.h
|
|
@@ -101,7 +101,7 @@ static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
|
|
static inline dma_addr_t snd_sgbuf_get_addr(struct snd_sg_buf *sgbuf, size_t offset)
|
|
{
|
|
dma_addr_t addr = sgbuf->table[offset >> PAGE_SHIFT].addr;
|
|
- addr &= PAGE_MASK;
|
|
+ addr &= ~((dma_addr_t)PAGE_SIZE - 1);
|
|
return addr + offset % PAGE_SIZE;
|
|
}
|
|
|
|
diff --git a/kernel/futex.c b/kernel/futex.c
|
|
index f0ee318df9c0..e564a9a3ea2a 100644
|
|
--- a/kernel/futex.c
|
|
+++ b/kernel/futex.c
|
|
@@ -285,7 +285,7 @@ again:
|
|
put_page(page);
|
|
/* serialize against __split_huge_page_splitting() */
|
|
local_irq_disable();
|
|
- if (likely(__get_user_pages_fast(address, 1, 1, &page) == 1)) {
|
|
+ if (likely(__get_user_pages_fast(address, 1, !ro, &page) == 1)) {
|
|
page_head = compound_head(page);
|
|
/*
|
|
* page_head is valid pointer but we must pin
|
|
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
|
index 19e784237f7a..7949b5d1663f 100644
|
|
--- a/net/ipv4/udp.c
|
|
+++ b/net/ipv4/udp.c
|
|
@@ -1042,9 +1042,6 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset,
|
|
if (flags & MSG_SENDPAGE_NOTLAST)
|
|
flags |= MSG_MORE;
|
|
|
|
- if (flags & MSG_SENDPAGE_NOTLAST)
|
|
- flags |= MSG_MORE;
|
|
-
|
|
if (!up->pending) {
|
|
struct msghdr msg = { .msg_flags = flags|MSG_MORE };
|
|
|
|
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
|
|
index 067aa2a23055..6937a84bef3a 100644
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -763,7 +763,8 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx)
|
|
u16 sc;
|
|
u8 tid, ack_policy;
|
|
|
|
- if (!ieee80211_is_data_qos(hdr->frame_control))
|
|
+ if (!ieee80211_is_data_qos(hdr->frame_control) ||
|
|
+ is_multicast_ether_addr(hdr->addr1))
|
|
goto dont_reorder;
|
|
|
|
/*
|
|
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
|
|
index 56262223190d..d32db4140aa0 100644
|
|
--- a/security/selinux/hooks.c
|
|
+++ b/security/selinux/hooks.c
|
|
@@ -52,6 +52,7 @@
|
|
#include <net/icmp.h>
|
|
#include <net/ip.h> /* for local_port_range[] */
|
|
#include <net/tcp.h> /* struct or_callable used in sock_rcv_skb */
|
|
+#include <net/inet_connection_sock.h>
|
|
#include <net/net_namespace.h>
|
|
#include <net/netlabel.h>
|
|
#include <linux/uaccess.h>
|
|
@@ -3733,6 +3734,30 @@ static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
|
|
return 0;
|
|
}
|
|
|
|
+/**
|
|
+ * selinux_conn_sid - Determine the child socket label for a connection
|
|
+ * @sk_sid: the parent socket's SID
|
|
+ * @skb_sid: the packet's SID
|
|
+ * @conn_sid: the resulting connection SID
|
|
+ *
|
|
+ * If @skb_sid is valid then the user:role:type information from @sk_sid is
|
|
+ * combined with the MLS information from @skb_sid in order to create
|
|
+ * @conn_sid. If @skb_sid is not valid then then @conn_sid is simply a copy
|
|
+ * of @sk_sid. Returns zero on success, negative values on failure.
|
|
+ *
|
|
+ */
|
|
+static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
|
|
+{
|
|
+ int err = 0;
|
|
+
|
|
+ if (skb_sid != SECSID_NULL)
|
|
+ err = security_sid_mls_copy(sk_sid, skb_sid, conn_sid);
|
|
+ else
|
|
+ *conn_sid = sk_sid;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
/* socket security operations */
|
|
|
|
static int socket_sockcreate_sid(const struct task_security_struct *tsec,
|
|
@@ -4354,7 +4379,7 @@ static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
|
|
struct sk_security_struct *sksec = sk->sk_security;
|
|
int err;
|
|
u16 family = sk->sk_family;
|
|
- u32 newsid;
|
|
+ u32 connsid;
|
|
u32 peersid;
|
|
|
|
/* handle mapped IPv4 packets arriving via IPv6 sockets */
|
|
@@ -4364,16 +4389,11 @@ static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
|
|
err = selinux_skb_peerlbl_sid(skb, family, &peersid);
|
|
if (err)
|
|
return err;
|
|
- if (peersid == SECSID_NULL) {
|
|
- req->secid = sksec->sid;
|
|
- req->peer_secid = SECSID_NULL;
|
|
- } else {
|
|
- err = security_sid_mls_copy(sksec->sid, peersid, &newsid);
|
|
- if (err)
|
|
- return err;
|
|
- req->secid = newsid;
|
|
- req->peer_secid = peersid;
|
|
- }
|
|
+ err = selinux_conn_sid(sksec->sid, peersid, &connsid);
|
|
+ if (err)
|
|
+ return err;
|
|
+ req->secid = connsid;
|
|
+ req->peer_secid = peersid;
|
|
|
|
return selinux_netlbl_inet_conn_request(req, family);
|
|
}
|
|
@@ -4605,6 +4625,7 @@ static unsigned int selinux_ipv6_forward(unsigned int hooknum,
|
|
static unsigned int selinux_ip_output(struct sk_buff *skb,
|
|
u16 family)
|
|
{
|
|
+ struct sock *sk;
|
|
u32 sid;
|
|
|
|
if (!netlbl_enabled())
|
|
@@ -4613,8 +4634,27 @@ static unsigned int selinux_ip_output(struct sk_buff *skb,
|
|
/* we do this in the LOCAL_OUT path and not the POST_ROUTING path
|
|
* because we want to make sure we apply the necessary labeling
|
|
* before IPsec is applied so we can leverage AH protection */
|
|
- if (skb->sk) {
|
|
- struct sk_security_struct *sksec = skb->sk->sk_security;
|
|
+ sk = skb->sk;
|
|
+ if (sk) {
|
|
+ struct sk_security_struct *sksec;
|
|
+
|
|
+ if (sk->sk_state == TCP_LISTEN)
|
|
+ /* if the socket is the listening state then this
|
|
+ * packet is a SYN-ACK packet which means it needs to
|
|
+ * be labeled based on the connection/request_sock and
|
|
+ * not the parent socket. unfortunately, we can't
|
|
+ * lookup the request_sock yet as it isn't queued on
|
|
+ * the parent socket until after the SYN-ACK is sent.
|
|
+ * the "solution" is to simply pass the packet as-is
|
|
+ * as any IP option based labeling should be copied
|
|
+ * from the initial connection request (in the IP
|
|
+ * layer). it is far from ideal, but until we get a
|
|
+ * security label in the packet itself this is the
|
|
+ * best we can do. */
|
|
+ return NF_ACCEPT;
|
|
+
|
|
+ /* standard practice, label using the parent socket */
|
|
+ sksec = sk->sk_security;
|
|
sid = sksec->sid;
|
|
} else
|
|
sid = SECINITSID_KERNEL;
|
|
@@ -4702,12 +4742,12 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
|
|
if (!secmark_active && !peerlbl_active)
|
|
return NF_ACCEPT;
|
|
|
|
- /* if the packet is being forwarded then get the peer label from the
|
|
- * packet itself; otherwise check to see if it is from a local
|
|
- * application or the kernel, if from an application get the peer label
|
|
- * from the sending socket, otherwise use the kernel's sid */
|
|
sk = skb->sk;
|
|
if (sk == NULL) {
|
|
+ /* Without an associated socket the packet is either coming
|
|
+ * from the kernel or it is being forwarded; check the packet
|
|
+ * to determine which and if the packet is being forwarded
|
|
+ * query the packet directly to determine the security label. */
|
|
if (skb->skb_iif) {
|
|
secmark_perm = PACKET__FORWARD_OUT;
|
|
if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
|
|
@@ -4716,7 +4756,26 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
|
|
secmark_perm = PACKET__SEND;
|
|
peer_sid = SECINITSID_KERNEL;
|
|
}
|
|
+ } else if (sk->sk_state == TCP_LISTEN) {
|
|
+ /* Locally generated packet but the associated socket is in the
|
|
+ * listening state which means this is a SYN-ACK packet. In
|
|
+ * this particular case the correct security label is assigned
|
|
+ * to the connection/request_sock but unfortunately we can't
|
|
+ * query the request_sock as it isn't queued on the parent
|
|
+ * socket until after the SYN-ACK packet is sent; the only
|
|
+ * viable choice is to regenerate the label like we do in
|
|
+ * selinux_inet_conn_request(). See also selinux_ip_output()
|
|
+ * for similar problems. */
|
|
+ u32 skb_sid;
|
|
+ struct sk_security_struct *sksec = sk->sk_security;
|
|
+ if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
|
|
+ return NF_DROP;
|
|
+ if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
|
|
+ return NF_DROP;
|
|
+ secmark_perm = PACKET__SEND;
|
|
} else {
|
|
+ /* Locally generated packet, fetch the security label from the
|
|
+ * associated socket. */
|
|
struct sk_security_struct *sksec = sk->sk_security;
|
|
peer_sid = sksec->sid;
|
|
secmark_perm = PACKET__SEND;
|
|
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
|
|
index 91a0a2f8cbc7..bc5ed1412382 100644
|
|
--- a/virt/kvm/kvm_main.c
|
|
+++ b/virt/kvm/kvm_main.c
|
|
@@ -1668,6 +1668,9 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
|
|
int r;
|
|
struct kvm_vcpu *vcpu, *v;
|
|
|
|
+ if (id >= KVM_MAX_VCPUS)
|
|
+ return -EINVAL;
|
|
+
|
|
vcpu = kvm_arch_vcpu_create(kvm, id);
|
|
if (IS_ERR(vcpu))
|
|
return PTR_ERR(vcpu);
|