Contents of /trunk/kernel-lts/patches-3.4/0115-3.4.16-all-fixes.patch
Parent Directory | Revision Log
Revision 1927 -
(show annotations)
(download)
Mon Oct 29 10:48:19 2012 UTC (11 years, 11 months ago) by niro
File size: 59894 byte(s)
Mon Oct 29 10:48:19 2012 UTC (11 years, 11 months ago) by niro
File size: 59894 byte(s)
-3.4.16-lts-r1
1 | diff --git a/arch/s390/boot/compressed/vmlinux.lds.S b/arch/s390/boot/compressed/vmlinux.lds.S |
2 | index d80f79d..8e1fb82 100644 |
3 | --- a/arch/s390/boot/compressed/vmlinux.lds.S |
4 | +++ b/arch/s390/boot/compressed/vmlinux.lds.S |
5 | @@ -5,7 +5,7 @@ OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") |
6 | OUTPUT_ARCH(s390:64-bit) |
7 | #else |
8 | OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390") |
9 | -OUTPUT_ARCH(s390) |
10 | +OUTPUT_ARCH(s390:31-bit) |
11 | #endif |
12 | |
13 | ENTRY(startup) |
14 | diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S |
15 | index 21109c6..1343d7c 100644 |
16 | --- a/arch/s390/kernel/vmlinux.lds.S |
17 | +++ b/arch/s390/kernel/vmlinux.lds.S |
18 | @@ -8,7 +8,7 @@ |
19 | |
20 | #ifndef CONFIG_64BIT |
21 | OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390") |
22 | -OUTPUT_ARCH(s390) |
23 | +OUTPUT_ARCH(s390:31-bit) |
24 | ENTRY(startup) |
25 | jiffies = jiffies_64 + 4; |
26 | #else |
27 | diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c |
28 | index 28559ce..602eca8 100644 |
29 | --- a/arch/sparc/kernel/perf_event.c |
30 | +++ b/arch/sparc/kernel/perf_event.c |
31 | @@ -557,11 +557,13 @@ static u64 nop_for_index(int idx) |
32 | |
33 | static inline void sparc_pmu_enable_event(struct cpu_hw_events *cpuc, struct hw_perf_event *hwc, int idx) |
34 | { |
35 | - u64 val, mask = mask_for_index(idx); |
36 | + u64 enc, val, mask = mask_for_index(idx); |
37 | + |
38 | + enc = perf_event_get_enc(cpuc->events[idx]); |
39 | |
40 | val = cpuc->pcr; |
41 | val &= ~mask; |
42 | - val |= hwc->config; |
43 | + val |= event_encoding(enc, idx); |
44 | cpuc->pcr = val; |
45 | |
46 | pcr_ops->write(cpuc->pcr); |
47 | @@ -1428,8 +1430,6 @@ static void perf_callchain_user_64(struct perf_callchain_entry *entry, |
48 | { |
49 | unsigned long ufp; |
50 | |
51 | - perf_callchain_store(entry, regs->tpc); |
52 | - |
53 | ufp = regs->u_regs[UREG_I6] + STACK_BIAS; |
54 | do { |
55 | struct sparc_stackf *usf, sf; |
56 | @@ -1450,8 +1450,6 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry, |
57 | { |
58 | unsigned long ufp; |
59 | |
60 | - perf_callchain_store(entry, regs->tpc); |
61 | - |
62 | ufp = regs->u_regs[UREG_I6] & 0xffffffffUL; |
63 | do { |
64 | struct sparc_stackf32 *usf, sf; |
65 | @@ -1470,6 +1468,11 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry, |
66 | void |
67 | perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) |
68 | { |
69 | + perf_callchain_store(entry, regs->tpc); |
70 | + |
71 | + if (!current->mm) |
72 | + return; |
73 | + |
74 | flushw_user(); |
75 | if (test_thread_flag(TIF_32BIT)) |
76 | perf_callchain_user_32(entry, regs); |
77 | diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c |
78 | index 3ee51f1..57b7cab 100644 |
79 | --- a/arch/sparc/kernel/sys_sparc_64.c |
80 | +++ b/arch/sparc/kernel/sys_sparc_64.c |
81 | @@ -519,12 +519,12 @@ SYSCALL_DEFINE1(sparc64_personality, unsigned long, personality) |
82 | { |
83 | int ret; |
84 | |
85 | - if (current->personality == PER_LINUX32 && |
86 | - personality == PER_LINUX) |
87 | - personality = PER_LINUX32; |
88 | + if (personality(current->personality) == PER_LINUX32 && |
89 | + personality(personality) == PER_LINUX) |
90 | + personality |= PER_LINUX32; |
91 | ret = sys_personality(personality); |
92 | - if (ret == PER_LINUX32) |
93 | - ret = PER_LINUX; |
94 | + if (personality(ret) == PER_LINUX32) |
95 | + ret &= ~PER_LINUX32; |
96 | |
97 | return ret; |
98 | } |
99 | diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S |
100 | index 1d7e274..7f5f65d 100644 |
101 | --- a/arch/sparc/kernel/syscalls.S |
102 | +++ b/arch/sparc/kernel/syscalls.S |
103 | @@ -212,24 +212,20 @@ linux_sparc_syscall: |
104 | 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] |
105 | ret_sys_call: |
106 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 |
107 | - ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc |
108 | sra %o0, 0, %o0 |
109 | mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2 |
110 | sllx %g2, 32, %g2 |
111 | |
112 | - /* Check if force_successful_syscall_return() |
113 | - * was invoked. |
114 | - */ |
115 | - ldub [%g6 + TI_SYS_NOERROR], %l2 |
116 | - brnz,a,pn %l2, 80f |
117 | - stb %g0, [%g6 + TI_SYS_NOERROR] |
118 | - |
119 | cmp %o0, -ERESTART_RESTARTBLOCK |
120 | bgeu,pn %xcc, 1f |
121 | - andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6 |
122 | -80: |
123 | + andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 |
124 | + ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc |
125 | + |
126 | +2: |
127 | + stb %g0, [%g6 + TI_SYS_NOERROR] |
128 | /* System call success, clear Carry condition code. */ |
129 | andn %g3, %g2, %g3 |
130 | +3: |
131 | stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE] |
132 | bne,pn %icc, linux_syscall_trace2 |
133 | add %l1, 0x4, %l2 ! npc = npc+4 |
134 | @@ -238,20 +234,20 @@ ret_sys_call: |
135 | stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] |
136 | |
137 | 1: |
138 | + /* Check if force_successful_syscall_return() |
139 | + * was invoked. |
140 | + */ |
141 | + ldub [%g6 + TI_SYS_NOERROR], %l2 |
142 | + brnz,pn %l2, 2b |
143 | + ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc |
144 | /* System call failure, set Carry condition code. |
145 | * Also, get abs(errno) to return to the process. |
146 | */ |
147 | - andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6 |
148 | sub %g0, %o0, %o0 |
149 | - or %g3, %g2, %g3 |
150 | stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] |
151 | - stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE] |
152 | - bne,pn %icc, linux_syscall_trace2 |
153 | - add %l1, 0x4, %l2 ! npc = npc+4 |
154 | - stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC] |
155 | + ba,pt %xcc, 3b |
156 | + or %g3, %g2, %g3 |
157 | |
158 | - b,pt %xcc, rtrap |
159 | - stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] |
160 | linux_syscall_trace2: |
161 | call syscall_trace_leave |
162 | add %sp, PTREGS_OFF, %o0 |
163 | diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c |
164 | index 21faaee..0791618 100644 |
165 | --- a/arch/sparc/mm/init_64.c |
166 | +++ b/arch/sparc/mm/init_64.c |
167 | @@ -2099,6 +2099,9 @@ EXPORT_SYMBOL(_PAGE_CACHE); |
168 | #ifdef CONFIG_SPARSEMEM_VMEMMAP |
169 | unsigned long vmemmap_table[VMEMMAP_SIZE]; |
170 | |
171 | +static long __meminitdata addr_start, addr_end; |
172 | +static int __meminitdata node_start; |
173 | + |
174 | int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node) |
175 | { |
176 | unsigned long vstart = (unsigned long) start; |
177 | @@ -2129,15 +2132,30 @@ int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node) |
178 | |
179 | *vmem_pp = pte_base | __pa(block); |
180 | |
181 | - printk(KERN_INFO "[%p-%p] page_structs=%lu " |
182 | - "node=%d entry=%lu/%lu\n", start, block, nr, |
183 | - node, |
184 | - addr >> VMEMMAP_CHUNK_SHIFT, |
185 | - VMEMMAP_SIZE); |
186 | + /* check to see if we have contiguous blocks */ |
187 | + if (addr_end != addr || node_start != node) { |
188 | + if (addr_start) |
189 | + printk(KERN_DEBUG " [%lx-%lx] on node %d\n", |
190 | + addr_start, addr_end-1, node_start); |
191 | + addr_start = addr; |
192 | + node_start = node; |
193 | + } |
194 | + addr_end = addr + VMEMMAP_CHUNK; |
195 | } |
196 | } |
197 | return 0; |
198 | } |
199 | + |
200 | +void __meminit vmemmap_populate_print_last(void) |
201 | +{ |
202 | + if (addr_start) { |
203 | + printk(KERN_DEBUG " [%lx-%lx] on node %d\n", |
204 | + addr_start, addr_end-1, node_start); |
205 | + addr_start = 0; |
206 | + addr_end = 0; |
207 | + node_start = 0; |
208 | + } |
209 | +} |
210 | #endif /* CONFIG_SPARSEMEM_VMEMMAP */ |
211 | |
212 | static void prot_init_common(unsigned long page_none, |
213 | diff --git a/arch/tile/Makefile b/arch/tile/Makefile |
214 | index 9520bc5..99f461d 100644 |
215 | --- a/arch/tile/Makefile |
216 | +++ b/arch/tile/Makefile |
217 | @@ -26,6 +26,10 @@ $(error Set TILERA_ROOT or CROSS_COMPILE when building $(ARCH) on $(HOST_ARCH)) |
218 | endif |
219 | endif |
220 | |
221 | +# The tile compiler may emit .eh_frame information for backtracing. |
222 | +# In kernel modules, this causes load failures due to unsupported relocations. |
223 | +KBUILD_CFLAGS += -fno-asynchronous-unwind-tables |
224 | + |
225 | ifneq ($(CONFIG_DEBUG_EXTRA_FLAGS),"") |
226 | KBUILD_CFLAGS += $(CONFIG_DEBUG_EXTRA_FLAGS) |
227 | endif |
228 | diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S |
229 | index 7b784f4..6d4f7ba 100644 |
230 | --- a/arch/x86/kernel/entry_32.S |
231 | +++ b/arch/x86/kernel/entry_32.S |
232 | @@ -1025,7 +1025,7 @@ ENTRY(xen_sysenter_target) |
233 | |
234 | ENTRY(xen_hypervisor_callback) |
235 | CFI_STARTPROC |
236 | - pushl_cfi $0 |
237 | + pushl_cfi $-1 /* orig_ax = -1 => not a system call */ |
238 | SAVE_ALL |
239 | TRACE_IRQS_OFF |
240 | |
241 | @@ -1067,14 +1067,16 @@ ENTRY(xen_failsafe_callback) |
242 | 2: mov 8(%esp),%es |
243 | 3: mov 12(%esp),%fs |
244 | 4: mov 16(%esp),%gs |
245 | + /* EAX == 0 => Category 1 (Bad segment) |
246 | + EAX != 0 => Category 2 (Bad IRET) */ |
247 | testl %eax,%eax |
248 | popl_cfi %eax |
249 | lea 16(%esp),%esp |
250 | CFI_ADJUST_CFA_OFFSET -16 |
251 | jz 5f |
252 | addl $16,%esp |
253 | - jmp iret_exc # EAX != 0 => Category 2 (Bad IRET) |
254 | -5: pushl_cfi $0 # EAX == 0 => Category 1 (Bad segment) |
255 | + jmp iret_exc |
256 | +5: pushl_cfi $-1 /* orig_ax = -1 => not a system call */ |
257 | SAVE_ALL |
258 | jmp ret_from_exception |
259 | CFI_ENDPROC |
260 | diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S |
261 | index cdc79b5..bd6f592 100644 |
262 | --- a/arch/x86/kernel/entry_64.S |
263 | +++ b/arch/x86/kernel/entry_64.S |
264 | @@ -1351,7 +1351,7 @@ ENTRY(xen_failsafe_callback) |
265 | CFI_RESTORE r11 |
266 | addq $0x30,%rsp |
267 | CFI_ADJUST_CFA_OFFSET -0x30 |
268 | - pushq_cfi $0 |
269 | + pushq_cfi $-1 /* orig_ax = -1 => not a system call */ |
270 | SAVE_ALL |
271 | jmp error_exit |
272 | CFI_ENDPROC |
273 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c |
274 | index 1a29015..fbbd1eb 100644 |
275 | --- a/arch/x86/kernel/setup.c |
276 | +++ b/arch/x86/kernel/setup.c |
277 | @@ -927,8 +927,21 @@ void __init setup_arch(char **cmdline_p) |
278 | |
279 | #ifdef CONFIG_X86_64 |
280 | if (max_pfn > max_low_pfn) { |
281 | - max_pfn_mapped = init_memory_mapping(1UL<<32, |
282 | - max_pfn<<PAGE_SHIFT); |
283 | + int i; |
284 | + for (i = 0; i < e820.nr_map; i++) { |
285 | + struct e820entry *ei = &e820.map[i]; |
286 | + |
287 | + if (ei->addr + ei->size <= 1UL << 32) |
288 | + continue; |
289 | + |
290 | + if (ei->type == E820_RESERVED) |
291 | + continue; |
292 | + |
293 | + max_pfn_mapped = init_memory_mapping( |
294 | + ei->addr < 1UL << 32 ? 1UL << 32 : ei->addr, |
295 | + ei->addr + ei->size); |
296 | + } |
297 | + |
298 | /* can we preseve max_low_pfn ?*/ |
299 | max_low_pfn = max_pfn; |
300 | } |
301 | diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c |
302 | index 26b8a85..48768df 100644 |
303 | --- a/arch/x86/oprofile/nmi_int.c |
304 | +++ b/arch/x86/oprofile/nmi_int.c |
305 | @@ -55,7 +55,7 @@ u64 op_x86_get_ctrl(struct op_x86_model_spec const *model, |
306 | val |= counter_config->extra; |
307 | event &= model->event_mask ? model->event_mask : 0xFF; |
308 | val |= event & 0xFF; |
309 | - val |= (event & 0x0F00) << 24; |
310 | + val |= (u64)(event & 0x0F00) << 24; |
311 | |
312 | return val; |
313 | } |
314 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c |
315 | index 7ef73c9..a8bfe1c 100644 |
316 | --- a/drivers/edac/amd64_edac.c |
317 | +++ b/drivers/edac/amd64_edac.c |
318 | @@ -170,8 +170,11 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate) |
319 | * memory controller and apply to register. Search for the first |
320 | * bandwidth entry that is greater or equal than the setting requested |
321 | * and program that. If at last entry, turn off DRAM scrubbing. |
322 | + * |
323 | + * If no suitable bandwidth is found, turn off DRAM scrubbing entirely |
324 | + * by falling back to the last element in scrubrates[]. |
325 | */ |
326 | - for (i = 0; i < ARRAY_SIZE(scrubrates); i++) { |
327 | + for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) { |
328 | /* |
329 | * skip scrub rates which aren't recommended |
330 | * (see F10 BKDG, F3x58) |
331 | @@ -181,12 +184,6 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate) |
332 | |
333 | if (scrubrates[i].bandwidth <= new_bw) |
334 | break; |
335 | - |
336 | - /* |
337 | - * if no suitable bandwidth found, turn off DRAM scrubbing |
338 | - * entirely by falling back to the last element in the |
339 | - * scrubrates array. |
340 | - */ |
341 | } |
342 | |
343 | scrubval = scrubrates[i].scrubval; |
344 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c |
345 | index e3e470f..67432e2 100644 |
346 | --- a/drivers/infiniband/core/cma.c |
347 | +++ b/drivers/infiniband/core/cma.c |
348 | @@ -3451,7 +3451,8 @@ out: |
349 | } |
350 | |
351 | static const struct ibnl_client_cbs cma_cb_table[] = { |
352 | - [RDMA_NL_RDMA_CM_ID_STATS] = { .dump = cma_get_id_stats }, |
353 | + [RDMA_NL_RDMA_CM_ID_STATS] = { .dump = cma_get_id_stats, |
354 | + .module = THIS_MODULE }, |
355 | }; |
356 | |
357 | static int __init cma_init(void) |
358 | diff --git a/drivers/infiniband/core/netlink.c b/drivers/infiniband/core/netlink.c |
359 | index 396e293..8c3b08a 100644 |
360 | --- a/drivers/infiniband/core/netlink.c |
361 | +++ b/drivers/infiniband/core/netlink.c |
362 | @@ -151,6 +151,7 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
363 | { |
364 | struct netlink_dump_control c = { |
365 | .dump = client->cb_table[op].dump, |
366 | + .module = client->cb_table[op].module, |
367 | }; |
368 | return netlink_dump_start(nls, skb, nlh, &c); |
369 | } |
370 | diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c |
371 | index 17ef6c4..035f28e 100644 |
372 | --- a/drivers/iommu/tegra-smmu.c |
373 | +++ b/drivers/iommu/tegra-smmu.c |
374 | @@ -148,7 +148,7 @@ |
375 | |
376 | #define SMMU_ADDR_TO_PFN(addr) ((addr) >> 12) |
377 | #define SMMU_ADDR_TO_PDN(addr) ((addr) >> 22) |
378 | -#define SMMU_PDN_TO_ADDR(addr) ((pdn) << 22) |
379 | +#define SMMU_PDN_TO_ADDR(pdn) ((pdn) << 22) |
380 | |
381 | #define _READABLE (1 << SMMU_PTB_DATA_ASID_READABLE_SHIFT) |
382 | #define _WRITABLE (1 << SMMU_PTB_DATA_ASID_WRITABLE_SHIFT) |
383 | diff --git a/drivers/media/video/au0828/au0828-video.c b/drivers/media/video/au0828/au0828-video.c |
384 | index 0b3e481..eab0641 100644 |
385 | --- a/drivers/media/video/au0828/au0828-video.c |
386 | +++ b/drivers/media/video/au0828/au0828-video.c |
387 | @@ -1692,14 +1692,18 @@ static int vidioc_streamoff(struct file *file, void *priv, |
388 | (AUVI_INPUT(i).audio_setup)(dev, 0); |
389 | } |
390 | |
391 | - videobuf_streamoff(&fh->vb_vidq); |
392 | - res_free(fh, AU0828_RESOURCE_VIDEO); |
393 | + if (res_check(fh, AU0828_RESOURCE_VIDEO)) { |
394 | + videobuf_streamoff(&fh->vb_vidq); |
395 | + res_free(fh, AU0828_RESOURCE_VIDEO); |
396 | + } |
397 | } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) { |
398 | dev->vbi_timeout_running = 0; |
399 | del_timer_sync(&dev->vbi_timeout); |
400 | |
401 | - videobuf_streamoff(&fh->vb_vbiq); |
402 | - res_free(fh, AU0828_RESOURCE_VBI); |
403 | + if (res_check(fh, AU0828_RESOURCE_VBI)) { |
404 | + videobuf_streamoff(&fh->vb_vbiq); |
405 | + res_free(fh, AU0828_RESOURCE_VBI); |
406 | + } |
407 | } |
408 | |
409 | return 0; |
410 | diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c |
411 | index 47b19c0..eb9f5fb 100644 |
412 | --- a/drivers/mtd/nand/nand_base.c |
413 | +++ b/drivers/mtd/nand/nand_base.c |
414 | @@ -2897,9 +2897,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, |
415 | if (le16_to_cpu(p->features) & 1) |
416 | *busw = NAND_BUSWIDTH_16; |
417 | |
418 | - chip->options &= ~NAND_CHIPOPTIONS_MSK; |
419 | - chip->options |= (NAND_NO_READRDY | |
420 | - NAND_NO_AUTOINCR) & NAND_CHIPOPTIONS_MSK; |
421 | + chip->options |= NAND_NO_READRDY | NAND_NO_AUTOINCR; |
422 | |
423 | pr_info("ONFI flash detected\n"); |
424 | return 1; |
425 | @@ -3064,9 +3062,8 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, |
426 | mtd->erasesize <<= ((id_data[3] & 0x03) << 1); |
427 | } |
428 | } |
429 | - /* Get chip options, preserve non chip based options */ |
430 | - chip->options &= ~NAND_CHIPOPTIONS_MSK; |
431 | - chip->options |= type->options & NAND_CHIPOPTIONS_MSK; |
432 | + /* Get chip options */ |
433 | + chip->options |= type->options; |
434 | |
435 | /* |
436 | * Check if chip is not a Samsung device. Do not clear the |
437 | diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c |
438 | index 5a30bf8..f4be8f7 100644 |
439 | --- a/drivers/net/ethernet/marvell/skge.c |
440 | +++ b/drivers/net/ethernet/marvell/skge.c |
441 | @@ -4153,6 +4153,13 @@ static struct dmi_system_id skge_32bit_dma_boards[] = { |
442 | DMI_MATCH(DMI_BOARD_NAME, "nForce"), |
443 | }, |
444 | }, |
445 | + { |
446 | + .ident = "ASUS P5NSLI", |
447 | + .matches = { |
448 | + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), |
449 | + DMI_MATCH(DMI_BOARD_NAME, "P5NSLI") |
450 | + }, |
451 | + }, |
452 | {} |
453 | }; |
454 | |
455 | diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c |
456 | index b066273..7dd879c 100644 |
457 | --- a/drivers/pcmcia/pxa2xx_sharpsl.c |
458 | +++ b/drivers/pcmcia/pxa2xx_sharpsl.c |
459 | @@ -194,7 +194,7 @@ static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) |
460 | sharpsl_pcmcia_init_reset(skt); |
461 | } |
462 | |
463 | -static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = { |
464 | +static struct pcmcia_low_level sharpsl_pcmcia_ops = { |
465 | .owner = THIS_MODULE, |
466 | .hw_init = sharpsl_pcmcia_hw_init, |
467 | .socket_state = sharpsl_pcmcia_socket_state, |
468 | diff --git a/drivers/pinctrl/pinctrl-tegra.c b/drivers/pinctrl/pinctrl-tegra.c |
469 | index 9b32968..2a32a2f 100644 |
470 | --- a/drivers/pinctrl/pinctrl-tegra.c |
471 | +++ b/drivers/pinctrl/pinctrl-tegra.c |
472 | @@ -259,7 +259,7 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx, |
473 | *bank = g->drv_bank; |
474 | *reg = g->drv_reg; |
475 | *bit = g->lpmd_bit; |
476 | - *width = 1; |
477 | + *width = 2; |
478 | break; |
479 | case TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH: |
480 | *bank = g->drv_bank; |
481 | diff --git a/drivers/pinctrl/pinctrl-tegra30.c b/drivers/pinctrl/pinctrl-tegra30.c |
482 | index 4d7571d..636d96c 100644 |
483 | --- a/drivers/pinctrl/pinctrl-tegra30.c |
484 | +++ b/drivers/pinctrl/pinctrl-tegra30.c |
485 | @@ -3343,10 +3343,10 @@ static const struct tegra_function tegra30_functions[] = { |
486 | FUNCTION(vi_alt3), |
487 | }; |
488 | |
489 | -#define MUXCTL_REG_A 0x3000 |
490 | -#define PINGROUP_REG_A 0x868 |
491 | +#define DRV_PINGROUP_REG_A 0x868 /* bank 0 */ |
492 | +#define PINGROUP_REG_A 0x3000 /* bank 1 */ |
493 | |
494 | -#define PINGROUP_REG_Y(r) ((r) - MUXCTL_REG_A) |
495 | +#define PINGROUP_REG_Y(r) ((r) - PINGROUP_REG_A) |
496 | #define PINGROUP_REG_N(r) -1 |
497 | |
498 | #define PINGROUP(pg_name, f0, f1, f2, f3, f_safe, r, od, ior) \ |
499 | @@ -3362,25 +3362,25 @@ static const struct tegra_function tegra30_functions[] = { |
500 | }, \ |
501 | .func_safe = TEGRA_MUX_ ## f_safe, \ |
502 | .mux_reg = PINGROUP_REG_Y(r), \ |
503 | - .mux_bank = 0, \ |
504 | + .mux_bank = 1, \ |
505 | .mux_bit = 0, \ |
506 | .pupd_reg = PINGROUP_REG_Y(r), \ |
507 | - .pupd_bank = 0, \ |
508 | + .pupd_bank = 1, \ |
509 | .pupd_bit = 2, \ |
510 | .tri_reg = PINGROUP_REG_Y(r), \ |
511 | - .tri_bank = 0, \ |
512 | + .tri_bank = 1, \ |
513 | .tri_bit = 4, \ |
514 | .einput_reg = PINGROUP_REG_Y(r), \ |
515 | - .einput_bank = 0, \ |
516 | + .einput_bank = 1, \ |
517 | .einput_bit = 5, \ |
518 | .odrain_reg = PINGROUP_REG_##od(r), \ |
519 | - .odrain_bank = 0, \ |
520 | + .odrain_bank = 1, \ |
521 | .odrain_bit = 6, \ |
522 | .lock_reg = PINGROUP_REG_Y(r), \ |
523 | - .lock_bank = 0, \ |
524 | + .lock_bank = 1, \ |
525 | .lock_bit = 7, \ |
526 | .ioreset_reg = PINGROUP_REG_##ior(r), \ |
527 | - .ioreset_bank = 0, \ |
528 | + .ioreset_bank = 1, \ |
529 | .ioreset_bit = 8, \ |
530 | .drv_reg = -1, \ |
531 | } |
532 | @@ -3399,8 +3399,8 @@ static const struct tegra_function tegra30_functions[] = { |
533 | .odrain_reg = -1, \ |
534 | .lock_reg = -1, \ |
535 | .ioreset_reg = -1, \ |
536 | - .drv_reg = ((r) - PINGROUP_REG_A), \ |
537 | - .drv_bank = 1, \ |
538 | + .drv_reg = ((r) - DRV_PINGROUP_REG_A), \ |
539 | + .drv_bank = 0, \ |
540 | .hsm_bit = hsm_b, \ |
541 | .schmitt_bit = schmitt_b, \ |
542 | .lpmd_bit = lpmd_b, \ |
543 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
544 | index 7f2fac1..c5f7eae 100644 |
545 | --- a/drivers/usb/class/cdc-acm.c |
546 | +++ b/drivers/usb/class/cdc-acm.c |
547 | @@ -818,10 +818,6 @@ static const __u32 acm_tty_speed[] = { |
548 | 2500000, 3000000, 3500000, 4000000 |
549 | }; |
550 | |
551 | -static const __u8 acm_tty_size[] = { |
552 | - 5, 6, 7, 8 |
553 | -}; |
554 | - |
555 | static void acm_tty_set_termios(struct tty_struct *tty, |
556 | struct ktermios *termios_old) |
557 | { |
558 | @@ -835,7 +831,21 @@ static void acm_tty_set_termios(struct tty_struct *tty, |
559 | newline.bParityType = termios->c_cflag & PARENB ? |
560 | (termios->c_cflag & PARODD ? 1 : 2) + |
561 | (termios->c_cflag & CMSPAR ? 2 : 0) : 0; |
562 | - newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4]; |
563 | + switch (termios->c_cflag & CSIZE) { |
564 | + case CS5: |
565 | + newline.bDataBits = 5; |
566 | + break; |
567 | + case CS6: |
568 | + newline.bDataBits = 6; |
569 | + break; |
570 | + case CS7: |
571 | + newline.bDataBits = 7; |
572 | + break; |
573 | + case CS8: |
574 | + default: |
575 | + newline.bDataBits = 8; |
576 | + break; |
577 | + } |
578 | /* FIXME: Needs to clear unsupported bits in the termios */ |
579 | acm->clocal = ((termios->c_cflag & CLOCAL) != 0); |
580 | |
581 | @@ -1234,7 +1244,7 @@ made_compressed_probe: |
582 | |
583 | if (usb_endpoint_xfer_int(epwrite)) |
584 | usb_fill_int_urb(snd->urb, usb_dev, |
585 | - usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), |
586 | + usb_sndintpipe(usb_dev, epwrite->bEndpointAddress), |
587 | NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval); |
588 | else |
589 | usb_fill_bulk_urb(snd->urb, usb_dev, |
590 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
591 | index b8d4697..cee0c3e 100644 |
592 | --- a/drivers/usb/dwc3/gadget.c |
593 | +++ b/drivers/usb/dwc3/gadget.c |
594 | @@ -1777,6 +1777,7 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum) |
595 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); |
596 | WARN_ON_ONCE(ret); |
597 | dep->res_trans_idx = 0; |
598 | + dep->flags &= ~DWC3_EP_BUSY; |
599 | } |
600 | } |
601 | |
602 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
603 | index f756231..e52ddfe 100644 |
604 | --- a/drivers/usb/host/xhci.c |
605 | +++ b/drivers/usb/host/xhci.c |
606 | @@ -479,7 +479,8 @@ static bool compliance_mode_recovery_timer_quirk_check(void) |
607 | |
608 | if (strstr(dmi_product_name, "Z420") || |
609 | strstr(dmi_product_name, "Z620") || |
610 | - strstr(dmi_product_name, "Z820")) |
611 | + strstr(dmi_product_name, "Z820") || |
612 | + strstr(dmi_product_name, "Z1")) |
613 | return true; |
614 | |
615 | return false; |
616 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
617 | index 57de734..17ec21e 100644 |
618 | --- a/drivers/usb/serial/option.c |
619 | +++ b/drivers/usb/serial/option.c |
620 | @@ -503,11 +503,19 @@ static const struct option_blacklist_info net_intf5_blacklist = { |
621 | .reserved = BIT(5), |
622 | }; |
623 | |
624 | +static const struct option_blacklist_info net_intf6_blacklist = { |
625 | + .reserved = BIT(6), |
626 | +}; |
627 | + |
628 | static const struct option_blacklist_info zte_mf626_blacklist = { |
629 | .sendsetup = BIT(0) | BIT(1), |
630 | .reserved = BIT(4), |
631 | }; |
632 | |
633 | +static const struct option_blacklist_info zte_1255_blacklist = { |
634 | + .reserved = BIT(3) | BIT(4), |
635 | +}; |
636 | + |
637 | static const struct usb_device_id option_ids[] = { |
638 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
639 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
640 | @@ -853,13 +861,19 @@ static const struct usb_device_id option_ids[] = { |
641 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff), |
642 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
643 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) }, |
644 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff) }, |
645 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff) }, |
646 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff), |
647 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
648 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff), |
649 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
650 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0122, 0xff, 0xff, 0xff) }, |
651 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff) }, |
652 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff) }, |
653 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff) }, |
654 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff) }, |
655 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff), |
656 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
657 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff), |
658 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
659 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff), |
660 | + .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, |
661 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff), |
662 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
663 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, |
664 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, |
665 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, |
666 | @@ -872,7 +886,8 @@ static const struct usb_device_id option_ids[] = { |
667 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, |
668 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff), |
669 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
670 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, |
671 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff), |
672 | + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
673 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, |
674 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, |
675 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, |
676 | @@ -880,13 +895,22 @@ static const struct usb_device_id option_ids[] = { |
677 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
678 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), |
679 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
680 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */ |
681 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
682 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */ |
683 | + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
684 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ |
685 | + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
686 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), |
687 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
688 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), |
689 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
690 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), |
691 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
692 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, |
693 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), |
694 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
695 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff), |
696 | + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
697 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, |
698 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, |
699 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, |
700 | @@ -1002,18 +1026,24 @@ static const struct usb_device_id option_ids[] = { |
701 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1169, 0xff, 0xff, 0xff) }, |
702 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1170, 0xff, 0xff, 0xff) }, |
703 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1244, 0xff, 0xff, 0xff) }, |
704 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff) }, |
705 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff), |
706 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
707 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1246, 0xff, 0xff, 0xff) }, |
708 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff) }, |
709 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff), |
710 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
711 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1248, 0xff, 0xff, 0xff) }, |
712 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1249, 0xff, 0xff, 0xff) }, |
713 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1250, 0xff, 0xff, 0xff) }, |
714 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1251, 0xff, 0xff, 0xff) }, |
715 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff) }, |
716 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff), |
717 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
718 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1253, 0xff, 0xff, 0xff) }, |
719 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff) }, |
720 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff) }, |
721 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff) }, |
722 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff), |
723 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
724 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff), |
725 | + .driver_info = (kernel_ulong_t)&zte_1255_blacklist }, |
726 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff), |
727 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
728 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1257, 0xff, 0xff, 0xff) }, |
729 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1258, 0xff, 0xff, 0xff) }, |
730 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1259, 0xff, 0xff, 0xff) }, |
731 | @@ -1058,8 +1088,16 @@ static const struct usb_device_id option_ids[] = { |
732 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, |
733 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, |
734 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, |
735 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff), |
736 | + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
737 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), |
738 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
739 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1424, 0xff, 0xff, 0xff), |
740 | + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
741 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1425, 0xff, 0xff, 0xff), |
742 | + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
743 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */ |
744 | + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
745 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, |
746 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, |
747 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, |
748 | @@ -1071,15 +1109,21 @@ static const struct usb_device_id option_ids[] = { |
749 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, |
750 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, |
751 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, |
752 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, |
753 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff) }, |
754 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, |
755 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff), |
756 | + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
757 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff), |
758 | + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
759 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff), |
760 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
761 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) }, |
762 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, |
763 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff) }, |
764 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff), |
765 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
766 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) }, |
767 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff) }, |
768 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff) }, |
769 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff), |
770 | + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
771 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), |
772 | + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
773 | |
774 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
775 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, |
776 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c |
777 | index 8b384cc..c215985 100644 |
778 | --- a/fs/ext4/extents.c |
779 | +++ b/fs/ext4/extents.c |
780 | @@ -52,6 +52,9 @@ |
781 | #define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */ |
782 | #define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */ |
783 | |
784 | +#define EXT4_EXT_DATA_VALID1 0x8 /* first half contains valid data */ |
785 | +#define EXT4_EXT_DATA_VALID2 0x10 /* second half contains valid data */ |
786 | + |
787 | static int ext4_split_extent(handle_t *handle, |
788 | struct inode *inode, |
789 | struct ext4_ext_path *path, |
790 | @@ -2829,6 +2832,9 @@ static int ext4_split_extent_at(handle_t *handle, |
791 | unsigned int ee_len, depth; |
792 | int err = 0; |
793 | |
794 | + BUG_ON((split_flag & (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2)) == |
795 | + (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2)); |
796 | + |
797 | ext_debug("ext4_split_extents_at: inode %lu, logical" |
798 | "block %llu\n", inode->i_ino, (unsigned long long)split); |
799 | |
800 | @@ -2887,7 +2893,14 @@ static int ext4_split_extent_at(handle_t *handle, |
801 | |
802 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); |
803 | if (err == -ENOSPC && (EXT4_EXT_MAY_ZEROOUT & split_flag)) { |
804 | - err = ext4_ext_zeroout(inode, &orig_ex); |
805 | + if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) { |
806 | + if (split_flag & EXT4_EXT_DATA_VALID1) |
807 | + err = ext4_ext_zeroout(inode, ex2); |
808 | + else |
809 | + err = ext4_ext_zeroout(inode, ex); |
810 | + } else |
811 | + err = ext4_ext_zeroout(inode, &orig_ex); |
812 | + |
813 | if (err) |
814 | goto fix_extent_len; |
815 | /* update the extent length and mark as initialized */ |
816 | @@ -2940,12 +2953,13 @@ static int ext4_split_extent(handle_t *handle, |
817 | uninitialized = ext4_ext_is_uninitialized(ex); |
818 | |
819 | if (map->m_lblk + map->m_len < ee_block + ee_len) { |
820 | - split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT ? |
821 | - EXT4_EXT_MAY_ZEROOUT : 0; |
822 | + split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT; |
823 | flags1 = flags | EXT4_GET_BLOCKS_PRE_IO; |
824 | if (uninitialized) |
825 | split_flag1 |= EXT4_EXT_MARK_UNINIT1 | |
826 | EXT4_EXT_MARK_UNINIT2; |
827 | + if (split_flag & EXT4_EXT_DATA_VALID2) |
828 | + split_flag1 |= EXT4_EXT_DATA_VALID1; |
829 | err = ext4_split_extent_at(handle, inode, path, |
830 | map->m_lblk + map->m_len, split_flag1, flags1); |
831 | if (err) |
832 | @@ -2958,8 +2972,8 @@ static int ext4_split_extent(handle_t *handle, |
833 | return PTR_ERR(path); |
834 | |
835 | if (map->m_lblk >= ee_block) { |
836 | - split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT ? |
837 | - EXT4_EXT_MAY_ZEROOUT : 0; |
838 | + split_flag1 = split_flag & (EXT4_EXT_MAY_ZEROOUT | |
839 | + EXT4_EXT_DATA_VALID2); |
840 | if (uninitialized) |
841 | split_flag1 |= EXT4_EXT_MARK_UNINIT1; |
842 | if (split_flag & EXT4_EXT_MARK_UNINIT2) |
843 | @@ -3237,26 +3251,47 @@ static int ext4_split_unwritten_extents(handle_t *handle, |
844 | |
845 | split_flag |= ee_block + ee_len <= eof_block ? EXT4_EXT_MAY_ZEROOUT : 0; |
846 | split_flag |= EXT4_EXT_MARK_UNINIT2; |
847 | - |
848 | + if (flags & EXT4_GET_BLOCKS_CONVERT) |
849 | + split_flag |= EXT4_EXT_DATA_VALID2; |
850 | flags |= EXT4_GET_BLOCKS_PRE_IO; |
851 | return ext4_split_extent(handle, inode, path, map, split_flag, flags); |
852 | } |
853 | |
854 | static int ext4_convert_unwritten_extents_endio(handle_t *handle, |
855 | - struct inode *inode, |
856 | - struct ext4_ext_path *path) |
857 | + struct inode *inode, |
858 | + struct ext4_map_blocks *map, |
859 | + struct ext4_ext_path *path) |
860 | { |
861 | struct ext4_extent *ex; |
862 | + ext4_lblk_t ee_block; |
863 | + unsigned int ee_len; |
864 | int depth; |
865 | int err = 0; |
866 | |
867 | depth = ext_depth(inode); |
868 | ex = path[depth].p_ext; |
869 | + ee_block = le32_to_cpu(ex->ee_block); |
870 | + ee_len = ext4_ext_get_actual_len(ex); |
871 | |
872 | ext_debug("ext4_convert_unwritten_extents_endio: inode %lu, logical" |
873 | "block %llu, max_blocks %u\n", inode->i_ino, |
874 | - (unsigned long long)le32_to_cpu(ex->ee_block), |
875 | - ext4_ext_get_actual_len(ex)); |
876 | + (unsigned long long)ee_block, ee_len); |
877 | + |
878 | + /* If extent is larger than requested then split is required */ |
879 | + if (ee_block != map->m_lblk || ee_len > map->m_len) { |
880 | + err = ext4_split_unwritten_extents(handle, inode, map, path, |
881 | + EXT4_GET_BLOCKS_CONVERT); |
882 | + if (err < 0) |
883 | + goto out; |
884 | + ext4_ext_drop_refs(path); |
885 | + path = ext4_ext_find_extent(inode, map->m_lblk, path); |
886 | + if (IS_ERR(path)) { |
887 | + err = PTR_ERR(path); |
888 | + goto out; |
889 | + } |
890 | + depth = ext_depth(inode); |
891 | + ex = path[depth].p_ext; |
892 | + } |
893 | |
894 | err = ext4_ext_get_access(handle, inode, path + depth); |
895 | if (err) |
896 | @@ -3564,7 +3599,7 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, |
897 | } |
898 | /* IO end_io complete, convert the filled extent to written */ |
899 | if ((flags & EXT4_GET_BLOCKS_CONVERT)) { |
900 | - ret = ext4_convert_unwritten_extents_endio(handle, inode, |
901 | + ret = ext4_convert_unwritten_extents_endio(handle, inode, map, |
902 | path); |
903 | if (ret >= 0) { |
904 | ext4_update_inode_fsync_trans(handle, inode, 1); |
905 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c |
906 | index 6b0a57e..e77c4fe 100644 |
907 | --- a/fs/ext4/mballoc.c |
908 | +++ b/fs/ext4/mballoc.c |
909 | @@ -4984,8 +4984,9 @@ int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range) |
910 | end = start + (range->len >> sb->s_blocksize_bits) - 1; |
911 | minlen = range->minlen >> sb->s_blocksize_bits; |
912 | |
913 | - if (unlikely(minlen > EXT4_CLUSTERS_PER_GROUP(sb)) || |
914 | - unlikely(start >= max_blks)) |
915 | + if (minlen > EXT4_CLUSTERS_PER_GROUP(sb) || |
916 | + start >= max_blks || |
917 | + range->len < sb->s_blocksize) |
918 | return -EINVAL; |
919 | if (end >= max_blks) |
920 | end = max_blks - 1; |
921 | diff --git a/fs/lockd/clntxdr.c b/fs/lockd/clntxdr.c |
922 | index d269ada..982d267 100644 |
923 | --- a/fs/lockd/clntxdr.c |
924 | +++ b/fs/lockd/clntxdr.c |
925 | @@ -223,7 +223,7 @@ static void encode_nlm_stat(struct xdr_stream *xdr, |
926 | { |
927 | __be32 *p; |
928 | |
929 | - BUG_ON(be32_to_cpu(stat) > NLM_LCK_DENIED_GRACE_PERIOD); |
930 | + WARN_ON_ONCE(be32_to_cpu(stat) > NLM_LCK_DENIED_GRACE_PERIOD); |
931 | p = xdr_reserve_space(xdr, 4); |
932 | *p = stat; |
933 | } |
934 | diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c |
935 | index d27aab1..d413af3 100644 |
936 | --- a/fs/lockd/svcproc.c |
937 | +++ b/fs/lockd/svcproc.c |
938 | @@ -67,7 +67,8 @@ nlmsvc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp, |
939 | |
940 | /* Obtain file pointer. Not used by FREE_ALL call. */ |
941 | if (filp != NULL) { |
942 | - if ((error = nlm_lookup_file(rqstp, &file, &lock->fh)) != 0) |
943 | + error = cast_status(nlm_lookup_file(rqstp, &file, &lock->fh)); |
944 | + if (error != 0) |
945 | goto no_locks; |
946 | *filp = file; |
947 | |
948 | diff --git a/fs/proc/stat.c b/fs/proc/stat.c |
949 | index 64c3b31..e296572 100644 |
950 | --- a/fs/proc/stat.c |
951 | +++ b/fs/proc/stat.c |
952 | @@ -45,10 +45,13 @@ static cputime64_t get_iowait_time(int cpu) |
953 | |
954 | static u64 get_idle_time(int cpu) |
955 | { |
956 | - u64 idle, idle_time = get_cpu_idle_time_us(cpu, NULL); |
957 | + u64 idle, idle_time = -1ULL; |
958 | + |
959 | + if (cpu_online(cpu)) |
960 | + idle_time = get_cpu_idle_time_us(cpu, NULL); |
961 | |
962 | if (idle_time == -1ULL) |
963 | - /* !NO_HZ so we can rely on cpustat.idle */ |
964 | + /* !NO_HZ or cpu offline so we can rely on cpustat.idle */ |
965 | idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; |
966 | else |
967 | idle = usecs_to_cputime64(idle_time); |
968 | @@ -58,10 +61,13 @@ static u64 get_idle_time(int cpu) |
969 | |
970 | static u64 get_iowait_time(int cpu) |
971 | { |
972 | - u64 iowait, iowait_time = get_cpu_iowait_time_us(cpu, NULL); |
973 | + u64 iowait, iowait_time = -1ULL; |
974 | + |
975 | + if (cpu_online(cpu)) |
976 | + iowait_time = get_cpu_iowait_time_us(cpu, NULL); |
977 | |
978 | if (iowait_time == -1ULL) |
979 | - /* !NO_HZ so we can rely on cpustat.iowait */ |
980 | + /* !NO_HZ or cpu offline so we can rely on cpustat.iowait */ |
981 | iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; |
982 | else |
983 | iowait = usecs_to_cputime64(iowait_time); |
984 | diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h |
985 | index a810987..561e130 100644 |
986 | --- a/include/linux/if_vlan.h |
987 | +++ b/include/linux/if_vlan.h |
988 | @@ -82,6 +82,8 @@ static inline int is_vlan_dev(struct net_device *dev) |
989 | } |
990 | |
991 | #define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT) |
992 | +#define vlan_tx_nonzero_tag_present(__skb) \ |
993 | + (vlan_tx_tag_present(__skb) && ((__skb)->vlan_tci & VLAN_VID_MASK)) |
994 | #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) |
995 | |
996 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
997 | @@ -91,7 +93,7 @@ extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev, |
998 | extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); |
999 | extern u16 vlan_dev_vlan_id(const struct net_device *dev); |
1000 | |
1001 | -extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler); |
1002 | +extern bool vlan_do_receive(struct sk_buff **skb); |
1003 | extern struct sk_buff *vlan_untag(struct sk_buff *skb); |
1004 | |
1005 | extern int vlan_vid_add(struct net_device *dev, unsigned short vid); |
1006 | @@ -120,10 +122,8 @@ static inline u16 vlan_dev_vlan_id(const struct net_device *dev) |
1007 | return 0; |
1008 | } |
1009 | |
1010 | -static inline bool vlan_do_receive(struct sk_buff **skb, bool last_handler) |
1011 | +static inline bool vlan_do_receive(struct sk_buff **skb) |
1012 | { |
1013 | - if (((*skb)->vlan_tci & VLAN_VID_MASK) && last_handler) |
1014 | - (*skb)->pkt_type = PACKET_OTHERHOST; |
1015 | return false; |
1016 | } |
1017 | |
1018 | diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h |
1019 | index 1482340..2483513 100644 |
1020 | --- a/include/linux/mtd/nand.h |
1021 | +++ b/include/linux/mtd/nand.h |
1022 | @@ -215,9 +215,6 @@ typedef enum { |
1023 | #define NAND_SUBPAGE_READ(chip) ((chip->ecc.mode == NAND_ECC_SOFT) \ |
1024 | && (chip->page_shift > 9)) |
1025 | |
1026 | -/* Mask to zero out the chip options, which come from the id table */ |
1027 | -#define NAND_CHIPOPTIONS_MSK (0x0000ffff & ~NAND_NO_AUTOINCR) |
1028 | - |
1029 | /* Non chip related options */ |
1030 | /* This option skips the bbt scan during initialization. */ |
1031 | #define NAND_SKIP_BBTSCAN 0x00010000 |
1032 | diff --git a/include/linux/netlink.h b/include/linux/netlink.h |
1033 | index a2092f5..b23e9cd 100644 |
1034 | --- a/include/linux/netlink.h |
1035 | +++ b/include/linux/netlink.h |
1036 | @@ -153,6 +153,7 @@ struct nlattr { |
1037 | |
1038 | #include <linux/capability.h> |
1039 | #include <linux/skbuff.h> |
1040 | +#include <linux/export.h> |
1041 | |
1042 | struct net; |
1043 | |
1044 | @@ -226,6 +227,8 @@ struct netlink_callback { |
1045 | struct netlink_callback *cb); |
1046 | int (*done)(struct netlink_callback *cb); |
1047 | void *data; |
1048 | + /* the module that dump function belong to */ |
1049 | + struct module *module; |
1050 | u16 family; |
1051 | u16 min_dump_alloc; |
1052 | unsigned int prev_seq, seq; |
1053 | @@ -251,14 +254,24 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags) |
1054 | |
1055 | struct netlink_dump_control { |
1056 | int (*dump)(struct sk_buff *skb, struct netlink_callback *); |
1057 | - int (*done)(struct netlink_callback*); |
1058 | + int (*done)(struct netlink_callback *); |
1059 | void *data; |
1060 | + struct module *module; |
1061 | u16 min_dump_alloc; |
1062 | }; |
1063 | |
1064 | -extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1065 | - const struct nlmsghdr *nlh, |
1066 | - struct netlink_dump_control *control); |
1067 | +extern int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1068 | + const struct nlmsghdr *nlh, |
1069 | + struct netlink_dump_control *control); |
1070 | +static inline int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1071 | + const struct nlmsghdr *nlh, |
1072 | + struct netlink_dump_control *control) |
1073 | +{ |
1074 | + if (!control->module) |
1075 | + control->module = THIS_MODULE; |
1076 | + |
1077 | + return __netlink_dump_start(ssk, skb, nlh, control); |
1078 | +} |
1079 | |
1080 | |
1081 | #define NL_NONROOT_RECV 0x1 |
1082 | diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h |
1083 | index 77d278d..005b507 100644 |
1084 | --- a/include/linux/sunrpc/xprt.h |
1085 | +++ b/include/linux/sunrpc/xprt.h |
1086 | @@ -114,6 +114,7 @@ struct rpc_xprt_ops { |
1087 | void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); |
1088 | int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); |
1089 | void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); |
1090 | + void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task); |
1091 | void (*rpcbind)(struct rpc_task *task); |
1092 | void (*set_port)(struct rpc_xprt *xprt, unsigned short port); |
1093 | void (*connect)(struct rpc_task *task); |
1094 | @@ -279,6 +280,8 @@ void xprt_connect(struct rpc_task *task); |
1095 | void xprt_reserve(struct rpc_task *task); |
1096 | int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); |
1097 | int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); |
1098 | +void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); |
1099 | +void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); |
1100 | int xprt_prepare_transmit(struct rpc_task *task); |
1101 | void xprt_transmit(struct rpc_task *task); |
1102 | void xprt_end_transmit(struct rpc_task *task); |
1103 | diff --git a/include/rdma/rdma_netlink.h b/include/rdma/rdma_netlink.h |
1104 | index 3c5363a..bd3d8b2 100644 |
1105 | --- a/include/rdma/rdma_netlink.h |
1106 | +++ b/include/rdma/rdma_netlink.h |
1107 | @@ -39,6 +39,7 @@ struct rdma_cm_id_stats { |
1108 | |
1109 | struct ibnl_client_cbs { |
1110 | int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb); |
1111 | + struct module *module; |
1112 | }; |
1113 | |
1114 | int ibnl_init(void); |
1115 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c |
1116 | index ed64cca..762f7cc7 100644 |
1117 | --- a/kernel/cgroup.c |
1118 | +++ b/kernel/cgroup.c |
1119 | @@ -1868,9 +1868,8 @@ static void cgroup_task_migrate(struct cgroup *cgrp, struct cgroup *oldcgrp, |
1120 | * trading it for newcg is protected by cgroup_mutex, we're safe to drop |
1121 | * it here; it will be freed under RCU. |
1122 | */ |
1123 | - put_css_set(oldcg); |
1124 | - |
1125 | set_bit(CGRP_RELEASABLE, &oldcgrp->flags); |
1126 | + put_css_set(oldcg); |
1127 | } |
1128 | |
1129 | /** |
1130 | @@ -4463,31 +4462,20 @@ static const struct file_operations proc_cgroupstats_operations = { |
1131 | * |
1132 | * A pointer to the shared css_set was automatically copied in |
1133 | * fork.c by dup_task_struct(). However, we ignore that copy, since |
1134 | - * it was not made under the protection of RCU, cgroup_mutex or |
1135 | - * threadgroup_change_begin(), so it might no longer be a valid |
1136 | - * cgroup pointer. cgroup_attach_task() might have already changed |
1137 | - * current->cgroups, allowing the previously referenced cgroup |
1138 | - * group to be removed and freed. |
1139 | - * |
1140 | - * Outside the pointer validity we also need to process the css_set |
1141 | - * inheritance between threadgoup_change_begin() and |
1142 | - * threadgoup_change_end(), this way there is no leak in any process |
1143 | - * wide migration performed by cgroup_attach_proc() that could otherwise |
1144 | - * miss a thread because it is too early or too late in the fork stage. |
1145 | + * it was not made under the protection of RCU or cgroup_mutex, so |
1146 | + * might no longer be a valid cgroup pointer. cgroup_attach_task() might |
1147 | + * have already changed current->cgroups, allowing the previously |
1148 | + * referenced cgroup group to be removed and freed. |
1149 | * |
1150 | * At the point that cgroup_fork() is called, 'current' is the parent |
1151 | * task, and the passed argument 'child' points to the child task. |
1152 | */ |
1153 | void cgroup_fork(struct task_struct *child) |
1154 | { |
1155 | - /* |
1156 | - * We don't need to task_lock() current because current->cgroups |
1157 | - * can't be changed concurrently here. The parent obviously hasn't |
1158 | - * exited and called cgroup_exit(), and we are synchronized against |
1159 | - * cgroup migration through threadgroup_change_begin(). |
1160 | - */ |
1161 | + task_lock(current); |
1162 | child->cgroups = current->cgroups; |
1163 | get_css_set(child->cgroups); |
1164 | + task_unlock(current); |
1165 | INIT_LIST_HEAD(&child->cg_list); |
1166 | } |
1167 | |
1168 | @@ -4540,19 +4528,10 @@ void cgroup_post_fork(struct task_struct *child) |
1169 | */ |
1170 | if (use_task_css_set_links) { |
1171 | write_lock(&css_set_lock); |
1172 | - if (list_empty(&child->cg_list)) { |
1173 | - /* |
1174 | - * It's safe to use child->cgroups without task_lock() |
1175 | - * here because we are protected through |
1176 | - * threadgroup_change_begin() against concurrent |
1177 | - * css_set change in cgroup_task_migrate(). Also |
1178 | - * the task can't exit at that point until |
1179 | - * wake_up_new_task() is called, so we are protected |
1180 | - * against cgroup_exit() setting child->cgroup to |
1181 | - * init_css_set. |
1182 | - */ |
1183 | + task_lock(child); |
1184 | + if (list_empty(&child->cg_list)) |
1185 | list_add(&child->cg_list, &child->cgroups->tasks); |
1186 | - } |
1187 | + task_unlock(child); |
1188 | write_unlock(&css_set_lock); |
1189 | } |
1190 | } |
1191 | diff --git a/kernel/sys.c b/kernel/sys.c |
1192 | index 898a84c..b0003db 100644 |
1193 | --- a/kernel/sys.c |
1194 | +++ b/kernel/sys.c |
1195 | @@ -1180,15 +1180,16 @@ DECLARE_RWSEM(uts_sem); |
1196 | * Work around broken programs that cannot handle "Linux 3.0". |
1197 | * Instead we map 3.x to 2.6.40+x, so e.g. 3.0 would be 2.6.40 |
1198 | */ |
1199 | -static int override_release(char __user *release, int len) |
1200 | +static int override_release(char __user *release, size_t len) |
1201 | { |
1202 | int ret = 0; |
1203 | - char buf[65]; |
1204 | |
1205 | if (current->personality & UNAME26) { |
1206 | - char *rest = UTS_RELEASE; |
1207 | + const char *rest = UTS_RELEASE; |
1208 | + char buf[65] = { 0 }; |
1209 | int ndots = 0; |
1210 | unsigned v; |
1211 | + size_t copy; |
1212 | |
1213 | while (*rest) { |
1214 | if (*rest == '.' && ++ndots >= 3) |
1215 | @@ -1198,8 +1199,9 @@ static int override_release(char __user *release, int len) |
1216 | rest++; |
1217 | } |
1218 | v = ((LINUX_VERSION_CODE >> 8) & 0xff) + 40; |
1219 | - snprintf(buf, len, "2.6.%u%s", v, rest); |
1220 | - ret = copy_to_user(release, buf, len); |
1221 | + copy = clamp_t(size_t, len, 1, sizeof(buf)); |
1222 | + copy = scnprintf(buf, copy, "2.6.%u%s", v, rest); |
1223 | + ret = copy_to_user(release, buf, copy + 1); |
1224 | } |
1225 | return ret; |
1226 | } |
1227 | diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c |
1228 | index f364630..912613c 100644 |
1229 | --- a/net/8021q/vlan_core.c |
1230 | +++ b/net/8021q/vlan_core.c |
1231 | @@ -5,7 +5,7 @@ |
1232 | #include <linux/export.h> |
1233 | #include "vlan.h" |
1234 | |
1235 | -bool vlan_do_receive(struct sk_buff **skbp, bool last_handler) |
1236 | +bool vlan_do_receive(struct sk_buff **skbp) |
1237 | { |
1238 | struct sk_buff *skb = *skbp; |
1239 | u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK; |
1240 | @@ -13,14 +13,8 @@ bool vlan_do_receive(struct sk_buff **skbp, bool last_handler) |
1241 | struct vlan_pcpu_stats *rx_stats; |
1242 | |
1243 | vlan_dev = vlan_find_dev(skb->dev, vlan_id); |
1244 | - if (!vlan_dev) { |
1245 | - /* Only the last call to vlan_do_receive() should change |
1246 | - * pkt_type to PACKET_OTHERHOST |
1247 | - */ |
1248 | - if (vlan_id && last_handler) |
1249 | - skb->pkt_type = PACKET_OTHERHOST; |
1250 | + if (!vlan_dev) |
1251 | return false; |
1252 | - } |
1253 | |
1254 | skb = *skbp = skb_share_check(skb, GFP_ATOMIC); |
1255 | if (unlikely(!skb)) |
1256 | diff --git a/net/core/dev.c b/net/core/dev.c |
1257 | index 086bc2e..82ca51b 100644 |
1258 | --- a/net/core/dev.c |
1259 | +++ b/net/core/dev.c |
1260 | @@ -3209,18 +3209,18 @@ another_round: |
1261 | ncls: |
1262 | #endif |
1263 | |
1264 | - rx_handler = rcu_dereference(skb->dev->rx_handler); |
1265 | if (vlan_tx_tag_present(skb)) { |
1266 | if (pt_prev) { |
1267 | ret = deliver_skb(skb, pt_prev, orig_dev); |
1268 | pt_prev = NULL; |
1269 | } |
1270 | - if (vlan_do_receive(&skb, !rx_handler)) |
1271 | + if (vlan_do_receive(&skb)) |
1272 | goto another_round; |
1273 | else if (unlikely(!skb)) |
1274 | goto out; |
1275 | } |
1276 | |
1277 | + rx_handler = rcu_dereference(skb->dev->rx_handler); |
1278 | if (rx_handler) { |
1279 | if (pt_prev) { |
1280 | ret = deliver_skb(skb, pt_prev, orig_dev); |
1281 | @@ -3240,6 +3240,9 @@ ncls: |
1282 | } |
1283 | } |
1284 | |
1285 | + if (vlan_tx_nonzero_tag_present(skb)) |
1286 | + skb->pkt_type = PACKET_OTHERHOST; |
1287 | + |
1288 | /* deliver only exact match when indicated */ |
1289 | null_or_dev = deliver_exact ? skb->dev : NULL; |
1290 | |
1291 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c |
1292 | index 73b9035..ac88107 100644 |
1293 | --- a/net/core/neighbour.c |
1294 | +++ b/net/core/neighbour.c |
1295 | @@ -1285,8 +1285,6 @@ int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb) |
1296 | if (!dst) |
1297 | goto discard; |
1298 | |
1299 | - __skb_pull(skb, skb_network_offset(skb)); |
1300 | - |
1301 | if (!neigh_event_send(neigh, skb)) { |
1302 | int err; |
1303 | struct net_device *dev = neigh->dev; |
1304 | @@ -1296,6 +1294,7 @@ int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb) |
1305 | neigh_hh_init(neigh, dst); |
1306 | |
1307 | do { |
1308 | + __skb_pull(skb, skb_network_offset(skb)); |
1309 | seq = read_seqbegin(&neigh->ha_lock); |
1310 | err = dev_hard_header(skb, dev, ntohs(skb->protocol), |
1311 | neigh->ha, NULL, skb->len); |
1312 | @@ -1326,9 +1325,8 @@ int neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb) |
1313 | unsigned int seq; |
1314 | int err; |
1315 | |
1316 | - __skb_pull(skb, skb_network_offset(skb)); |
1317 | - |
1318 | do { |
1319 | + __skb_pull(skb, skb_network_offset(skb)); |
1320 | seq = read_seqbegin(&neigh->ha_lock); |
1321 | err = dev_hard_header(skb, dev, ntohs(skb->protocol), |
1322 | neigh->ha, NULL, skb->len); |
1323 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c |
1324 | index 0cb86ce..8f2458d 100644 |
1325 | --- a/net/ipv4/tcp_ipv4.c |
1326 | +++ b/net/ipv4/tcp_ipv4.c |
1327 | @@ -678,10 +678,11 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) |
1328 | arg.csumoffset = offsetof(struct tcphdr, check) / 2; |
1329 | arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0; |
1330 | /* When socket is gone, all binding information is lost. |
1331 | - * routing might fail in this case. using iif for oif to |
1332 | - * make sure we can deliver it |
1333 | + * routing might fail in this case. No choice here, if we choose to force |
1334 | + * input interface, we will misroute in case of asymmetric route. |
1335 | */ |
1336 | - arg.bound_dev_if = sk ? sk->sk_bound_dev_if : inet_iif(skb); |
1337 | + if (sk) |
1338 | + arg.bound_dev_if = sk->sk_bound_dev_if; |
1339 | |
1340 | net = dev_net(skb_dst(skb)->dev); |
1341 | arg.tos = ip_hdr(skb)->tos; |
1342 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c |
1343 | index 5ec6069..468a5ce 100644 |
1344 | --- a/net/ipv6/addrconf.c |
1345 | +++ b/net/ipv6/addrconf.c |
1346 | @@ -3095,14 +3095,15 @@ static struct inet6_ifaddr *if6_get_first(struct seq_file *seq, loff_t pos) |
1347 | struct hlist_node *n; |
1348 | hlist_for_each_entry_rcu_bh(ifa, n, &inet6_addr_lst[state->bucket], |
1349 | addr_lst) { |
1350 | + if (!net_eq(dev_net(ifa->idev->dev), net)) |
1351 | + continue; |
1352 | /* sync with offset */ |
1353 | if (p < state->offset) { |
1354 | p++; |
1355 | continue; |
1356 | } |
1357 | state->offset++; |
1358 | - if (net_eq(dev_net(ifa->idev->dev), net)) |
1359 | - return ifa; |
1360 | + return ifa; |
1361 | } |
1362 | |
1363 | /* prepare for next bucket */ |
1364 | @@ -3120,18 +3121,20 @@ static struct inet6_ifaddr *if6_get_next(struct seq_file *seq, |
1365 | struct hlist_node *n = &ifa->addr_lst; |
1366 | |
1367 | hlist_for_each_entry_continue_rcu_bh(ifa, n, addr_lst) { |
1368 | + if (!net_eq(dev_net(ifa->idev->dev), net)) |
1369 | + continue; |
1370 | state->offset++; |
1371 | - if (net_eq(dev_net(ifa->idev->dev), net)) |
1372 | - return ifa; |
1373 | + return ifa; |
1374 | } |
1375 | |
1376 | while (++state->bucket < IN6_ADDR_HSIZE) { |
1377 | state->offset = 0; |
1378 | hlist_for_each_entry_rcu_bh(ifa, n, |
1379 | &inet6_addr_lst[state->bucket], addr_lst) { |
1380 | + if (!net_eq(dev_net(ifa->idev->dev), net)) |
1381 | + continue; |
1382 | state->offset++; |
1383 | - if (net_eq(dev_net(ifa->idev->dev), net)) |
1384 | - return ifa; |
1385 | + return ifa; |
1386 | } |
1387 | } |
1388 | |
1389 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c |
1390 | index 98256cf..8a8fa2d 100644 |
1391 | --- a/net/ipv6/tcp_ipv6.c |
1392 | +++ b/net/ipv6/tcp_ipv6.c |
1393 | @@ -896,7 +896,8 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, |
1394 | __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr); |
1395 | |
1396 | fl6.flowi6_proto = IPPROTO_TCP; |
1397 | - fl6.flowi6_oif = inet6_iif(skb); |
1398 | + if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) |
1399 | + fl6.flowi6_oif = inet6_iif(skb); |
1400 | fl6.fl6_dport = t1->dest; |
1401 | fl6.fl6_sport = t1->source; |
1402 | security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); |
1403 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c |
1404 | index bba6ba1..edce424 100644 |
1405 | --- a/net/netlink/af_netlink.c |
1406 | +++ b/net/netlink/af_netlink.c |
1407 | @@ -156,6 +156,8 @@ static void netlink_sock_destruct(struct sock *sk) |
1408 | if (nlk->cb) { |
1409 | if (nlk->cb->done) |
1410 | nlk->cb->done(nlk->cb); |
1411 | + |
1412 | + module_put(nlk->cb->module); |
1413 | netlink_destroy_callback(nlk->cb); |
1414 | } |
1415 | |
1416 | @@ -1728,6 +1730,7 @@ static int netlink_dump(struct sock *sk) |
1417 | nlk->cb = NULL; |
1418 | mutex_unlock(nlk->cb_mutex); |
1419 | |
1420 | + module_put(cb->module); |
1421 | netlink_destroy_callback(cb); |
1422 | return 0; |
1423 | |
1424 | @@ -1737,9 +1740,9 @@ errout_skb: |
1425 | return err; |
1426 | } |
1427 | |
1428 | -int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1429 | - const struct nlmsghdr *nlh, |
1430 | - struct netlink_dump_control *control) |
1431 | +int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1432 | + const struct nlmsghdr *nlh, |
1433 | + struct netlink_dump_control *control) |
1434 | { |
1435 | struct netlink_callback *cb; |
1436 | struct sock *sk; |
1437 | @@ -1754,6 +1757,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1438 | cb->done = control->done; |
1439 | cb->nlh = nlh; |
1440 | cb->data = control->data; |
1441 | + cb->module = control->module; |
1442 | cb->min_dump_alloc = control->min_dump_alloc; |
1443 | atomic_inc(&skb->users); |
1444 | cb->skb = skb; |
1445 | @@ -1764,19 +1768,28 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1446 | return -ECONNREFUSED; |
1447 | } |
1448 | nlk = nlk_sk(sk); |
1449 | - /* A dump is in progress... */ |
1450 | + |
1451 | mutex_lock(nlk->cb_mutex); |
1452 | + /* A dump is in progress... */ |
1453 | if (nlk->cb) { |
1454 | mutex_unlock(nlk->cb_mutex); |
1455 | netlink_destroy_callback(cb); |
1456 | - sock_put(sk); |
1457 | - return -EBUSY; |
1458 | + ret = -EBUSY; |
1459 | + goto out; |
1460 | } |
1461 | + /* add reference of module which cb->dump belongs to */ |
1462 | + if (!try_module_get(cb->module)) { |
1463 | + mutex_unlock(nlk->cb_mutex); |
1464 | + netlink_destroy_callback(cb); |
1465 | + ret = -EPROTONOSUPPORT; |
1466 | + goto out; |
1467 | + } |
1468 | + |
1469 | nlk->cb = cb; |
1470 | mutex_unlock(nlk->cb_mutex); |
1471 | |
1472 | ret = netlink_dump(sk); |
1473 | - |
1474 | +out: |
1475 | sock_put(sk); |
1476 | |
1477 | if (ret) |
1478 | @@ -1787,7 +1800,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
1479 | */ |
1480 | return -EINTR; |
1481 | } |
1482 | -EXPORT_SYMBOL(netlink_dump_start); |
1483 | +EXPORT_SYMBOL(__netlink_dump_start); |
1484 | |
1485 | void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err) |
1486 | { |
1487 | diff --git a/net/rds/send.c b/net/rds/send.c |
1488 | index 96531d4..88eace5 100644 |
1489 | --- a/net/rds/send.c |
1490 | +++ b/net/rds/send.c |
1491 | @@ -1122,7 +1122,7 @@ rds_send_pong(struct rds_connection *conn, __be16 dport) |
1492 | rds_stats_inc(s_send_pong); |
1493 | |
1494 | if (!test_bit(RDS_LL_SEND_FULL, &conn->c_flags)) |
1495 | - rds_send_xmit(conn); |
1496 | + queue_delayed_work(rds_wq, &conn->c_send_w, 0); |
1497 | |
1498 | rds_message_put(rm); |
1499 | return 0; |
1500 | diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c |
1501 | index de0b0f3..76cb304 100644 |
1502 | --- a/net/sunrpc/cache.c |
1503 | +++ b/net/sunrpc/cache.c |
1504 | @@ -1406,11 +1406,11 @@ static ssize_t read_flush(struct file *file, char __user *buf, |
1505 | size_t count, loff_t *ppos, |
1506 | struct cache_detail *cd) |
1507 | { |
1508 | - char tbuf[20]; |
1509 | + char tbuf[22]; |
1510 | unsigned long p = *ppos; |
1511 | size_t len; |
1512 | |
1513 | - sprintf(tbuf, "%lu\n", convert_to_wallclock(cd->flush_time)); |
1514 | + snprintf(tbuf, sizeof(tbuf), "%lu\n", convert_to_wallclock(cd->flush_time)); |
1515 | len = strlen(tbuf); |
1516 | if (p >= len) |
1517 | return 0; |
1518 | diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c |
1519 | index da72492..176a24f 100644 |
1520 | --- a/net/sunrpc/xprt.c |
1521 | +++ b/net/sunrpc/xprt.c |
1522 | @@ -969,11 +969,11 @@ static bool xprt_dynamic_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) |
1523 | return false; |
1524 | } |
1525 | |
1526 | -static void xprt_alloc_slot(struct rpc_task *task) |
1527 | +void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) |
1528 | { |
1529 | - struct rpc_xprt *xprt = task->tk_xprt; |
1530 | struct rpc_rqst *req; |
1531 | |
1532 | + spin_lock(&xprt->reserve_lock); |
1533 | if (!list_empty(&xprt->free)) { |
1534 | req = list_entry(xprt->free.next, struct rpc_rqst, rq_list); |
1535 | list_del(&req->rq_list); |
1536 | @@ -994,12 +994,29 @@ static void xprt_alloc_slot(struct rpc_task *task) |
1537 | default: |
1538 | task->tk_status = -EAGAIN; |
1539 | } |
1540 | + spin_unlock(&xprt->reserve_lock); |
1541 | return; |
1542 | out_init_req: |
1543 | task->tk_status = 0; |
1544 | task->tk_rqstp = req; |
1545 | xprt_request_init(task, xprt); |
1546 | + spin_unlock(&xprt->reserve_lock); |
1547 | +} |
1548 | +EXPORT_SYMBOL_GPL(xprt_alloc_slot); |
1549 | + |
1550 | +void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) |
1551 | +{ |
1552 | + /* Note: grabbing the xprt_lock_write() ensures that we throttle |
1553 | + * new slot allocation if the transport is congested (i.e. when |
1554 | + * reconnecting a stream transport or when out of socket write |
1555 | + * buffer space). |
1556 | + */ |
1557 | + if (xprt_lock_write(xprt, task)) { |
1558 | + xprt_alloc_slot(xprt, task); |
1559 | + xprt_release_write(xprt, task); |
1560 | + } |
1561 | } |
1562 | +EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot); |
1563 | |
1564 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) |
1565 | { |
1566 | @@ -1083,20 +1100,9 @@ void xprt_reserve(struct rpc_task *task) |
1567 | if (task->tk_rqstp != NULL) |
1568 | return; |
1569 | |
1570 | - /* Note: grabbing the xprt_lock_write() here is not strictly needed, |
1571 | - * but ensures that we throttle new slot allocation if the transport |
1572 | - * is congested (e.g. if reconnecting or if we're out of socket |
1573 | - * write buffer space). |
1574 | - */ |
1575 | task->tk_timeout = 0; |
1576 | task->tk_status = -EAGAIN; |
1577 | - if (!xprt_lock_write(xprt, task)) |
1578 | - return; |
1579 | - |
1580 | - spin_lock(&xprt->reserve_lock); |
1581 | - xprt_alloc_slot(task); |
1582 | - spin_unlock(&xprt->reserve_lock); |
1583 | - xprt_release_write(xprt, task); |
1584 | + xprt->ops->alloc_slot(xprt, task); |
1585 | } |
1586 | |
1587 | static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) |
1588 | diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c |
1589 | index 06cdbff..5d9202d 100644 |
1590 | --- a/net/sunrpc/xprtrdma/transport.c |
1591 | +++ b/net/sunrpc/xprtrdma/transport.c |
1592 | @@ -713,6 +713,7 @@ static void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq) |
1593 | static struct rpc_xprt_ops xprt_rdma_procs = { |
1594 | .reserve_xprt = xprt_rdma_reserve_xprt, |
1595 | .release_xprt = xprt_release_xprt_cong, /* sunrpc/xprt.c */ |
1596 | + .alloc_slot = xprt_alloc_slot, |
1597 | .release_request = xprt_release_rqst_cong, /* ditto */ |
1598 | .set_retrans_timeout = xprt_set_retrans_timeout_def, /* ditto */ |
1599 | .rpcbind = rpcb_getport_async, /* sunrpc/rpcb_clnt.c */ |
1600 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
1601 | index 00ff343..a4a6586 100644 |
1602 | --- a/net/sunrpc/xprtsock.c |
1603 | +++ b/net/sunrpc/xprtsock.c |
1604 | @@ -2444,6 +2444,7 @@ static void bc_destroy(struct rpc_xprt *xprt) |
1605 | static struct rpc_xprt_ops xs_local_ops = { |
1606 | .reserve_xprt = xprt_reserve_xprt, |
1607 | .release_xprt = xs_tcp_release_xprt, |
1608 | + .alloc_slot = xprt_alloc_slot, |
1609 | .rpcbind = xs_local_rpcbind, |
1610 | .set_port = xs_local_set_port, |
1611 | .connect = xs_connect, |
1612 | @@ -2460,6 +2461,7 @@ static struct rpc_xprt_ops xs_udp_ops = { |
1613 | .set_buffer_size = xs_udp_set_buffer_size, |
1614 | .reserve_xprt = xprt_reserve_xprt_cong, |
1615 | .release_xprt = xprt_release_xprt_cong, |
1616 | + .alloc_slot = xprt_alloc_slot, |
1617 | .rpcbind = rpcb_getport_async, |
1618 | .set_port = xs_set_port, |
1619 | .connect = xs_connect, |
1620 | @@ -2477,6 +2479,7 @@ static struct rpc_xprt_ops xs_udp_ops = { |
1621 | static struct rpc_xprt_ops xs_tcp_ops = { |
1622 | .reserve_xprt = xprt_reserve_xprt, |
1623 | .release_xprt = xs_tcp_release_xprt, |
1624 | + .alloc_slot = xprt_lock_and_alloc_slot, |
1625 | .rpcbind = rpcb_getport_async, |
1626 | .set_port = xs_set_port, |
1627 | .connect = xs_connect, |
1628 | @@ -2496,6 +2499,7 @@ static struct rpc_xprt_ops xs_tcp_ops = { |
1629 | static struct rpc_xprt_ops bc_tcp_ops = { |
1630 | .reserve_xprt = xprt_reserve_xprt, |
1631 | .release_xprt = xprt_release_xprt, |
1632 | + .alloc_slot = xprt_alloc_slot, |
1633 | .rpcbind = xs_local_rpcbind, |
1634 | .buf_alloc = bc_malloc, |
1635 | .buf_free = bc_free, |