Magellan Linux

Contents of /trunk/kernel-magellan/patches-3.6/0103-3.6.4-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1926 - (show annotations) (download)
Mon Oct 29 10:45:43 2012 UTC (11 years, 6 months ago) by niro
File size: 159333 byte(s)
-3.6.4-magellan-r1
1 diff --git a/Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.txt b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.txt
2 index c8e5782..683fde9 100644
3 --- a/Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.txt
4 +++ b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra20-pinmux.txt
5 @@ -93,7 +93,7 @@ Valid values for pin and group names are:
6
7 With some exceptions, these support nvidia,high-speed-mode,
8 nvidia,schmitt, nvidia,low-power-mode, nvidia,pull-down-strength,
9 - nvidia,pull-up-strength, nvidia,slew_rate-rising, nvidia,slew_rate-falling.
10 + nvidia,pull-up-strength, nvidia,slew-rate-rising, nvidia,slew-rate-falling.
11
12 drive_ao1, drive_ao2, drive_at1, drive_at2, drive_cdev1, drive_cdev2,
13 drive_csus, drive_dap1, drive_dap2, drive_dap3, drive_dap4, drive_dbg,
14 diff --git a/Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.txt b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.txt
15 index c275b70..6f426ed 100644
16 --- a/Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.txt
17 +++ b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra30-pinmux.txt
18 @@ -83,7 +83,7 @@ Valid values for pin and group names are:
19 drive groups:
20
21 These all support nvidia,pull-down-strength, nvidia,pull-up-strength,
22 - nvidia,slew_rate-rising, nvidia,slew_rate-falling. Most but not all
23 + nvidia,slew-rate-rising, nvidia,slew-rate-falling. Most but not all
24 support nvidia,high-speed-mode, nvidia,schmitt, nvidia,low-power-mode.
25
26 ao1, ao2, at1, at2, at3, at4, at5, cdev1, cdev2, cec, crt, csus, dap1,
27 diff --git a/Documentation/hwmon/coretemp b/Documentation/hwmon/coretemp
28 index c86b50c..f17256f 100644
29 --- a/Documentation/hwmon/coretemp
30 +++ b/Documentation/hwmon/coretemp
31 @@ -105,6 +105,7 @@ Process Processor TjMax(C)
32 330/230 125
33 E680/660/640/620 90
34 E680T/660T/640T/620T 110
35 + CE4170/4150/4110 110
36
37 45nm Core2 Processors
38 Solo ULV SU3500/3300 100
39 diff --git a/arch/s390/boot/compressed/vmlinux.lds.S b/arch/s390/boot/compressed/vmlinux.lds.S
40 index d80f79d..8e1fb82 100644
41 --- a/arch/s390/boot/compressed/vmlinux.lds.S
42 +++ b/arch/s390/boot/compressed/vmlinux.lds.S
43 @@ -5,7 +5,7 @@ OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
44 OUTPUT_ARCH(s390:64-bit)
45 #else
46 OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
47 -OUTPUT_ARCH(s390)
48 +OUTPUT_ARCH(s390:31-bit)
49 #endif
50
51 ENTRY(startup)
52 diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S
53 index de8fa9b..79cb51a 100644
54 --- a/arch/s390/kernel/vmlinux.lds.S
55 +++ b/arch/s390/kernel/vmlinux.lds.S
56 @@ -8,7 +8,7 @@
57
58 #ifndef CONFIG_64BIT
59 OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
60 -OUTPUT_ARCH(s390)
61 +OUTPUT_ARCH(s390:31-bit)
62 ENTRY(startup)
63 jiffies = jiffies_64 + 4;
64 #else
65 diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c
66 index 5713957..ac18037 100644
67 --- a/arch/sparc/kernel/perf_event.c
68 +++ b/arch/sparc/kernel/perf_event.c
69 @@ -557,11 +557,13 @@ static u64 nop_for_index(int idx)
70
71 static inline void sparc_pmu_enable_event(struct cpu_hw_events *cpuc, struct hw_perf_event *hwc, int idx)
72 {
73 - u64 val, mask = mask_for_index(idx);
74 + u64 enc, val, mask = mask_for_index(idx);
75 +
76 + enc = perf_event_get_enc(cpuc->events[idx]);
77
78 val = cpuc->pcr;
79 val &= ~mask;
80 - val |= hwc->config;
81 + val |= event_encoding(enc, idx);
82 cpuc->pcr = val;
83
84 pcr_ops->write(cpuc->pcr);
85 @@ -1426,8 +1428,6 @@ static void perf_callchain_user_64(struct perf_callchain_entry *entry,
86 {
87 unsigned long ufp;
88
89 - perf_callchain_store(entry, regs->tpc);
90 -
91 ufp = regs->u_regs[UREG_I6] + STACK_BIAS;
92 do {
93 struct sparc_stackf *usf, sf;
94 @@ -1448,8 +1448,6 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry,
95 {
96 unsigned long ufp;
97
98 - perf_callchain_store(entry, regs->tpc);
99 -
100 ufp = regs->u_regs[UREG_I6] & 0xffffffffUL;
101 do {
102 struct sparc_stackf32 *usf, sf;
103 @@ -1468,6 +1466,11 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry,
104 void
105 perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
106 {
107 + perf_callchain_store(entry, regs->tpc);
108 +
109 + if (!current->mm)
110 + return;
111 +
112 flushw_user();
113 if (test_thread_flag(TIF_32BIT))
114 perf_callchain_user_32(entry, regs);
115 diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S
116 index 1d7e274..7f5f65d 100644
117 --- a/arch/sparc/kernel/syscalls.S
118 +++ b/arch/sparc/kernel/syscalls.S
119 @@ -212,24 +212,20 @@ linux_sparc_syscall:
120 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
121 ret_sys_call:
122 ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
123 - ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
124 sra %o0, 0, %o0
125 mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
126 sllx %g2, 32, %g2
127
128 - /* Check if force_successful_syscall_return()
129 - * was invoked.
130 - */
131 - ldub [%g6 + TI_SYS_NOERROR], %l2
132 - brnz,a,pn %l2, 80f
133 - stb %g0, [%g6 + TI_SYS_NOERROR]
134 -
135 cmp %o0, -ERESTART_RESTARTBLOCK
136 bgeu,pn %xcc, 1f
137 - andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6
138 -80:
139 + andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0
140 + ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
141 +
142 +2:
143 + stb %g0, [%g6 + TI_SYS_NOERROR]
144 /* System call success, clear Carry condition code. */
145 andn %g3, %g2, %g3
146 +3:
147 stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
148 bne,pn %icc, linux_syscall_trace2
149 add %l1, 0x4, %l2 ! npc = npc+4
150 @@ -238,20 +234,20 @@ ret_sys_call:
151 stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
152
153 1:
154 + /* Check if force_successful_syscall_return()
155 + * was invoked.
156 + */
157 + ldub [%g6 + TI_SYS_NOERROR], %l2
158 + brnz,pn %l2, 2b
159 + ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
160 /* System call failure, set Carry condition code.
161 * Also, get abs(errno) to return to the process.
162 */
163 - andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6
164 sub %g0, %o0, %o0
165 - or %g3, %g2, %g3
166 stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
167 - stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
168 - bne,pn %icc, linux_syscall_trace2
169 - add %l1, 0x4, %l2 ! npc = npc+4
170 - stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
171 + ba,pt %xcc, 3b
172 + or %g3, %g2, %g3
173
174 - b,pt %xcc, rtrap
175 - stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
176 linux_syscall_trace2:
177 call syscall_trace_leave
178 add %sp, PTREGS_OFF, %o0
179 diff --git a/arch/tile/Makefile b/arch/tile/Makefile
180 index 55640cf..3d15364 100644
181 --- a/arch/tile/Makefile
182 +++ b/arch/tile/Makefile
183 @@ -26,6 +26,10 @@ $(error Set TILERA_ROOT or CROSS_COMPILE when building $(ARCH) on $(HOST_ARCH))
184 endif
185 endif
186
187 +# The tile compiler may emit .eh_frame information for backtracing.
188 +# In kernel modules, this causes load failures due to unsupported relocations.
189 +KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
190 +
191 ifneq ($(CONFIG_DEBUG_EXTRA_FLAGS),"")
192 KBUILD_CFLAGS += $(CONFIG_DEBUG_EXTRA_FLAGS)
193 endif
194 diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c
195 index c4e916d..698b6ec 100644
196 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
197 +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
198 @@ -576,12 +576,10 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)
199 int err = 0;
200
201 if (shared_bank[bank]) {
202 -
203 nb = node_to_amd_nb(amd_get_nb_id(cpu));
204 - WARN_ON(!nb);
205
206 /* threshold descriptor already initialized on this node? */
207 - if (nb->bank4) {
208 + if (nb && nb->bank4) {
209 /* yes, use it */
210 b = nb->bank4;
211 err = kobject_add(b->kobj, &dev->kobj, name);
212 @@ -615,8 +613,10 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)
213 atomic_set(&b->cpus, 1);
214
215 /* nb is already initialized, see above */
216 - WARN_ON(nb->bank4);
217 - nb->bank4 = b;
218 + if (nb) {
219 + WARN_ON(nb->bank4);
220 + nb->bank4 = b;
221 + }
222 }
223
224 err = allocate_threshold_blocks(cpu, bank, 0,
225 diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
226 index 623f288..8f8e8ee 100644
227 --- a/arch/x86/kernel/entry_32.S
228 +++ b/arch/x86/kernel/entry_32.S
229 @@ -1016,7 +1016,7 @@ ENTRY(xen_sysenter_target)
230
231 ENTRY(xen_hypervisor_callback)
232 CFI_STARTPROC
233 - pushl_cfi $0
234 + pushl_cfi $-1 /* orig_ax = -1 => not a system call */
235 SAVE_ALL
236 TRACE_IRQS_OFF
237
238 @@ -1058,14 +1058,16 @@ ENTRY(xen_failsafe_callback)
239 2: mov 8(%esp),%es
240 3: mov 12(%esp),%fs
241 4: mov 16(%esp),%gs
242 + /* EAX == 0 => Category 1 (Bad segment)
243 + EAX != 0 => Category 2 (Bad IRET) */
244 testl %eax,%eax
245 popl_cfi %eax
246 lea 16(%esp),%esp
247 CFI_ADJUST_CFA_OFFSET -16
248 jz 5f
249 addl $16,%esp
250 - jmp iret_exc # EAX != 0 => Category 2 (Bad IRET)
251 -5: pushl_cfi $0 # EAX == 0 => Category 1 (Bad segment)
252 + jmp iret_exc
253 +5: pushl_cfi $-1 /* orig_ax = -1 => not a system call */
254 SAVE_ALL
255 jmp ret_from_exception
256 CFI_ENDPROC
257 diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
258 index 69babd8..dcdd0ea 100644
259 --- a/arch/x86/kernel/entry_64.S
260 +++ b/arch/x86/kernel/entry_64.S
261 @@ -1363,7 +1363,7 @@ ENTRY(xen_failsafe_callback)
262 CFI_RESTORE r11
263 addq $0x30,%rsp
264 CFI_ADJUST_CFA_OFFSET -0x30
265 - pushq_cfi $0
266 + pushq_cfi $-1 /* orig_ax = -1 => not a system call */
267 SAVE_ALL
268 jmp error_exit
269 CFI_ENDPROC
270 diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
271 index f4b9b80..198e774 100644
272 --- a/arch/x86/kernel/setup.c
273 +++ b/arch/x86/kernel/setup.c
274 @@ -919,8 +919,21 @@ void __init setup_arch(char **cmdline_p)
275
276 #ifdef CONFIG_X86_64
277 if (max_pfn > max_low_pfn) {
278 - max_pfn_mapped = init_memory_mapping(1UL<<32,
279 - max_pfn<<PAGE_SHIFT);
280 + int i;
281 + for (i = 0; i < e820.nr_map; i++) {
282 + struct e820entry *ei = &e820.map[i];
283 +
284 + if (ei->addr + ei->size <= 1UL << 32)
285 + continue;
286 +
287 + if (ei->type == E820_RESERVED)
288 + continue;
289 +
290 + max_pfn_mapped = init_memory_mapping(
291 + ei->addr < 1UL << 32 ? 1UL << 32 : ei->addr,
292 + ei->addr + ei->size);
293 + }
294 +
295 /* can we preseve max_low_pfn ?*/
296 max_low_pfn = max_pfn;
297 }
298 diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
299 index 26b8a85..48768df 100644
300 --- a/arch/x86/oprofile/nmi_int.c
301 +++ b/arch/x86/oprofile/nmi_int.c
302 @@ -55,7 +55,7 @@ u64 op_x86_get_ctrl(struct op_x86_model_spec const *model,
303 val |= counter_config->extra;
304 event &= model->event_mask ? model->event_mask : 0xFF;
305 val |= event & 0xFF;
306 - val |= (event & 0x0F00) << 24;
307 + val |= (u64)(event & 0x0F00) << 24;
308
309 return val;
310 }
311 diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h
312 index bc7e005..6b3ff98 100644
313 --- a/arch/xtensa/include/asm/unistd.h
314 +++ b/arch/xtensa/include/asm/unistd.h
315 @@ -148,8 +148,8 @@ __SYSCALL( 59, sys_getdents, 3)
316 __SYSCALL( 60, sys_getdents64, 3)
317 #define __NR_fcntl64 61
318 __SYSCALL( 61, sys_fcntl64, 3)
319 -#define __NR_available62 62
320 -__SYSCALL( 62, sys_ni_syscall, 0)
321 +#define __NR_fallocate 62
322 +__SYSCALL( 62, sys_fallocate, 6)
323 #define __NR_fadvise64_64 63
324 __SYSCALL( 63, xtensa_fadvise64_64, 6)
325 #define __NR_utime 64 /* glibc 2.3.3 ?? */
326 @@ -264,8 +264,8 @@ __SYSCALL(112, sys_socketpair, 4)
327 __SYSCALL(113, sys_sendfile, 4)
328 #define __NR_sendfile64 114
329 __SYSCALL(114, sys_sendfile64, 4)
330 -#define __NR_available115 115
331 -__SYSCALL(115, sys_ni_syscall, 0)
332 +#define __NR_sendmmsg 115
333 +__SYSCALL(115, sys_sendmmsg, 4)
334
335 /* Process Operations */
336
337 @@ -380,11 +380,11 @@ __SYSCALL(168, sys_msgrcv, 4)
338 __SYSCALL(169, sys_msgctl, 4)
339 #define __NR_available170 170
340 __SYSCALL(170, sys_ni_syscall, 0)
341 -#define __NR_available171 171
342 -__SYSCALL(171, sys_ni_syscall, 0)
343
344 /* File System */
345
346 +#define __NR_umount2 171
347 +__SYSCALL(171, sys_umount, 2)
348 #define __NR_mount 172
349 __SYSCALL(172, sys_mount, 5)
350 #define __NR_swapon 173
351 @@ -399,8 +399,8 @@ __SYSCALL(176, sys_umount, 2)
352 __SYSCALL(177, sys_swapoff, 1)
353 #define __NR_sync 178
354 __SYSCALL(178, sys_sync, 0)
355 -#define __NR_available179 179
356 -__SYSCALL(179, sys_ni_syscall, 0)
357 +#define __NR_syncfs 179
358 +__SYSCALL(179, sys_syncfs, 1)
359 #define __NR_setfsuid 180
360 __SYSCALL(180, sys_setfsuid, 1)
361 #define __NR_setfsgid 181
362 @@ -455,7 +455,7 @@ __SYSCALL(203, sys_reboot, 3)
363 #define __NR_quotactl 204
364 __SYSCALL(204, sys_quotactl, 4)
365 #define __NR_nfsservctl 205
366 -__SYSCALL(205, sys_ni_syscall, 0)
367 +__SYSCALL(205, sys_ni_syscall, 0) /* old nfsservctl */
368 #define __NR__sysctl 206
369 __SYSCALL(206, sys_sysctl, 1)
370 #define __NR_bdflush 207
371 @@ -562,7 +562,7 @@ __SYSCALL(252, sys_timer_getoverrun, 1)
372
373 /* System */
374
375 -#define __NR_reserved244 253
376 +#define __NR_reserved253 253
377 __SYSCALL(253, sys_ni_syscall, 0)
378 #define __NR_lookup_dcookie 254
379 __SYSCALL(254, sys_lookup_dcookie, 4)
380 @@ -609,8 +609,8 @@ __SYSCALL(272, sys_pselect6, 0)
381 __SYSCALL(273, sys_ppoll, 0)
382 #define __NR_epoll_pwait 274
383 __SYSCALL(274, sys_epoll_pwait, 0)
384 -#define __NR_available275 275
385 -__SYSCALL(275, sys_ni_syscall, 0)
386 +#define __NR_epoll_create1 275
387 +__SYSCALL(275, sys_epoll_create1, 1)
388
389 #define __NR_inotify_init 276
390 __SYSCALL(276, sys_inotify_init, 0)
391 @@ -618,8 +618,8 @@ __SYSCALL(276, sys_inotify_init, 0)
392 __SYSCALL(277, sys_inotify_add_watch, 3)
393 #define __NR_inotify_rm_watch 278
394 __SYSCALL(278, sys_inotify_rm_watch, 2)
395 -#define __NR_available279 279
396 -__SYSCALL(279, sys_ni_syscall, 0)
397 +#define __NR_inotify_init1 279
398 +__SYSCALL(279, sys_inotify_init1, 1)
399
400 #define __NR_getcpu 280
401 __SYSCALL(280, sys_getcpu, 0)
402 @@ -635,10 +635,10 @@ __SYSCALL(283, sys_ioprio_get, 3)
403 __SYSCALL(284, sys_set_robust_list, 3)
404 #define __NR_get_robust_list 285
405 __SYSCALL(285, sys_get_robust_list, 3)
406 -#define __NR_reserved286 286 /* sync_file_rangeX */
407 -__SYSCALL(286, sys_ni_syscall, 3)
408 +#define __NR_available286 286
409 +__SYSCALL(286, sys_ni_syscall, 0)
410 #define __NR_available287 287
411 -__SYSCALL(287, sys_faccessat, 0)
412 +__SYSCALL(287, sys_ni_syscall, 0)
413
414 /* Relative File Operations */
415
416 @@ -683,10 +683,63 @@ __SYSCALL(305, sys_ni_syscall, 0)
417 __SYSCALL(306, sys_eventfd, 1)
418 #define __NR_recvmmsg 307
419 __SYSCALL(307, sys_recvmmsg, 5)
420 +
421 #define __NR_setns 308
422 __SYSCALL(308, sys_setns, 2)
423 -
424 -#define __NR_syscall_count 309
425 +#define __NR_signalfd4 309
426 +__SYSCALL(309, sys_signalfd4, 4)
427 +#define __NR_dup3 310
428 +__SYSCALL(310, sys_dup3, 3)
429 +#define __NR_pipe2 311
430 +__SYSCALL(311, sys_pipe2, 2)
431 +
432 +#define __NR_timerfd_create 312
433 +__SYSCALL(312, sys_timerfd_create, 2)
434 +#define __NR_timerfd_settime 313
435 +__SYSCALL(313, sys_timerfd_settime, 4)
436 +#define __NR_timerfd_gettime 314
437 +__SYSCALL(314, sys_timerfd_gettime, 2)
438 +#define __NR_available315 315
439 +__SYSCALL(315, sys_ni_syscall, 0)
440 +
441 +#define __NR_eventfd2 316
442 +__SYSCALL(316, sys_eventfd2, 2)
443 +#define __NR_preadv 317
444 +__SYSCALL(317, sys_preadv, 5)
445 +#define __NR_pwritev 318
446 +__SYSCALL(318, sys_pwritev, 5)
447 +#define __NR_available319 319
448 +__SYSCALL(319, sys_ni_syscall, 0)
449 +
450 +#define __NR_fanotify_init 320
451 +__SYSCALL(320, sys_fanotify_init, 2)
452 +#define __NR_fanotify_mark 321
453 +__SYSCALL(321, sys_fanotify_mark, 6)
454 +#define __NR_process_vm_readv 322
455 +__SYSCALL(322, sys_process_vm_readv, 6)
456 +#define __NR_process_vm_writev 323
457 +__SYSCALL(323, sys_process_vm_writev, 6)
458 +
459 +#define __NR_name_to_handle_at 324
460 +__SYSCALL(324, sys_name_to_handle_at, 5)
461 +#define __NR_open_by_handle_at 325
462 +__SYSCALL(325, sys_open_by_handle_at, 3)
463 +#define __NR_sync_file_range 326
464 +__SYSCALL(326, sys_sync_file_range2, 6)
465 +#define __NR_perf_event_open 327
466 +__SYSCALL(327, sys_perf_event_open, 5)
467 +
468 +#define __NR_rt_tgsigqueueinfo 328
469 +__SYSCALL(328, sys_rt_tgsigqueueinfo, 4)
470 +#define __NR_clock_adjtime 329
471 +__SYSCALL(329, sys_clock_adjtime, 2)
472 +#define __NR_prlimit64 330
473 +__SYSCALL(330, sys_prlimit64, 4)
474 +#define __NR_kcmp 331
475 +__SYSCALL(331, sys_kcmp, 5)
476 +
477 +
478 +#define __NR_syscall_count 332
479
480 /*
481 * sysxtensa syscall handler
482 diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
483 index 5a297a2..cc8e7c7 100644
484 --- a/drivers/edac/amd64_edac.c
485 +++ b/drivers/edac/amd64_edac.c
486 @@ -170,8 +170,11 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate)
487 * memory controller and apply to register. Search for the first
488 * bandwidth entry that is greater or equal than the setting requested
489 * and program that. If at last entry, turn off DRAM scrubbing.
490 + *
491 + * If no suitable bandwidth is found, turn off DRAM scrubbing entirely
492 + * by falling back to the last element in scrubrates[].
493 */
494 - for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
495 + for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
496 /*
497 * skip scrub rates which aren't recommended
498 * (see F10 BKDG, F3x58)
499 @@ -181,12 +184,6 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate)
500
501 if (scrubrates[i].bandwidth <= new_bw)
502 break;
503 -
504 - /*
505 - * if no suitable bandwidth found, turn off DRAM scrubbing
506 - * entirely by falling back to the last element in the
507 - * scrubrates array.
508 - */
509 }
510
511 scrubval = scrubrates[i].scrubval;
512 diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
513 index ff2819e..cdf46b5 100644
514 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
515 +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
516 @@ -269,6 +269,7 @@ eb_destroy(struct eb_objects *eb)
517 static inline int use_cpu_reloc(struct drm_i915_gem_object *obj)
518 {
519 return (obj->base.write_domain == I915_GEM_DOMAIN_CPU ||
520 + !obj->map_and_fenceable ||
521 obj->cache_level != I915_CACHE_NONE);
522 }
523
524 diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
525 index 984a3f1..47b8d84 100644
526 --- a/drivers/hwmon/coretemp.c
527 +++ b/drivers/hwmon/coretemp.c
528 @@ -205,8 +205,11 @@ static const struct tjmax __cpuinitconst tjmax_table[] = {
529 { "CPU N455", 100000 },
530 { "CPU N470", 100000 },
531 { "CPU N475", 100000 },
532 - { "CPU 230", 100000 },
533 - { "CPU 330", 125000 },
534 + { "CPU 230", 100000 }, /* Model 0x1c, stepping 2 */
535 + { "CPU 330", 125000 }, /* Model 0x1c, stepping 2 */
536 + { "CPU CE4110", 110000 }, /* Model 0x1c, stepping 10 */
537 + { "CPU CE4150", 110000 }, /* Model 0x1c, stepping 10 */
538 + { "CPU CE4170", 110000 }, /* Model 0x1c, stepping 10 */
539 };
540
541 static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id,
542 diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
543 index 7172559..d1febf0 100644
544 --- a/drivers/infiniband/core/cma.c
545 +++ b/drivers/infiniband/core/cma.c
546 @@ -3495,7 +3495,8 @@ out:
547 }
548
549 static const struct ibnl_client_cbs cma_cb_table[] = {
550 - [RDMA_NL_RDMA_CM_ID_STATS] = { .dump = cma_get_id_stats },
551 + [RDMA_NL_RDMA_CM_ID_STATS] = { .dump = cma_get_id_stats,
552 + .module = THIS_MODULE },
553 };
554
555 static int __init cma_init(void)
556 diff --git a/drivers/infiniband/core/netlink.c b/drivers/infiniband/core/netlink.c
557 index 3ae2bfd..53b43a5 100644
558 --- a/drivers/infiniband/core/netlink.c
559 +++ b/drivers/infiniband/core/netlink.c
560 @@ -154,6 +154,7 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
561 {
562 struct netlink_dump_control c = {
563 .dump = client->cb_table[op].dump,
564 + .module = client->cb_table[op].module,
565 };
566 return netlink_dump_start(nls, skb, nlh, &c);
567 }
568 diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
569 index 2a4bb36..cef812a 100644
570 --- a/drivers/iommu/tegra-smmu.c
571 +++ b/drivers/iommu/tegra-smmu.c
572 @@ -146,7 +146,7 @@
573
574 #define SMMU_ADDR_TO_PFN(addr) ((addr) >> 12)
575 #define SMMU_ADDR_TO_PDN(addr) ((addr) >> 22)
576 -#define SMMU_PDN_TO_ADDR(addr) ((pdn) << 22)
577 +#define SMMU_PDN_TO_ADDR(pdn) ((pdn) << 22)
578
579 #define _READABLE (1 << SMMU_PTB_DATA_ASID_READABLE_SHIFT)
580 #define _WRITABLE (1 << SMMU_PTB_DATA_ASID_WRITABLE_SHIFT)
581 diff --git a/drivers/media/video/au0828/au0828-video.c b/drivers/media/video/au0828/au0828-video.c
582 index ac3dd73..902825a 100644
583 --- a/drivers/media/video/au0828/au0828-video.c
584 +++ b/drivers/media/video/au0828/au0828-video.c
585 @@ -1692,14 +1692,18 @@ static int vidioc_streamoff(struct file *file, void *priv,
586 (AUVI_INPUT(i).audio_setup)(dev, 0);
587 }
588
589 - videobuf_streamoff(&fh->vb_vidq);
590 - res_free(fh, AU0828_RESOURCE_VIDEO);
591 + if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
592 + videobuf_streamoff(&fh->vb_vidq);
593 + res_free(fh, AU0828_RESOURCE_VIDEO);
594 + }
595 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
596 dev->vbi_timeout_running = 0;
597 del_timer_sync(&dev->vbi_timeout);
598
599 - videobuf_streamoff(&fh->vb_vbiq);
600 - res_free(fh, AU0828_RESOURCE_VBI);
601 + if (res_check(fh, AU0828_RESOURCE_VBI)) {
602 + videobuf_streamoff(&fh->vb_vbiq);
603 + res_free(fh, AU0828_RESOURCE_VBI);
604 + }
605 }
606
607 return 0;
608 diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c
609 index 2b4b4f5..16814b3 100644
610 --- a/drivers/net/ethernet/calxeda/xgmac.c
611 +++ b/drivers/net/ethernet/calxeda/xgmac.c
612 @@ -375,7 +375,6 @@ struct xgmac_priv {
613 unsigned int tx_tail;
614
615 void __iomem *base;
616 - struct sk_buff_head rx_recycle;
617 unsigned int dma_buf_sz;
618 dma_addr_t dma_rx_phy;
619 dma_addr_t dma_tx_phy;
620 @@ -672,9 +671,7 @@ static void xgmac_rx_refill(struct xgmac_priv *priv)
621 p = priv->dma_rx + entry;
622
623 if (priv->rx_skbuff[entry] == NULL) {
624 - skb = __skb_dequeue(&priv->rx_recycle);
625 - if (skb == NULL)
626 - skb = netdev_alloc_skb(priv->dev, priv->dma_buf_sz);
627 + skb = netdev_alloc_skb(priv->dev, priv->dma_buf_sz);
628 if (unlikely(skb == NULL))
629 break;
630
631 @@ -887,17 +884,7 @@ static void xgmac_tx_complete(struct xgmac_priv *priv)
632 desc_get_buf_len(p), DMA_TO_DEVICE);
633 }
634
635 - /*
636 - * If there's room in the queue (limit it to size)
637 - * we add this skb back into the pool,
638 - * if it's the right size.
639 - */
640 - if ((skb_queue_len(&priv->rx_recycle) <
641 - DMA_RX_RING_SZ) &&
642 - skb_recycle_check(skb, priv->dma_buf_sz))
643 - __skb_queue_head(&priv->rx_recycle, skb);
644 - else
645 - dev_kfree_skb(skb);
646 + dev_kfree_skb(skb);
647 }
648
649 if (dma_ring_space(priv->tx_head, priv->tx_tail, DMA_TX_RING_SZ) >
650 @@ -1016,7 +1003,6 @@ static int xgmac_open(struct net_device *dev)
651 dev->dev_addr);
652 }
653
654 - skb_queue_head_init(&priv->rx_recycle);
655 memset(&priv->xstats, 0, sizeof(struct xgmac_extra_stats));
656
657 /* Initialize the XGMAC and descriptors */
658 @@ -1053,7 +1039,6 @@ static int xgmac_stop(struct net_device *dev)
659 napi_disable(&priv->napi);
660
661 writel(0, priv->base + XGMAC_DMA_INTR_ENA);
662 - skb_queue_purge(&priv->rx_recycle);
663
664 /* Disable the MAC core */
665 xgmac_mac_disable(priv->base);
666 diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
667 index d3233f5..e0ef1e5 100644
668 --- a/drivers/net/ethernet/freescale/gianfar.c
669 +++ b/drivers/net/ethernet/freescale/gianfar.c
670 @@ -1757,7 +1757,6 @@ static void free_skb_resources(struct gfar_private *priv)
671 sizeof(struct rxbd8) * priv->total_rx_ring_size,
672 priv->tx_queue[0]->tx_bd_base,
673 priv->tx_queue[0]->tx_bd_dma_base);
674 - skb_queue_purge(&priv->rx_recycle);
675 }
676
677 void gfar_start(struct net_device *dev)
678 @@ -1935,8 +1934,6 @@ static int gfar_enet_open(struct net_device *dev)
679
680 enable_napi(priv);
681
682 - skb_queue_head_init(&priv->rx_recycle);
683 -
684 /* Initialize a bunch of registers */
685 init_registers(dev);
686
687 @@ -2525,16 +2522,7 @@ static int gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue)
688
689 bytes_sent += skb->len;
690
691 - /* If there's room in the queue (limit it to rx_buffer_size)
692 - * we add this skb back into the pool, if it's the right size
693 - */
694 - if (skb_queue_len(&priv->rx_recycle) < rx_queue->rx_ring_size &&
695 - skb_recycle_check(skb, priv->rx_buffer_size +
696 - RXBUF_ALIGNMENT)) {
697 - gfar_align_skb(skb);
698 - skb_queue_head(&priv->rx_recycle, skb);
699 - } else
700 - dev_kfree_skb_any(skb);
701 + dev_kfree_skb_any(skb);
702
703 tx_queue->tx_skbuff[skb_dirtytx] = NULL;
704
705 @@ -2600,7 +2588,7 @@ static void gfar_new_rxbdp(struct gfar_priv_rx_q *rx_queue, struct rxbd8 *bdp,
706 static struct sk_buff *gfar_alloc_skb(struct net_device *dev)
707 {
708 struct gfar_private *priv = netdev_priv(dev);
709 - struct sk_buff *skb = NULL;
710 + struct sk_buff *skb;
711
712 skb = netdev_alloc_skb(dev, priv->rx_buffer_size + RXBUF_ALIGNMENT);
713 if (!skb)
714 @@ -2613,14 +2601,7 @@ static struct sk_buff *gfar_alloc_skb(struct net_device *dev)
715
716 struct sk_buff *gfar_new_skb(struct net_device *dev)
717 {
718 - struct gfar_private *priv = netdev_priv(dev);
719 - struct sk_buff *skb = NULL;
720 -
721 - skb = skb_dequeue(&priv->rx_recycle);
722 - if (!skb)
723 - skb = gfar_alloc_skb(dev);
724 -
725 - return skb;
726 + return gfar_alloc_skb(dev);
727 }
728
729 static inline void count_errors(unsigned short status, struct net_device *dev)
730 @@ -2779,7 +2760,7 @@ int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit)
731 if (unlikely(!newskb))
732 newskb = skb;
733 else if (skb)
734 - skb_queue_head(&priv->rx_recycle, skb);
735 + dev_kfree_skb(skb);
736 } else {
737 /* Increment the number of packets */
738 rx_queue->stats.rx_packets++;
739 diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h
740 index 2136c7f..27d8aeb 100644
741 --- a/drivers/net/ethernet/freescale/gianfar.h
742 +++ b/drivers/net/ethernet/freescale/gianfar.h
743 @@ -1072,8 +1072,6 @@ struct gfar_private {
744
745 u32 cur_filer_idx;
746
747 - struct sk_buff_head rx_recycle;
748 -
749 /* RX queue filer rule set*/
750 struct ethtool_rx_list rx_list;
751 struct mutex rx_queue_access;
752 diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
753 index 21c6574..f6259ff 100644
754 --- a/drivers/net/ethernet/freescale/ucc_geth.c
755 +++ b/drivers/net/ethernet/freescale/ucc_geth.c
756 @@ -210,14 +210,12 @@ static struct list_head *dequeue(struct list_head *lh)
757 static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth,
758 u8 __iomem *bd)
759 {
760 - struct sk_buff *skb = NULL;
761 + struct sk_buff *skb;
762
763 - skb = __skb_dequeue(&ugeth->rx_recycle);
764 + skb = netdev_alloc_skb(ugeth->ndev,
765 + ugeth->ug_info->uf_info.max_rx_buf_length +
766 + UCC_GETH_RX_DATA_BUF_ALIGNMENT);
767 if (!skb)
768 - skb = netdev_alloc_skb(ugeth->ndev,
769 - ugeth->ug_info->uf_info.max_rx_buf_length +
770 - UCC_GETH_RX_DATA_BUF_ALIGNMENT);
771 - if (skb == NULL)
772 return NULL;
773
774 /* We need the data buffer to be aligned properly. We will reserve
775 @@ -2021,8 +2019,6 @@ static void ucc_geth_memclean(struct ucc_geth_private *ugeth)
776 iounmap(ugeth->ug_regs);
777 ugeth->ug_regs = NULL;
778 }
779 -
780 - skb_queue_purge(&ugeth->rx_recycle);
781 }
782
783 static void ucc_geth_set_multi(struct net_device *dev)
784 @@ -2231,8 +2227,6 @@ static int ucc_struct_init(struct ucc_geth_private *ugeth)
785 return -ENOMEM;
786 }
787
788 - skb_queue_head_init(&ugeth->rx_recycle);
789 -
790 return 0;
791 }
792
793 @@ -3275,12 +3269,7 @@ static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit
794 if (netif_msg_rx_err(ugeth))
795 ugeth_err("%s, %d: ERROR!!! skb - 0x%08x",
796 __func__, __LINE__, (u32) skb);
797 - if (skb) {
798 - skb->data = skb->head + NET_SKB_PAD;
799 - skb->len = 0;
800 - skb_reset_tail_pointer(skb);
801 - __skb_queue_head(&ugeth->rx_recycle, skb);
802 - }
803 + dev_kfree_skb(skb);
804
805 ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]] = NULL;
806 dev->stats.rx_dropped++;
807 @@ -3350,13 +3339,7 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ)
808
809 dev->stats.tx_packets++;
810
811 - if (skb_queue_len(&ugeth->rx_recycle) < RX_BD_RING_LEN &&
812 - skb_recycle_check(skb,
813 - ugeth->ug_info->uf_info.max_rx_buf_length +
814 - UCC_GETH_RX_DATA_BUF_ALIGNMENT))
815 - __skb_queue_head(&ugeth->rx_recycle, skb);
816 - else
817 - dev_kfree_skb(skb);
818 + dev_kfree_skb(skb);
819
820 ugeth->tx_skbuff[txQ][ugeth->skb_dirtytx[txQ]] = NULL;
821 ugeth->skb_dirtytx[txQ] =
822 diff --git a/drivers/net/ethernet/freescale/ucc_geth.h b/drivers/net/ethernet/freescale/ucc_geth.h
823 index f71b3e7..75f3371 100644
824 --- a/drivers/net/ethernet/freescale/ucc_geth.h
825 +++ b/drivers/net/ethernet/freescale/ucc_geth.h
826 @@ -1214,8 +1214,6 @@ struct ucc_geth_private {
827 /* index of the first skb which hasn't been transmitted yet. */
828 u16 skb_dirtytx[NUM_TX_QUEUES];
829
830 - struct sk_buff_head rx_recycle;
831 -
832 struct ugeth_mii_info *mii_info;
833 struct phy_device *phydev;
834 phy_interface_t phy_interface;
835 diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c
836 index 087b9e0..84c1326 100644
837 --- a/drivers/net/ethernet/marvell/mv643xx_eth.c
838 +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
839 @@ -412,7 +412,6 @@ struct mv643xx_eth_private {
840 u8 work_rx_refill;
841
842 int skb_size;
843 - struct sk_buff_head rx_recycle;
844
845 /*
846 * RX state.
847 @@ -673,9 +672,7 @@ static int rxq_refill(struct rx_queue *rxq, int budget)
848 struct rx_desc *rx_desc;
849 int size;
850
851 - skb = __skb_dequeue(&mp->rx_recycle);
852 - if (skb == NULL)
853 - skb = netdev_alloc_skb(mp->dev, mp->skb_size);
854 + skb = netdev_alloc_skb(mp->dev, mp->skb_size);
855
856 if (skb == NULL) {
857 mp->oom = 1;
858 @@ -989,14 +986,7 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
859 desc->byte_cnt, DMA_TO_DEVICE);
860 }
861
862 - if (skb != NULL) {
863 - if (skb_queue_len(&mp->rx_recycle) <
864 - mp->rx_ring_size &&
865 - skb_recycle_check(skb, mp->skb_size))
866 - __skb_queue_head(&mp->rx_recycle, skb);
867 - else
868 - dev_kfree_skb(skb);
869 - }
870 + dev_kfree_skb(skb);
871 }
872
873 __netif_tx_unlock(nq);
874 @@ -2349,8 +2339,6 @@ static int mv643xx_eth_open(struct net_device *dev)
875
876 napi_enable(&mp->napi);
877
878 - skb_queue_head_init(&mp->rx_recycle);
879 -
880 mp->int_mask = INT_EXT;
881
882 for (i = 0; i < mp->rxq_count; i++) {
883 @@ -2445,8 +2433,6 @@ static int mv643xx_eth_stop(struct net_device *dev)
884 mib_counters_update(mp);
885 del_timer_sync(&mp->mib_counters_timer);
886
887 - skb_queue_purge(&mp->rx_recycle);
888 -
889 for (i = 0; i < mp->rxq_count; i++)
890 rxq_deinit(mp->rxq + i);
891 for (i = 0; i < mp->txq_count; i++)
892 diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c
893 index 5a30bf8..f4be8f7 100644
894 --- a/drivers/net/ethernet/marvell/skge.c
895 +++ b/drivers/net/ethernet/marvell/skge.c
896 @@ -4153,6 +4153,13 @@ static struct dmi_system_id skge_32bit_dma_boards[] = {
897 DMI_MATCH(DMI_BOARD_NAME, "nForce"),
898 },
899 },
900 + {
901 + .ident = "ASUS P5NSLI",
902 + .matches = {
903 + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
904 + DMI_MATCH(DMI_BOARD_NAME, "P5NSLI")
905 + },
906 + },
907 {}
908 };
909
910 diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
911 index e872e1d..7d51a65 100644
912 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
913 +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
914 @@ -50,7 +50,6 @@ struct stmmac_priv {
915 unsigned int dirty_rx;
916 struct sk_buff **rx_skbuff;
917 dma_addr_t *rx_skbuff_dma;
918 - struct sk_buff_head rx_recycle;
919
920 struct net_device *dev;
921 dma_addr_t dma_rx_phy;
922 diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
923 index 3be8833..c6cdbc4 100644
924 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
925 +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
926 @@ -747,18 +747,7 @@ static void stmmac_tx(struct stmmac_priv *priv)
927 priv->hw->ring->clean_desc3(p);
928
929 if (likely(skb != NULL)) {
930 - /*
931 - * If there's room in the queue (limit it to size)
932 - * we add this skb back into the pool,
933 - * if it's the right size.
934 - */
935 - if ((skb_queue_len(&priv->rx_recycle) <
936 - priv->dma_rx_size) &&
937 - skb_recycle_check(skb, priv->dma_buf_sz))
938 - __skb_queue_head(&priv->rx_recycle, skb);
939 - else
940 - dev_kfree_skb(skb);
941 -
942 + dev_kfree_skb(skb);
943 priv->tx_skbuff[entry] = NULL;
944 }
945
946 @@ -1169,7 +1158,6 @@ static int stmmac_open(struct net_device *dev)
947 priv->eee_enabled = stmmac_eee_init(priv);
948
949 napi_enable(&priv->napi);
950 - skb_queue_head_init(&priv->rx_recycle);
951 netif_start_queue(dev);
952
953 return 0;
954 @@ -1222,7 +1210,6 @@ static int stmmac_release(struct net_device *dev)
955 kfree(priv->tm);
956 #endif
957 napi_disable(&priv->napi);
958 - skb_queue_purge(&priv->rx_recycle);
959
960 /* Free the IRQ lines */
961 free_irq(dev->irq, dev);
962 @@ -1388,10 +1375,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv)
963 if (likely(priv->rx_skbuff[entry] == NULL)) {
964 struct sk_buff *skb;
965
966 - skb = __skb_dequeue(&priv->rx_recycle);
967 - if (skb == NULL)
968 - skb = netdev_alloc_skb_ip_align(priv->dev,
969 - bfsize);
970 + skb = netdev_alloc_skb_ip_align(priv->dev, bfsize);
971
972 if (unlikely(skb == NULL))
973 break;
974 diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c
975 index b066273..7dd879c 100644
976 --- a/drivers/pcmcia/pxa2xx_sharpsl.c
977 +++ b/drivers/pcmcia/pxa2xx_sharpsl.c
978 @@ -194,7 +194,7 @@ static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
979 sharpsl_pcmcia_init_reset(skt);
980 }
981
982 -static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = {
983 +static struct pcmcia_low_level sharpsl_pcmcia_ops = {
984 .owner = THIS_MODULE,
985 .hw_init = sharpsl_pcmcia_hw_init,
986 .socket_state = sharpsl_pcmcia_socket_state,
987 diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
988 index dc5c126..63560c3 100644
989 --- a/drivers/pinctrl/core.c
990 +++ b/drivers/pinctrl/core.c
991 @@ -1059,8 +1059,10 @@ static int pinctrl_groups_show(struct seq_file *s, void *what)
992 seq_printf(s, "group: %s\n", gname);
993 for (i = 0; i < num_pins; i++) {
994 pname = pin_get_name(pctldev, pins[i]);
995 - if (WARN_ON(!pname))
996 + if (WARN_ON(!pname)) {
997 + mutex_unlock(&pinctrl_mutex);
998 return -EINVAL;
999 + }
1000 seq_printf(s, "pin %d (%s)\n", pins[i], pname);
1001 }
1002 seq_puts(s, "\n");
1003 diff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c
1004 index 43f474c..baee2cc 100644
1005 --- a/drivers/pinctrl/pinconf.c
1006 +++ b/drivers/pinctrl/pinconf.c
1007 @@ -537,8 +537,6 @@ static int pinconf_groups_show(struct seq_file *s, void *what)
1008 seq_puts(s, "Pin config settings per pin group\n");
1009 seq_puts(s, "Format: group (name): configs\n");
1010
1011 - mutex_lock(&pinctrl_mutex);
1012 -
1013 while (selector < ngroups) {
1014 const char *gname = pctlops->get_group_name(pctldev, selector);
1015
1016 @@ -549,8 +547,6 @@ static int pinconf_groups_show(struct seq_file *s, void *what)
1017 selector++;
1018 }
1019
1020 - mutex_unlock(&pinctrl_mutex);
1021 -
1022 return 0;
1023 }
1024
1025 diff --git a/drivers/pinctrl/pinctrl-tegra.c b/drivers/pinctrl/pinctrl-tegra.c
1026 index ae52e4e..5a5f261 100644
1027 --- a/drivers/pinctrl/pinctrl-tegra.c
1028 +++ b/drivers/pinctrl/pinctrl-tegra.c
1029 @@ -466,7 +466,7 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx,
1030 *bank = g->drv_bank;
1031 *reg = g->drv_reg;
1032 *bit = g->lpmd_bit;
1033 - *width = 1;
1034 + *width = 2;
1035 break;
1036 case TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH:
1037 *bank = g->drv_bank;
1038 diff --git a/drivers/pinctrl/pinctrl-tegra30.c b/drivers/pinctrl/pinctrl-tegra30.c
1039 index 0386fdf..7894f14 100644
1040 --- a/drivers/pinctrl/pinctrl-tegra30.c
1041 +++ b/drivers/pinctrl/pinctrl-tegra30.c
1042 @@ -3345,10 +3345,10 @@ static const struct tegra_function tegra30_functions[] = {
1043 FUNCTION(vi_alt3),
1044 };
1045
1046 -#define MUXCTL_REG_A 0x3000
1047 -#define PINGROUP_REG_A 0x868
1048 +#define DRV_PINGROUP_REG_A 0x868 /* bank 0 */
1049 +#define PINGROUP_REG_A 0x3000 /* bank 1 */
1050
1051 -#define PINGROUP_REG_Y(r) ((r) - MUXCTL_REG_A)
1052 +#define PINGROUP_REG_Y(r) ((r) - PINGROUP_REG_A)
1053 #define PINGROUP_REG_N(r) -1
1054
1055 #define PINGROUP(pg_name, f0, f1, f2, f3, f_safe, r, od, ior) \
1056 @@ -3364,25 +3364,25 @@ static const struct tegra_function tegra30_functions[] = {
1057 }, \
1058 .func_safe = TEGRA_MUX_ ## f_safe, \
1059 .mux_reg = PINGROUP_REG_Y(r), \
1060 - .mux_bank = 0, \
1061 + .mux_bank = 1, \
1062 .mux_bit = 0, \
1063 .pupd_reg = PINGROUP_REG_Y(r), \
1064 - .pupd_bank = 0, \
1065 + .pupd_bank = 1, \
1066 .pupd_bit = 2, \
1067 .tri_reg = PINGROUP_REG_Y(r), \
1068 - .tri_bank = 0, \
1069 + .tri_bank = 1, \
1070 .tri_bit = 4, \
1071 .einput_reg = PINGROUP_REG_Y(r), \
1072 - .einput_bank = 0, \
1073 + .einput_bank = 1, \
1074 .einput_bit = 5, \
1075 .odrain_reg = PINGROUP_REG_##od(r), \
1076 - .odrain_bank = 0, \
1077 + .odrain_bank = 1, \
1078 .odrain_bit = 6, \
1079 .lock_reg = PINGROUP_REG_Y(r), \
1080 - .lock_bank = 0, \
1081 + .lock_bank = 1, \
1082 .lock_bit = 7, \
1083 .ioreset_reg = PINGROUP_REG_##ior(r), \
1084 - .ioreset_bank = 0, \
1085 + .ioreset_bank = 1, \
1086 .ioreset_bit = 8, \
1087 .drv_reg = -1, \
1088 }
1089 @@ -3401,8 +3401,8 @@ static const struct tegra_function tegra30_functions[] = {
1090 .odrain_reg = -1, \
1091 .lock_reg = -1, \
1092 .ioreset_reg = -1, \
1093 - .drv_reg = ((r) - PINGROUP_REG_A), \
1094 - .drv_bank = 1, \
1095 + .drv_reg = ((r) - DRV_PINGROUP_REG_A), \
1096 + .drv_bank = 0, \
1097 .hsm_bit = hsm_b, \
1098 .schmitt_bit = schmitt_b, \
1099 .lpmd_bit = lpmd_b, \
1100 diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
1101 index e8007b8..84f7dff 100644
1102 --- a/drivers/usb/class/cdc-acm.c
1103 +++ b/drivers/usb/class/cdc-acm.c
1104 @@ -818,10 +818,6 @@ static const __u32 acm_tty_speed[] = {
1105 2500000, 3000000, 3500000, 4000000
1106 };
1107
1108 -static const __u8 acm_tty_size[] = {
1109 - 5, 6, 7, 8
1110 -};
1111 -
1112 static void acm_tty_set_termios(struct tty_struct *tty,
1113 struct ktermios *termios_old)
1114 {
1115 @@ -835,7 +831,21 @@ static void acm_tty_set_termios(struct tty_struct *tty,
1116 newline.bParityType = termios->c_cflag & PARENB ?
1117 (termios->c_cflag & PARODD ? 1 : 2) +
1118 (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
1119 - newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];
1120 + switch (termios->c_cflag & CSIZE) {
1121 + case CS5:
1122 + newline.bDataBits = 5;
1123 + break;
1124 + case CS6:
1125 + newline.bDataBits = 6;
1126 + break;
1127 + case CS7:
1128 + newline.bDataBits = 7;
1129 + break;
1130 + case CS8:
1131 + default:
1132 + newline.bDataBits = 8;
1133 + break;
1134 + }
1135 /* FIXME: Needs to clear unsupported bits in the termios */
1136 acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
1137
1138 @@ -1234,7 +1244,7 @@ made_compressed_probe:
1139
1140 if (usb_endpoint_xfer_int(epwrite))
1141 usb_fill_int_urb(snd->urb, usb_dev,
1142 - usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
1143 + usb_sndintpipe(usb_dev, epwrite->bEndpointAddress),
1144 NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval);
1145 else
1146 usb_fill_bulk_urb(snd->urb, usb_dev,
1147 diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
1148 index ebb8a9d..7f75343 100644
1149 --- a/drivers/usb/core/devio.c
1150 +++ b/drivers/usb/core/devio.c
1151 @@ -1348,6 +1348,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
1152 ret = -EFAULT;
1153 goto error;
1154 }
1155 + uurb->buffer += u;
1156 }
1157 totlen -= u;
1158 }
1159 diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
1160 index 445455a..fb6e97f 100644
1161 --- a/drivers/usb/core/driver.c
1162 +++ b/drivers/usb/core/driver.c
1163 @@ -372,6 +372,10 @@ static int usb_probe_interface(struct device *dev)
1164 intf->condition = USB_INTERFACE_UNBOUND;
1165 usb_cancel_queued_reset(intf);
1166
1167 + /* If the LPM disable succeeded, balance the ref counts. */
1168 + if (!lpm_disable_error)
1169 + usb_unlocked_enable_lpm(udev);
1170 +
1171 /* Unbound interfaces are always runtime-PM-disabled and -suspended */
1172 if (driver->supports_autosuspend)
1173 pm_runtime_disable(dev);
1174 diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
1175 index 128a804..bbff143 100644
1176 --- a/drivers/usb/core/hub.c
1177 +++ b/drivers/usb/core/hub.c
1178 @@ -3258,16 +3258,6 @@ static int usb_set_device_initiated_lpm(struct usb_device *udev,
1179
1180 if (enable) {
1181 /*
1182 - * First, let the device know about the exit latencies
1183 - * associated with the link state we're about to enable.
1184 - */
1185 - ret = usb_req_set_sel(udev, state);
1186 - if (ret < 0) {
1187 - dev_warn(&udev->dev, "Set SEL for device-initiated "
1188 - "%s failed.\n", usb3_lpm_names[state]);
1189 - return -EBUSY;
1190 - }
1191 - /*
1192 * Now send the control transfer to enable device-initiated LPM
1193 * for either U1 or U2.
1194 */
1195 @@ -3352,7 +3342,28 @@ static int usb_set_lpm_timeout(struct usb_device *udev,
1196 static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev,
1197 enum usb3_link_state state)
1198 {
1199 - int timeout;
1200 + int timeout, ret;
1201 + __u8 u1_mel = udev->bos->ss_cap->bU1devExitLat;
1202 + __le16 u2_mel = udev->bos->ss_cap->bU2DevExitLat;
1203 +
1204 + /* If the device says it doesn't have *any* exit latency to come out of
1205 + * U1 or U2, it's probably lying. Assume it doesn't implement that link
1206 + * state.
1207 + */
1208 + if ((state == USB3_LPM_U1 && u1_mel == 0) ||
1209 + (state == USB3_LPM_U2 && u2_mel == 0))
1210 + return;
1211 +
1212 + /*
1213 + * First, let the device know about the exit latencies
1214 + * associated with the link state we're about to enable.
1215 + */
1216 + ret = usb_req_set_sel(udev, state);
1217 + if (ret < 0) {
1218 + dev_warn(&udev->dev, "Set SEL for device-initiated %s failed.\n",
1219 + usb3_lpm_names[state]);
1220 + return;
1221 + }
1222
1223 /* We allow the host controller to set the U1/U2 timeout internally
1224 * first, so that it can change its schedule to account for the
1225 diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
1226 index c2813c2b..eb0fd10 100644
1227 --- a/drivers/usb/dwc3/gadget.c
1228 +++ b/drivers/usb/dwc3/gadget.c
1229 @@ -1899,6 +1899,7 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
1230 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
1231 WARN_ON_ONCE(ret);
1232 dep->resource_index = 0;
1233 + dep->flags &= ~DWC3_EP_BUSY;
1234 }
1235
1236 static void dwc3_stop_active_transfers(struct dwc3 *dwc)
1237 diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
1238 index a49868d..0644f65 100644
1239 --- a/drivers/usb/host/xhci.c
1240 +++ b/drivers/usb/host/xhci.c
1241 @@ -479,7 +479,8 @@ static bool compliance_mode_recovery_timer_quirk_check(void)
1242
1243 if (strstr(dmi_product_name, "Z420") ||
1244 strstr(dmi_product_name, "Z620") ||
1245 - strstr(dmi_product_name, "Z820"))
1246 + strstr(dmi_product_name, "Z820") ||
1247 + strstr(dmi_product_name, "Z1"))
1248 return true;
1249
1250 return false;
1251 diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c
1252 index 7a95ab8..ee9ec13 100644
1253 --- a/drivers/usb/musb/am35x.c
1254 +++ b/drivers/usb/musb/am35x.c
1255 @@ -312,6 +312,12 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci)
1256 ret = IRQ_HANDLED;
1257 }
1258
1259 + /* Drop spurious RX and TX if device is disconnected */
1260 + if (musb->int_usb & MUSB_INTR_DISCONNECT) {
1261 + musb->int_tx = 0;
1262 + musb->int_rx = 0;
1263 + }
1264 +
1265 if (musb->int_tx || musb->int_rx || musb->int_usb)
1266 ret |= musb_interrupt(musb);
1267
1268 diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c
1269 index f8ce97d..a6758ff 100644
1270 --- a/drivers/usb/serial/ark3116.c
1271 +++ b/drivers/usb/serial/ark3116.c
1272 @@ -126,9 +126,6 @@ static inline int calc_divisor(int bps)
1273
1274 static int ark3116_attach(struct usb_serial *serial)
1275 {
1276 - struct usb_serial_port *port = serial->port[0];
1277 - struct ark3116_private *priv;
1278 -
1279 /* make sure we have our end-points */
1280 if ((serial->num_bulk_in == 0) ||
1281 (serial->num_bulk_out == 0) ||
1282 @@ -143,8 +140,15 @@ static int ark3116_attach(struct usb_serial *serial)
1283 return -EINVAL;
1284 }
1285
1286 - priv = kzalloc(sizeof(struct ark3116_private),
1287 - GFP_KERNEL);
1288 + return 0;
1289 +}
1290 +
1291 +static int ark3116_port_probe(struct usb_serial_port *port)
1292 +{
1293 + struct usb_serial *serial = port->serial;
1294 + struct ark3116_private *priv;
1295 +
1296 + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1297 if (!priv)
1298 return -ENOMEM;
1299
1300 @@ -199,18 +203,15 @@ static int ark3116_attach(struct usb_serial *serial)
1301 return 0;
1302 }
1303
1304 -static void ark3116_release(struct usb_serial *serial)
1305 +static int ark3116_port_remove(struct usb_serial_port *port)
1306 {
1307 - struct usb_serial_port *port = serial->port[0];
1308 struct ark3116_private *priv = usb_get_serial_port_data(port);
1309
1310 /* device is closed, so URBs and DMA should be down */
1311 -
1312 - usb_set_serial_port_data(port, NULL);
1313 -
1314 mutex_destroy(&priv->hw_lock);
1315 -
1316 kfree(priv);
1317 +
1318 + return 0;
1319 }
1320
1321 static void ark3116_init_termios(struct tty_struct *tty)
1322 @@ -725,7 +726,8 @@ static struct usb_serial_driver ark3116_device = {
1323 .id_table = id_table,
1324 .num_ports = 1,
1325 .attach = ark3116_attach,
1326 - .release = ark3116_release,
1327 + .port_probe = ark3116_port_probe,
1328 + .port_remove = ark3116_port_remove,
1329 .set_termios = ark3116_set_termios,
1330 .init_termios = ark3116_init_termios,
1331 .ioctl = ark3116_ioctl,
1332 diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c
1333 index 6b73656..89a3dd3 100644
1334 --- a/drivers/usb/serial/belkin_sa.c
1335 +++ b/drivers/usb/serial/belkin_sa.c
1336 @@ -47,8 +47,8 @@ static bool debug;
1337 #define DRIVER_DESC "USB Belkin Serial converter driver"
1338
1339 /* function prototypes for a Belkin USB Serial Adapter F5U103 */
1340 -static int belkin_sa_startup(struct usb_serial *serial);
1341 -static void belkin_sa_release(struct usb_serial *serial);
1342 +static int belkin_sa_port_probe(struct usb_serial_port *port);
1343 +static int belkin_sa_port_remove(struct usb_serial_port *port);
1344 static int belkin_sa_open(struct tty_struct *tty,
1345 struct usb_serial_port *port);
1346 static void belkin_sa_close(struct usb_serial_port *port);
1347 @@ -90,8 +90,8 @@ static struct usb_serial_driver belkin_device = {
1348 .break_ctl = belkin_sa_break_ctl,
1349 .tiocmget = belkin_sa_tiocmget,
1350 .tiocmset = belkin_sa_tiocmset,
1351 - .attach = belkin_sa_startup,
1352 - .release = belkin_sa_release,
1353 + .port_probe = belkin_sa_port_probe,
1354 + .port_remove = belkin_sa_port_remove,
1355 };
1356
1357 static struct usb_serial_driver * const serial_drivers[] = {
1358 @@ -120,17 +120,15 @@ struct belkin_sa_private {
1359 (c), BELKIN_SA_SET_REQUEST_TYPE, \
1360 (v), 0, NULL, 0, WDR_TIMEOUT)
1361
1362 -/* do some startup allocations not currently performed by usb_serial_probe() */
1363 -static int belkin_sa_startup(struct usb_serial *serial)
1364 +static int belkin_sa_port_probe(struct usb_serial_port *port)
1365 {
1366 - struct usb_device *dev = serial->dev;
1367 + struct usb_device *dev = port->serial->dev;
1368 struct belkin_sa_private *priv;
1369
1370 - /* allocate the private data structure */
1371 priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL);
1372 if (!priv)
1373 - return -1; /* error */
1374 - /* set initial values for control structures */
1375 + return -ENOMEM;
1376 +
1377 spin_lock_init(&priv->lock);
1378 priv->control_state = 0;
1379 priv->last_lsr = 0;
1380 @@ -142,18 +140,19 @@ static int belkin_sa_startup(struct usb_serial *serial)
1381 le16_to_cpu(dev->descriptor.bcdDevice),
1382 priv->bad_flow_control);
1383
1384 - init_waitqueue_head(&serial->port[0]->write_wait);
1385 - usb_set_serial_port_data(serial->port[0], priv);
1386 + usb_set_serial_port_data(port, priv);
1387
1388 return 0;
1389 }
1390
1391 -static void belkin_sa_release(struct usb_serial *serial)
1392 +static int belkin_sa_port_remove(struct usb_serial_port *port)
1393 {
1394 - int i;
1395 + struct belkin_sa_private *priv;
1396
1397 - for (i = 0; i < serial->num_ports; ++i)
1398 - kfree(usb_get_serial_port_data(serial->port[i]));
1399 + priv = usb_get_serial_port_data(port);
1400 + kfree(priv);
1401 +
1402 + return 0;
1403 }
1404
1405 static int belkin_sa_open(struct tty_struct *tty,
1406 diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
1407 index 1e71079..4ea9e33 100644
1408 --- a/drivers/usb/serial/cp210x.c
1409 +++ b/drivers/usb/serial/cp210x.c
1410 @@ -164,7 +164,7 @@ static const struct usb_device_id id_table[] = {
1411
1412 MODULE_DEVICE_TABLE(usb, id_table);
1413
1414 -struct cp210x_port_private {
1415 +struct cp210x_serial_private {
1416 __u8 bInterfaceNumber;
1417 };
1418
1419 @@ -278,7 +278,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request,
1420 unsigned int *data, int size)
1421 {
1422 struct usb_serial *serial = port->serial;
1423 - struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
1424 + struct cp210x_serial_private *spriv = usb_get_serial_data(serial);
1425 __le32 *buf;
1426 int result, i, length;
1427
1428 @@ -294,7 +294,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request,
1429 /* Issue the request, attempting to read 'size' bytes */
1430 result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
1431 request, REQTYPE_INTERFACE_TO_HOST, 0x0000,
1432 - port_priv->bInterfaceNumber, buf, size,
1433 + spriv->bInterfaceNumber, buf, size,
1434 USB_CTRL_GET_TIMEOUT);
1435
1436 /* Convert data into an array of integers */
1437 @@ -326,7 +326,7 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request,
1438 unsigned int *data, int size)
1439 {
1440 struct usb_serial *serial = port->serial;
1441 - struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
1442 + struct cp210x_serial_private *spriv = usb_get_serial_data(serial);
1443 __le32 *buf;
1444 int result, i, length;
1445
1446 @@ -348,13 +348,13 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request,
1447 result = usb_control_msg(serial->dev,
1448 usb_sndctrlpipe(serial->dev, 0),
1449 request, REQTYPE_HOST_TO_INTERFACE, 0x0000,
1450 - port_priv->bInterfaceNumber, buf, size,
1451 + spriv->bInterfaceNumber, buf, size,
1452 USB_CTRL_SET_TIMEOUT);
1453 } else {
1454 result = usb_control_msg(serial->dev,
1455 usb_sndctrlpipe(serial->dev, 0),
1456 request, REQTYPE_HOST_TO_INTERFACE, data[0],
1457 - port_priv->bInterfaceNumber, NULL, 0,
1458 + spriv->bInterfaceNumber, NULL, 0,
1459 USB_CTRL_SET_TIMEOUT);
1460 }
1461
1462 @@ -854,37 +854,30 @@ static void cp210x_break_ctl (struct tty_struct *tty, int break_state)
1463
1464 static int cp210x_startup(struct usb_serial *serial)
1465 {
1466 - struct cp210x_port_private *port_priv;
1467 - int i;
1468 + struct usb_host_interface *cur_altsetting;
1469 + struct cp210x_serial_private *spriv;
1470
1471 /* cp210x buffers behave strangely unless device is reset */
1472 usb_reset_device(serial->dev);
1473
1474 - for (i = 0; i < serial->num_ports; i++) {
1475 - port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL);
1476 - if (!port_priv)
1477 - return -ENOMEM;
1478 + spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
1479 + if (!spriv)
1480 + return -ENOMEM;
1481
1482 - memset(port_priv, 0x00, sizeof(*port_priv));
1483 - port_priv->bInterfaceNumber =
1484 - serial->interface->cur_altsetting->desc.bInterfaceNumber;
1485 + cur_altsetting = serial->interface->cur_altsetting;
1486 + spriv->bInterfaceNumber = cur_altsetting->desc.bInterfaceNumber;
1487
1488 - usb_set_serial_port_data(serial->port[i], port_priv);
1489 - }
1490 + usb_set_serial_data(serial, spriv);
1491
1492 return 0;
1493 }
1494
1495 static void cp210x_release(struct usb_serial *serial)
1496 {
1497 - struct cp210x_port_private *port_priv;
1498 - int i;
1499 + struct cp210x_serial_private *spriv;
1500
1501 - for (i = 0; i < serial->num_ports; i++) {
1502 - port_priv = usb_get_serial_port_data(serial->port[i]);
1503 - kfree(port_priv);
1504 - usb_set_serial_port_data(serial->port[i], NULL);
1505 - }
1506 + spriv = usb_get_serial_data(serial);
1507 + kfree(spriv);
1508 }
1509
1510 module_usb_serial_driver(serial_drivers, id_table);
1511 diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
1512 index 3aa0b53..bfec6f4 100644
1513 --- a/drivers/usb/serial/cyberjack.c
1514 +++ b/drivers/usb/serial/cyberjack.c
1515 @@ -57,9 +57,9 @@ static bool debug;
1516 #define CYBERJACK_PRODUCT_ID 0x0100
1517
1518 /* Function prototypes */
1519 -static int cyberjack_startup(struct usb_serial *serial);
1520 static void cyberjack_disconnect(struct usb_serial *serial);
1521 -static void cyberjack_release(struct usb_serial *serial);
1522 +static int cyberjack_port_probe(struct usb_serial_port *port);
1523 +static int cyberjack_port_remove(struct usb_serial_port *port);
1524 static int cyberjack_open(struct tty_struct *tty,
1525 struct usb_serial_port *port);
1526 static void cyberjack_close(struct usb_serial_port *port);
1527 @@ -85,9 +85,9 @@ static struct usb_serial_driver cyberjack_device = {
1528 .description = "Reiner SCT Cyberjack USB card reader",
1529 .id_table = id_table,
1530 .num_ports = 1,
1531 - .attach = cyberjack_startup,
1532 .disconnect = cyberjack_disconnect,
1533 - .release = cyberjack_release,
1534 + .port_probe = cyberjack_port_probe,
1535 + .port_remove = cyberjack_port_remove,
1536 .open = cyberjack_open,
1537 .close = cyberjack_close,
1538 .write = cyberjack_write,
1539 @@ -109,55 +109,45 @@ struct cyberjack_private {
1540 short wrsent; /* Data already sent */
1541 };
1542
1543 -/* do some startup allocations not currently performed by usb_serial_probe() */
1544 -static int cyberjack_startup(struct usb_serial *serial)
1545 +static int cyberjack_port_probe(struct usb_serial_port *port)
1546 {
1547 struct cyberjack_private *priv;
1548 - int i;
1549 + int result;
1550
1551 - /* allocate the private data structure */
1552 priv = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL);
1553 if (!priv)
1554 return -ENOMEM;
1555
1556 - /* set initial values */
1557 spin_lock_init(&priv->lock);
1558 priv->rdtodo = 0;
1559 priv->wrfilled = 0;
1560 priv->wrsent = 0;
1561 - usb_set_serial_port_data(serial->port[0], priv);
1562
1563 - init_waitqueue_head(&serial->port[0]->write_wait);
1564 + usb_set_serial_port_data(port, priv);
1565
1566 - for (i = 0; i < serial->num_ports; ++i) {
1567 - int result;
1568 - result = usb_submit_urb(serial->port[i]->interrupt_in_urb,
1569 - GFP_KERNEL);
1570 - if (result)
1571 - dev_err(&serial->dev->dev,
1572 - "usb_submit_urb(read int) failed\n");
1573 - dbg("%s - usb_submit_urb(int urb)", __func__);
1574 - }
1575 + result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1576 + if (result)
1577 + dev_err(&port->dev, "usb_submit_urb(read int) failed\n");
1578
1579 return 0;
1580 }
1581
1582 -static void cyberjack_disconnect(struct usb_serial *serial)
1583 +static int cyberjack_port_remove(struct usb_serial_port *port)
1584 {
1585 - int i;
1586 + struct cyberjack_private *priv;
1587
1588 - for (i = 0; i < serial->num_ports; ++i)
1589 - usb_kill_urb(serial->port[i]->interrupt_in_urb);
1590 + priv = usb_get_serial_port_data(port);
1591 + kfree(priv);
1592 +
1593 + return 0;
1594 }
1595
1596 -static void cyberjack_release(struct usb_serial *serial)
1597 +static void cyberjack_disconnect(struct usb_serial *serial)
1598 {
1599 int i;
1600
1601 - for (i = 0; i < serial->num_ports; ++i) {
1602 - /* My special items, the standard routines free my urbs */
1603 - kfree(usb_get_serial_port_data(serial->port[i]));
1604 - }
1605 + for (i = 0; i < serial->num_ports; ++i)
1606 + usb_kill_urb(serial->port[i]->interrupt_in_urb);
1607 }
1608
1609 static int cyberjack_open(struct tty_struct *tty,
1610 diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
1611 index b78c34e..5ad6e7d 100644
1612 --- a/drivers/usb/serial/cypress_m8.c
1613 +++ b/drivers/usb/serial/cypress_m8.c
1614 @@ -124,10 +124,10 @@ struct cypress_private {
1615 };
1616
1617 /* function prototypes for the Cypress USB to serial device */
1618 -static int cypress_earthmate_startup(struct usb_serial *serial);
1619 -static int cypress_hidcom_startup(struct usb_serial *serial);
1620 -static int cypress_ca42v2_startup(struct usb_serial *serial);
1621 -static void cypress_release(struct usb_serial *serial);
1622 +static int cypress_earthmate_port_probe(struct usb_serial_port *port);
1623 +static int cypress_hidcom_port_probe(struct usb_serial_port *port);
1624 +static int cypress_ca42v2_port_probe(struct usb_serial_port *port);
1625 +static int cypress_port_remove(struct usb_serial_port *port);
1626 static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port);
1627 static void cypress_close(struct usb_serial_port *port);
1628 static void cypress_dtr_rts(struct usb_serial_port *port, int on);
1629 @@ -157,8 +157,8 @@ static struct usb_serial_driver cypress_earthmate_device = {
1630 .description = "DeLorme Earthmate USB",
1631 .id_table = id_table_earthmate,
1632 .num_ports = 1,
1633 - .attach = cypress_earthmate_startup,
1634 - .release = cypress_release,
1635 + .port_probe = cypress_earthmate_port_probe,
1636 + .port_remove = cypress_port_remove,
1637 .open = cypress_open,
1638 .close = cypress_close,
1639 .dtr_rts = cypress_dtr_rts,
1640 @@ -183,8 +183,8 @@ static struct usb_serial_driver cypress_hidcom_device = {
1641 .description = "HID->COM RS232 Adapter",
1642 .id_table = id_table_cyphidcomrs232,
1643 .num_ports = 1,
1644 - .attach = cypress_hidcom_startup,
1645 - .release = cypress_release,
1646 + .port_probe = cypress_hidcom_port_probe,
1647 + .port_remove = cypress_port_remove,
1648 .open = cypress_open,
1649 .close = cypress_close,
1650 .dtr_rts = cypress_dtr_rts,
1651 @@ -209,8 +209,8 @@ static struct usb_serial_driver cypress_ca42v2_device = {
1652 .description = "Nokia CA-42 V2 Adapter",
1653 .id_table = id_table_nokiaca42v2,
1654 .num_ports = 1,
1655 - .attach = cypress_ca42v2_startup,
1656 - .release = cypress_release,
1657 + .port_probe = cypress_ca42v2_port_probe,
1658 + .port_remove = cypress_port_remove,
1659 .open = cypress_open,
1660 .close = cypress_close,
1661 .dtr_rts = cypress_dtr_rts,
1662 @@ -437,10 +437,10 @@ static void cypress_set_dead(struct usb_serial_port *port)
1663 *****************************************************************************/
1664
1665
1666 -static int generic_startup(struct usb_serial *serial)
1667 +static int cypress_generic_port_probe(struct usb_serial_port *port)
1668 {
1669 + struct usb_serial *serial = port->serial;
1670 struct cypress_private *priv;
1671 - struct usb_serial_port *port = serial->port[0];
1672
1673 priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL);
1674 if (!priv)
1675 @@ -489,15 +489,17 @@ static int generic_startup(struct usb_serial *serial)
1676 }
1677
1678
1679 -static int cypress_earthmate_startup(struct usb_serial *serial)
1680 +static int cypress_earthmate_port_probe(struct usb_serial_port *port)
1681 {
1682 + struct usb_serial *serial = port->serial;
1683 struct cypress_private *priv;
1684 - struct usb_serial_port *port = serial->port[0];
1685 + int ret;
1686
1687 - if (generic_startup(serial)) {
1688 + ret = cypress_generic_port_probe(port);
1689 + if (ret) {
1690 dbg("%s - Failed setting up port %d", __func__,
1691 port->number);
1692 - return 1;
1693 + return ret;
1694 }
1695
1696 priv = usb_get_serial_port_data(port);
1697 @@ -517,54 +519,52 @@ static int cypress_earthmate_startup(struct usb_serial *serial)
1698 }
1699
1700 return 0;
1701 -} /* cypress_earthmate_startup */
1702 -
1703 +}
1704
1705 -static int cypress_hidcom_startup(struct usb_serial *serial)
1706 +static int cypress_hidcom_port_probe(struct usb_serial_port *port)
1707 {
1708 struct cypress_private *priv;
1709 + int ret;
1710
1711 - if (generic_startup(serial)) {
1712 - dbg("%s - Failed setting up port %d", __func__,
1713 - serial->port[0]->number);
1714 - return 1;
1715 + ret = cypress_generic_port_probe(port);
1716 + if (ret) {
1717 + dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__);
1718 + return ret;
1719 }
1720
1721 - priv = usb_get_serial_port_data(serial->port[0]);
1722 + priv = usb_get_serial_port_data(port);
1723 priv->chiptype = CT_CYPHIDCOM;
1724
1725 return 0;
1726 -} /* cypress_hidcom_startup */
1727 -
1728 +}
1729
1730 -static int cypress_ca42v2_startup(struct usb_serial *serial)
1731 +static int cypress_ca42v2_port_probe(struct usb_serial_port *port)
1732 {
1733 struct cypress_private *priv;
1734 + int ret;
1735
1736 - if (generic_startup(serial)) {
1737 - dbg("%s - Failed setting up port %d", __func__,
1738 - serial->port[0]->number);
1739 - return 1;
1740 + ret = cypress_generic_port_probe(port);
1741 + if (ret) {
1742 + dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__);
1743 + return ret;
1744 }
1745
1746 - priv = usb_get_serial_port_data(serial->port[0]);
1747 + priv = usb_get_serial_port_data(port);
1748 priv->chiptype = CT_CA42V2;
1749
1750 return 0;
1751 -} /* cypress_ca42v2_startup */
1752 -
1753 +}
1754
1755 -static void cypress_release(struct usb_serial *serial)
1756 +static int cypress_port_remove(struct usb_serial_port *port)
1757 {
1758 struct cypress_private *priv;
1759
1760 - /* all open ports are closed at this point */
1761 - priv = usb_get_serial_port_data(serial->port[0]);
1762 + priv = usb_get_serial_port_data(port);
1763 +
1764 + kfifo_free(&priv->write_fifo);
1765 + kfree(priv);
1766
1767 - if (priv) {
1768 - kfifo_free(&priv->write_fifo);
1769 - kfree(priv);
1770 - }
1771 + return 0;
1772 }
1773
1774
1775 diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c
1776 index 499b15f..be94436 100644
1777 --- a/drivers/usb/serial/f81232.c
1778 +++ b/drivers/usb/serial/f81232.c
1779 @@ -319,39 +319,30 @@ static int f81232_ioctl(struct tty_struct *tty,
1780 return -ENOIOCTLCMD;
1781 }
1782
1783 -static int f81232_startup(struct usb_serial *serial)
1784 +static int f81232_port_probe(struct usb_serial_port *port)
1785 {
1786 struct f81232_private *priv;
1787 - int i;
1788
1789 - for (i = 0; i < serial->num_ports; ++i) {
1790 - priv = kzalloc(sizeof(struct f81232_private), GFP_KERNEL);
1791 - if (!priv)
1792 - goto cleanup;
1793 - spin_lock_init(&priv->lock);
1794 - init_waitqueue_head(&priv->delta_msr_wait);
1795 - usb_set_serial_port_data(serial->port[i], priv);
1796 - }
1797 - return 0;
1798 + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1799 + if (!priv)
1800 + return -ENOMEM;
1801
1802 -cleanup:
1803 - for (--i; i >= 0; --i) {
1804 - priv = usb_get_serial_port_data(serial->port[i]);
1805 - kfree(priv);
1806 - usb_set_serial_port_data(serial->port[i], NULL);
1807 - }
1808 - return -ENOMEM;
1809 + spin_lock_init(&priv->lock);
1810 + init_waitqueue_head(&priv->delta_msr_wait);
1811 +
1812 + usb_set_serial_port_data(port, priv);
1813 +
1814 + return 0;
1815 }
1816
1817 -static void f81232_release(struct usb_serial *serial)
1818 +static int f81232_port_remove(struct usb_serial_port *port)
1819 {
1820 - int i;
1821 struct f81232_private *priv;
1822
1823 - for (i = 0; i < serial->num_ports; ++i) {
1824 - priv = usb_get_serial_port_data(serial->port[i]);
1825 - kfree(priv);
1826 - }
1827 + priv = usb_get_serial_port_data(port);
1828 + kfree(priv);
1829 +
1830 + return 0;
1831 }
1832
1833 static struct usb_serial_driver f81232_device = {
1834 @@ -374,8 +365,8 @@ static struct usb_serial_driver f81232_device = {
1835 .tiocmset = f81232_tiocmset,
1836 .process_read_urb = f81232_process_read_urb,
1837 .read_int_callback = f81232_read_int_callback,
1838 - .attach = f81232_startup,
1839 - .release = f81232_release,
1840 + .port_probe = f81232_port_probe,
1841 + .port_remove = f81232_port_remove,
1842 };
1843
1844 static struct usb_serial_driver * const serial_drivers[] = {
1845 diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
1846 index 346c15a..de9cfd4 100644
1847 --- a/drivers/usb/serial/garmin_gps.c
1848 +++ b/drivers/usb/serial/garmin_gps.c
1849 @@ -1414,11 +1414,10 @@ static void timeout_handler(unsigned long data)
1850
1851
1852
1853 -static int garmin_attach(struct usb_serial *serial)
1854 +static int garmin_port_probe(struct usb_serial_port *port)
1855 {
1856 - int status = 0;
1857 - struct usb_serial_port *port = serial->port[0];
1858 - struct garmin_data *garmin_data_p = NULL;
1859 + int status;
1860 + struct garmin_data *garmin_data_p;
1861
1862 garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL);
1863 if (garmin_data_p == NULL) {
1864 @@ -1443,22 +1442,14 @@ static int garmin_attach(struct usb_serial *serial)
1865 }
1866
1867
1868 -static void garmin_disconnect(struct usb_serial *serial)
1869 +static int garmin_port_remove(struct usb_serial_port *port)
1870 {
1871 - struct usb_serial_port *port = serial->port[0];
1872 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1873
1874 usb_kill_urb(port->interrupt_in_urb);
1875 del_timer_sync(&garmin_data_p->timer);
1876 -}
1877 -
1878 -
1879 -static void garmin_release(struct usb_serial *serial)
1880 -{
1881 - struct usb_serial_port *port = serial->port[0];
1882 - struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1883 -
1884 kfree(garmin_data_p);
1885 + return 0;
1886 }
1887
1888
1889 @@ -1475,9 +1466,8 @@ static struct usb_serial_driver garmin_device = {
1890 .close = garmin_close,
1891 .throttle = garmin_throttle,
1892 .unthrottle = garmin_unthrottle,
1893 - .attach = garmin_attach,
1894 - .disconnect = garmin_disconnect,
1895 - .release = garmin_release,
1896 + .port_probe = garmin_port_probe,
1897 + .port_remove = garmin_port_remove,
1898 .write = garmin_write,
1899 .write_room = garmin_write_room,
1900 .write_bulk_callback = garmin_write_bulk_callback,
1901 diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
1902 index e1f5ccd..dca27a5 100644
1903 --- a/drivers/usb/serial/io_edgeport.c
1904 +++ b/drivers/usb/serial/io_edgeport.c
1905 @@ -228,6 +228,8 @@ static int edge_get_icount(struct tty_struct *tty,
1906 static int edge_startup(struct usb_serial *serial);
1907 static void edge_disconnect(struct usb_serial *serial);
1908 static void edge_release(struct usb_serial *serial);
1909 +static int edge_port_probe(struct usb_serial_port *port);
1910 +static int edge_port_remove(struct usb_serial_port *port);
1911
1912 #include "io_tables.h" /* all of the devices that this driver supports */
1913
1914 @@ -2921,9 +2923,8 @@ static void load_application_firmware(struct edgeport_serial *edge_serial)
1915 static int edge_startup(struct usb_serial *serial)
1916 {
1917 struct edgeport_serial *edge_serial;
1918 - struct edgeport_port *edge_port;
1919 struct usb_device *dev;
1920 - int i, j;
1921 + int i;
1922 int response;
1923 bool interrupt_in_found;
1924 bool bulk_in_found;
1925 @@ -3007,26 +3008,6 @@ static int edge_startup(struct usb_serial *serial)
1926 /* we set up the pointers to the endpoints in the edge_open function,
1927 * as the structures aren't created yet. */
1928
1929 - /* set up our port private structures */
1930 - for (i = 0; i < serial->num_ports; ++i) {
1931 - edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL);
1932 - if (edge_port == NULL) {
1933 - dev_err(&serial->dev->dev, "%s - Out of memory\n",
1934 - __func__);
1935 - for (j = 0; j < i; ++j) {
1936 - kfree(usb_get_serial_port_data(serial->port[j]));
1937 - usb_set_serial_port_data(serial->port[j],
1938 - NULL);
1939 - }
1940 - usb_set_serial_data(serial, NULL);
1941 - kfree(edge_serial);
1942 - return -ENOMEM;
1943 - }
1944 - spin_lock_init(&edge_port->ep_lock);
1945 - edge_port->port = serial->port[i];
1946 - usb_set_serial_port_data(serial->port[i], edge_port);
1947 - }
1948 -
1949 response = 0;
1950
1951 if (edge_serial->is_epic) {
1952 @@ -3175,12 +3156,35 @@ static void edge_release(struct usb_serial *serial)
1953
1954 dbg("%s", __func__);
1955
1956 - for (i = 0; i < serial->num_ports; ++i)
1957 - kfree(usb_get_serial_port_data(serial->port[i]));
1958 -
1959 kfree(edge_serial);
1960 }
1961
1962 +static int edge_port_probe(struct usb_serial_port *port)
1963 +{
1964 + struct edgeport_port *edge_port;
1965 +
1966 + edge_port = kzalloc(sizeof(*edge_port), GFP_KERNEL);
1967 + if (!edge_port)
1968 + return -ENOMEM;
1969 +
1970 + spin_lock_init(&edge_port->ep_lock);
1971 + edge_port->port = port;
1972 +
1973 + usb_set_serial_port_data(port, edge_port);
1974 +
1975 + return 0;
1976 +}
1977 +
1978 +static int edge_port_remove(struct usb_serial_port *port)
1979 +{
1980 + struct edgeport_port *edge_port;
1981 +
1982 + edge_port = usb_get_serial_port_data(port);
1983 + kfree(edge_port);
1984 +
1985 + return 0;
1986 +}
1987 +
1988 module_usb_serial_driver(serial_drivers, id_table_combined);
1989
1990 MODULE_AUTHOR(DRIVER_AUTHOR);
1991 diff --git a/drivers/usb/serial/io_tables.h b/drivers/usb/serial/io_tables.h
1992 index 350afdd..1511dd0 100644
1993 --- a/drivers/usb/serial/io_tables.h
1994 +++ b/drivers/usb/serial/io_tables.h
1995 @@ -110,6 +110,8 @@ static struct usb_serial_driver edgeport_2port_device = {
1996 .attach = edge_startup,
1997 .disconnect = edge_disconnect,
1998 .release = edge_release,
1999 + .port_probe = edge_port_probe,
2000 + .port_remove = edge_port_remove,
2001 .ioctl = edge_ioctl,
2002 .set_termios = edge_set_termios,
2003 .tiocmget = edge_tiocmget,
2004 @@ -139,6 +141,8 @@ static struct usb_serial_driver edgeport_4port_device = {
2005 .attach = edge_startup,
2006 .disconnect = edge_disconnect,
2007 .release = edge_release,
2008 + .port_probe = edge_port_probe,
2009 + .port_remove = edge_port_remove,
2010 .ioctl = edge_ioctl,
2011 .set_termios = edge_set_termios,
2012 .tiocmget = edge_tiocmget,
2013 @@ -168,6 +172,8 @@ static struct usb_serial_driver edgeport_8port_device = {
2014 .attach = edge_startup,
2015 .disconnect = edge_disconnect,
2016 .release = edge_release,
2017 + .port_probe = edge_port_probe,
2018 + .port_remove = edge_port_remove,
2019 .ioctl = edge_ioctl,
2020 .set_termios = edge_set_termios,
2021 .tiocmget = edge_tiocmget,
2022 @@ -197,6 +203,8 @@ static struct usb_serial_driver epic_device = {
2023 .attach = edge_startup,
2024 .disconnect = edge_disconnect,
2025 .release = edge_release,
2026 + .port_probe = edge_port_probe,
2027 + .port_remove = edge_port_remove,
2028 .ioctl = edge_ioctl,
2029 .set_termios = edge_set_termios,
2030 .tiocmget = edge_tiocmget,
2031 diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
2032 index 3936904..ccf297d 100644
2033 --- a/drivers/usb/serial/io_ti.c
2034 +++ b/drivers/usb/serial/io_ti.c
2035 @@ -2594,12 +2594,7 @@ static void edge_break(struct tty_struct *tty, int break_state)
2036 static int edge_startup(struct usb_serial *serial)
2037 {
2038 struct edgeport_serial *edge_serial;
2039 - struct edgeport_port *edge_port;
2040 - struct usb_device *dev;
2041 int status;
2042 - int i;
2043 -
2044 - dev = serial->dev;
2045
2046 /* create our private serial structure */
2047 edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL);
2048 @@ -2617,40 +2612,7 @@ static int edge_startup(struct usb_serial *serial)
2049 return status;
2050 }
2051
2052 - /* set up our port private structures */
2053 - for (i = 0; i < serial->num_ports; ++i) {
2054 - edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL);
2055 - if (edge_port == NULL) {
2056 - dev_err(&serial->dev->dev, "%s - Out of memory\n",
2057 - __func__);
2058 - goto cleanup;
2059 - }
2060 - spin_lock_init(&edge_port->ep_lock);
2061 - if (kfifo_alloc(&edge_port->write_fifo, EDGE_OUT_BUF_SIZE,
2062 - GFP_KERNEL)) {
2063 - dev_err(&serial->dev->dev, "%s - Out of memory\n",
2064 - __func__);
2065 - kfree(edge_port);
2066 - goto cleanup;
2067 - }
2068 - edge_port->port = serial->port[i];
2069 - edge_port->edge_serial = edge_serial;
2070 - usb_set_serial_port_data(serial->port[i], edge_port);
2071 - edge_port->bUartMode = default_uart_mode;
2072 - }
2073 -
2074 return 0;
2075 -
2076 -cleanup:
2077 - for (--i; i >= 0; --i) {
2078 - edge_port = usb_get_serial_port_data(serial->port[i]);
2079 - kfifo_free(&edge_port->write_fifo);
2080 - kfree(edge_port);
2081 - usb_set_serial_port_data(serial->port[i], NULL);
2082 - }
2083 - kfree(edge_serial);
2084 - usb_set_serial_data(serial, NULL);
2085 - return -ENOMEM;
2086 }
2087
2088 static void edge_disconnect(struct usb_serial *serial)
2089 @@ -2660,19 +2622,54 @@ static void edge_disconnect(struct usb_serial *serial)
2090
2091 static void edge_release(struct usb_serial *serial)
2092 {
2093 - int i;
2094 + kfree(usb_get_serial_data(serial));
2095 +}
2096 +
2097 +static int edge_port_probe(struct usb_serial_port *port)
2098 +{
2099 struct edgeport_port *edge_port;
2100 + int ret;
2101
2102 - dbg("%s", __func__);
2103 + edge_port = kzalloc(sizeof(*edge_port), GFP_KERNEL);
2104 + if (!edge_port)
2105 + return -ENOMEM;
2106 +
2107 + ret = kfifo_alloc(&edge_port->write_fifo, EDGE_OUT_BUF_SIZE,
2108 + GFP_KERNEL);
2109 + if (ret) {
2110 + kfree(edge_port);
2111 + return -ENOMEM;
2112 + }
2113 +
2114 + spin_lock_init(&edge_port->ep_lock);
2115 + edge_port->port = port;
2116 + edge_port->edge_serial = usb_get_serial_data(port->serial);
2117 + edge_port->bUartMode = default_uart_mode;
2118 +
2119 + usb_set_serial_port_data(port, edge_port);
2120
2121 - for (i = 0; i < serial->num_ports; ++i) {
2122 - edge_port = usb_get_serial_port_data(serial->port[i]);
2123 + ret = edge_create_sysfs_attrs(port);
2124 + if (ret) {
2125 kfifo_free(&edge_port->write_fifo);
2126 kfree(edge_port);
2127 + return ret;
2128 }
2129 - kfree(usb_get_serial_data(serial));
2130 +
2131 + return 0;
2132 }
2133
2134 +static int edge_port_remove(struct usb_serial_port *port)
2135 +{
2136 + struct edgeport_port *edge_port;
2137 +
2138 + edge_port = usb_get_serial_port_data(port);
2139 +
2140 + edge_remove_sysfs_attrs(port);
2141 + kfifo_free(&edge_port->write_fifo);
2142 + kfree(edge_port);
2143 +
2144 + return 0;
2145 +}
2146
2147 /* Sysfs Attributes */
2148
2149 @@ -2732,8 +2729,8 @@ static struct usb_serial_driver edgeport_1port_device = {
2150 .attach = edge_startup,
2151 .disconnect = edge_disconnect,
2152 .release = edge_release,
2153 - .port_probe = edge_create_sysfs_attrs,
2154 - .port_remove = edge_remove_sysfs_attrs,
2155 + .port_probe = edge_port_probe,
2156 + .port_remove = edge_port_remove,
2157 .ioctl = edge_ioctl,
2158 .set_termios = edge_set_termios,
2159 .tiocmget = edge_tiocmget,
2160 @@ -2763,8 +2760,8 @@ static struct usb_serial_driver edgeport_2port_device = {
2161 .attach = edge_startup,
2162 .disconnect = edge_disconnect,
2163 .release = edge_release,
2164 - .port_probe = edge_create_sysfs_attrs,
2165 - .port_remove = edge_remove_sysfs_attrs,
2166 + .port_probe = edge_port_probe,
2167 + .port_remove = edge_port_remove,
2168 .ioctl = edge_ioctl,
2169 .set_termios = edge_set_termios,
2170 .tiocmget = edge_tiocmget,
2171 diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
2172 index 22b1eb5..cdf0f99 100644
2173 --- a/drivers/usb/serial/iuu_phoenix.c
2174 +++ b/drivers/usb/serial/iuu_phoenix.c
2175 @@ -60,6 +60,8 @@ static int iuu_cardout;
2176 static bool xmas;
2177 static int vcc_default = 5;
2178
2179 +static int iuu_create_sysfs_attrs(struct usb_serial_port *port);
2180 +static int iuu_remove_sysfs_attrs(struct usb_serial_port *port);
2181 static void read_rxcmd_callback(struct urb *urb);
2182
2183 struct iuu_private {
2184 @@ -80,64 +82,64 @@ struct iuu_private {
2185 u32 clk;
2186 };
2187
2188 -
2189 -static void iuu_free_buf(struct iuu_private *priv)
2190 +static int iuu_port_probe(struct usb_serial_port *port)
2191 {
2192 - kfree(priv->buf);
2193 - kfree(priv->dbgbuf);
2194 - kfree(priv->writebuf);
2195 -}
2196 + struct iuu_private *priv;
2197 + int ret;
2198 +
2199 + priv = kzalloc(sizeof(struct iuu_private), GFP_KERNEL);
2200 + if (!priv)
2201 + return -ENOMEM;
2202
2203 -static int iuu_alloc_buf(struct iuu_private *priv)
2204 -{
2205 priv->buf = kzalloc(256, GFP_KERNEL);
2206 - priv->dbgbuf = kzalloc(256, GFP_KERNEL);
2207 - priv->writebuf = kzalloc(256, GFP_KERNEL);
2208 - if (!priv->buf || !priv->dbgbuf || !priv->writebuf) {
2209 - iuu_free_buf(priv);
2210 - dbg("%s problem allocation buffer", __func__);
2211 + if (!priv->buf) {
2212 + kfree(priv);
2213 return -ENOMEM;
2214 }
2215 - dbg("%s - Privates buffers allocation success", __func__);
2216 - return 0;
2217 -}
2218
2219 -static int iuu_startup(struct usb_serial *serial)
2220 -{
2221 - struct iuu_private *priv;
2222 - priv = kzalloc(sizeof(struct iuu_private), GFP_KERNEL);
2223 - dbg("%s- priv allocation success", __func__);
2224 - if (!priv)
2225 + priv->writebuf = kzalloc(256, GFP_KERNEL);
2226 + if (!priv->writebuf) {
2227 + kfree(priv->buf);
2228 + kfree(priv);
2229 return -ENOMEM;
2230 - if (iuu_alloc_buf(priv)) {
2231 + }
2232 +
2233 + priv->dbgbuf = kzalloc(256, GFP_KERNEL);
2234 + if (!priv->writebuf) {
2235 + kfree(priv->writebuf);
2236 + kfree(priv->buf);
2237 kfree(priv);
2238 return -ENOMEM;
2239 }
2240 +
2241 priv->vcc = vcc_default;
2242 spin_lock_init(&priv->lock);
2243 init_waitqueue_head(&priv->delta_msr_wait);
2244 - usb_set_serial_port_data(serial->port[0], priv);
2245 +
2246 + usb_set_serial_port_data(port, priv);
2247 +
2248 + ret = iuu_create_sysfs_attrs(port);
2249 + if (ret) {
2250 + kfree(priv->writebuf);
2251 + kfree(priv->buf);
2252 + kfree(priv);
2253 + return ret;
2254 + }
2255 +
2256 return 0;
2257 }
2258
2259 -/* Release function */
2260 -static void iuu_release(struct usb_serial *serial)
2261 +static int iuu_port_remove(struct usb_serial_port *port)
2262 {
2263 - struct usb_serial_port *port = serial->port[0];
2264 struct iuu_private *priv = usb_get_serial_port_data(port);
2265 - if (!port)
2266 - return;
2267 -
2268 - if (priv) {
2269 - iuu_free_buf(priv);
2270 - dbg("%s - I will free all", __func__);
2271 - usb_set_serial_port_data(port, NULL);
2272
2273 - dbg("%s - priv is not anymore in port structure", __func__);
2274 - kfree(priv);
2275 + iuu_remove_sysfs_attrs(port);
2276 + kfree(priv->dbgbuf);
2277 + kfree(priv->writebuf);
2278 + kfree(priv->buf);
2279 + kfree(priv);
2280
2281 - dbg("%s priv is now kfree", __func__);
2282 - }
2283 + return 0;
2284 }
2285
2286 static int iuu_tiocmset(struct tty_struct *tty,
2287 @@ -1231,8 +1233,6 @@ static struct usb_serial_driver iuu_device = {
2288 .num_ports = 1,
2289 .bulk_in_size = 512,
2290 .bulk_out_size = 512,
2291 - .port_probe = iuu_create_sysfs_attrs,
2292 - .port_remove = iuu_remove_sysfs_attrs,
2293 .open = iuu_open,
2294 .close = iuu_close,
2295 .write = iuu_uart_write,
2296 @@ -1241,8 +1241,8 @@ static struct usb_serial_driver iuu_device = {
2297 .tiocmset = iuu_tiocmset,
2298 .set_termios = iuu_set_termios,
2299 .init_termios = iuu_init_termios,
2300 - .attach = iuu_startup,
2301 - .release = iuu_release,
2302 + .port_probe = iuu_port_probe,
2303 + .port_remove = iuu_port_remove,
2304 };
2305
2306 static struct usb_serial_driver * const serial_drivers[] = {
2307 diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
2308 index a4ac3cf..1e73171 100644
2309 --- a/drivers/usb/serial/keyspan_pda.c
2310 +++ b/drivers/usb/serial/keyspan_pda.c
2311 @@ -735,29 +735,33 @@ MODULE_FIRMWARE("keyspan_pda/keyspan_pda.fw");
2312 MODULE_FIRMWARE("keyspan_pda/xircom_pgs.fw");
2313 #endif
2314
2315 -static int keyspan_pda_startup(struct usb_serial *serial)
2316 +static int keyspan_pda_port_probe(struct usb_serial_port *port)
2317 {
2318
2319 struct keyspan_pda_private *priv;
2320
2321 - /* allocate the private data structures for all ports. Well, for all
2322 - one ports. */
2323 -
2324 priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL);
2325 if (!priv)
2326 - return 1; /* error */
2327 - usb_set_serial_port_data(serial->port[0], priv);
2328 - init_waitqueue_head(&serial->port[0]->write_wait);
2329 + return -ENOMEM;
2330 +
2331 INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write);
2332 INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle);
2333 - priv->serial = serial;
2334 - priv->port = serial->port[0];
2335 + priv->serial = port->serial;
2336 + priv->port = port;
2337 +
2338 + usb_set_serial_port_data(port, priv);
2339 +
2340 return 0;
2341 }
2342
2343 -static void keyspan_pda_release(struct usb_serial *serial)
2344 +static int keyspan_pda_port_remove(struct usb_serial_port *port)
2345 {
2346 - kfree(usb_get_serial_port_data(serial->port[0]));
2347 + struct keyspan_pda_private *priv;
2348 +
2349 + priv = usb_get_serial_port_data(port);
2350 + kfree(priv);
2351 +
2352 + return 0;
2353 }
2354
2355 #ifdef KEYSPAN
2356 @@ -808,8 +812,8 @@ static struct usb_serial_driver keyspan_pda_device = {
2357 .break_ctl = keyspan_pda_break_ctl,
2358 .tiocmget = keyspan_pda_tiocmget,
2359 .tiocmset = keyspan_pda_tiocmset,
2360 - .attach = keyspan_pda_startup,
2361 - .release = keyspan_pda_release,
2362 + .port_probe = keyspan_pda_port_probe,
2363 + .port_remove = keyspan_pda_port_remove,
2364 };
2365
2366 static struct usb_serial_driver * const serial_drivers[] = {
2367 diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
2368 index 5bed59c..366ddee 100644
2369 --- a/drivers/usb/serial/kl5kusb105.c
2370 +++ b/drivers/usb/serial/kl5kusb105.c
2371 @@ -62,8 +62,8 @@ static bool debug;
2372 /*
2373 * Function prototypes
2374 */
2375 -static int klsi_105_startup(struct usb_serial *serial);
2376 -static void klsi_105_release(struct usb_serial *serial);
2377 +static int klsi_105_port_probe(struct usb_serial_port *port);
2378 +static int klsi_105_port_remove(struct usb_serial_port *port);
2379 static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port);
2380 static void klsi_105_close(struct usb_serial_port *port);
2381 static void klsi_105_set_termios(struct tty_struct *tty,
2382 @@ -101,8 +101,8 @@ static struct usb_serial_driver kl5kusb105d_device = {
2383 /*.break_ctl = klsi_105_break_ctl,*/
2384 .tiocmget = klsi_105_tiocmget,
2385 .tiocmset = klsi_105_tiocmset,
2386 - .attach = klsi_105_startup,
2387 - .release = klsi_105_release,
2388 + .port_probe = klsi_105_port_probe,
2389 + .port_remove = klsi_105_port_remove,
2390 .throttle = usb_serial_generic_throttle,
2391 .unthrottle = usb_serial_generic_unthrottle,
2392 .process_read_urb = klsi_105_process_read_urb,
2393 @@ -225,58 +225,40 @@ static int klsi_105_get_line_state(struct usb_serial_port *port,
2394 * Driver's tty interface functions
2395 */
2396
2397 -static int klsi_105_startup(struct usb_serial *serial)
2398 +static int klsi_105_port_probe(struct usb_serial_port *port)
2399 {
2400 struct klsi_105_private *priv;
2401 - int i;
2402
2403 - /* check if we support the product id (see keyspan.c)
2404 - * FIXME
2405 - */
2406 + priv = kmalloc(sizeof(*priv), GFP_KERNEL);
2407 + if (!priv)
2408 + return -ENOMEM;
2409
2410 - /* allocate the private data structure */
2411 - for (i = 0; i < serial->num_ports; i++) {
2412 - priv = kmalloc(sizeof(struct klsi_105_private),
2413 - GFP_KERNEL);
2414 - if (!priv) {
2415 - dbg("%skmalloc for klsi_105_private failed.", __func__);
2416 - i--;
2417 - goto err_cleanup;
2418 - }
2419 - /* set initial values for control structures */
2420 - priv->cfg.pktlen = 5;
2421 - priv->cfg.baudrate = kl5kusb105a_sio_b9600;
2422 - priv->cfg.databits = kl5kusb105a_dtb_8;
2423 - priv->cfg.unknown1 = 0;
2424 - priv->cfg.unknown2 = 1;
2425 + /* set initial values for control structures */
2426 + priv->cfg.pktlen = 5;
2427 + priv->cfg.baudrate = kl5kusb105a_sio_b9600;
2428 + priv->cfg.databits = kl5kusb105a_dtb_8;
2429 + priv->cfg.unknown1 = 0;
2430 + priv->cfg.unknown2 = 1;
2431
2432 - priv->line_state = 0;
2433 + priv->line_state = 0;
2434
2435 - usb_set_serial_port_data(serial->port[i], priv);
2436 + spin_lock_init(&priv->lock);
2437
2438 - spin_lock_init(&priv->lock);
2439 + /* priv->termios is left uninitialized until port opening */
2440
2441 - /* priv->termios is left uninitialized until port opening */
2442 - init_waitqueue_head(&serial->port[i]->write_wait);
2443 - }
2444 + usb_set_serial_port_data(port, priv);
2445
2446 return 0;
2447 -
2448 -err_cleanup:
2449 - for (; i >= 0; i--) {
2450 - priv = usb_get_serial_port_data(serial->port[i]);
2451 - kfree(priv);
2452 - usb_set_serial_port_data(serial->port[i], NULL);
2453 - }
2454 - return -ENOMEM;
2455 }
2456
2457 -static void klsi_105_release(struct usb_serial *serial)
2458 +static int klsi_105_port_remove(struct usb_serial_port *port)
2459 {
2460 - int i;
2461 + struct klsi_105_private *priv;
2462
2463 - for (i = 0; i < serial->num_ports; ++i)
2464 - kfree(usb_get_serial_port_data(serial->port[i]));
2465 + priv = usb_get_serial_port_data(port);
2466 + kfree(priv);
2467 +
2468 + return 0;
2469 }
2470
2471 static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
2472 diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
2473 index fafeabb..a579fdc 100644
2474 --- a/drivers/usb/serial/kobil_sct.c
2475 +++ b/drivers/usb/serial/kobil_sct.c
2476 @@ -56,8 +56,8 @@ static bool debug;
2477
2478
2479 /* Function prototypes */
2480 -static int kobil_startup(struct usb_serial *serial);
2481 -static void kobil_release(struct usb_serial *serial);
2482 +static int kobil_port_probe(struct usb_serial_port *probe);
2483 +static int kobil_port_remove(struct usb_serial_port *probe);
2484 static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port);
2485 static void kobil_close(struct usb_serial_port *port);
2486 static int kobil_write(struct tty_struct *tty, struct usb_serial_port *port,
2487 @@ -91,8 +91,8 @@ static struct usb_serial_driver kobil_device = {
2488 .description = "KOBIL USB smart card terminal",
2489 .id_table = id_table,
2490 .num_ports = 1,
2491 - .attach = kobil_startup,
2492 - .release = kobil_release,
2493 + .port_probe = kobil_port_probe,
2494 + .port_remove = kobil_port_remove,
2495 .ioctl = kobil_ioctl,
2496 .set_termios = kobil_set_termios,
2497 .init_termios = kobil_init_termios,
2498 @@ -119,9 +119,10 @@ struct kobil_private {
2499 };
2500
2501
2502 -static int kobil_startup(struct usb_serial *serial)
2503 +static int kobil_port_probe(struct usb_serial_port *port)
2504 {
2505 int i;
2506 + struct usb_serial *serial = port->serial;
2507 struct kobil_private *priv;
2508 struct usb_device *pdev;
2509 struct usb_host_config *actconfig;
2510 @@ -152,7 +153,7 @@ static int kobil_startup(struct usb_serial *serial)
2511 printk(KERN_DEBUG "KOBIL KAAN SIM detected\n");
2512 break;
2513 }
2514 - usb_set_serial_port_data(serial->port[0], priv);
2515 + usb_set_serial_port_data(port, priv);
2516
2517 /* search for the necessary endpoints */
2518 pdev = serial->dev;
2519 @@ -180,12 +181,14 @@ static int kobil_startup(struct usb_serial *serial)
2520 }
2521
2522
2523 -static void kobil_release(struct usb_serial *serial)
2524 +static int kobil_port_remove(struct usb_serial_port *port)
2525 {
2526 - int i;
2527 + struct kobil_private *priv;
2528
2529 - for (i = 0; i < serial->num_ports; ++i)
2530 - kfree(usb_get_serial_port_data(serial->port[i]));
2531 + priv = usb_get_serial_port_data(port);
2532 + kfree(priv);
2533 +
2534 + return 0;
2535 }
2536
2537 static void kobil_init_termios(struct tty_struct *tty)
2538 diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
2539 index 5f30800..a0542ca 100644
2540 --- a/drivers/usb/serial/option.c
2541 +++ b/drivers/usb/serial/option.c
2542 @@ -503,11 +503,19 @@ static const struct option_blacklist_info net_intf5_blacklist = {
2543 .reserved = BIT(5),
2544 };
2545
2546 +static const struct option_blacklist_info net_intf6_blacklist = {
2547 + .reserved = BIT(6),
2548 +};
2549 +
2550 static const struct option_blacklist_info zte_mf626_blacklist = {
2551 .sendsetup = BIT(0) | BIT(1),
2552 .reserved = BIT(4),
2553 };
2554
2555 +static const struct option_blacklist_info zte_1255_blacklist = {
2556 + .reserved = BIT(3) | BIT(4),
2557 +};
2558 +
2559 static const struct usb_device_id option_ids[] = {
2560 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
2561 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
2562 @@ -853,13 +861,19 @@ static const struct usb_device_id option_ids[] = {
2563 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff),
2564 .driver_info = (kernel_ulong_t)&net_intf5_blacklist },
2565 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) },
2566 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff) },
2567 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff) },
2568 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff),
2569 + .driver_info = (kernel_ulong_t)&net_intf5_blacklist },
2570 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff),
2571 + .driver_info = (kernel_ulong_t)&net_intf5_blacklist },
2572 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0122, 0xff, 0xff, 0xff) },
2573 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff) },
2574 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff) },
2575 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff) },
2576 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff) },
2577 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff),
2578 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2579 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff),
2580 + .driver_info = (kernel_ulong_t)&net_intf5_blacklist },
2581 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff),
2582 + .driver_info = (kernel_ulong_t)&net_intf6_blacklist },
2583 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff),
2584 + .driver_info = (kernel_ulong_t)&net_intf5_blacklist },
2585 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) },
2586 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) },
2587 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) },
2588 @@ -872,7 +886,8 @@ static const struct usb_device_id option_ids[] = {
2589 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) },
2590 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff),
2591 .driver_info = (kernel_ulong_t)&net_intf5_blacklist },
2592 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) },
2593 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff),
2594 + .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
2595 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) },
2596 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) },
2597 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) },
2598 @@ -880,13 +895,22 @@ static const struct usb_device_id option_ids[] = {
2599 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) },
2600 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff),
2601 .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2602 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */
2603 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2604 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */
2605 + .driver_info = (kernel_ulong_t)&net_intf1_blacklist },
2606 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */
2607 + .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
2608 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff),
2609 .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2610 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff),
2611 .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2612 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff),
2613 .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2614 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) },
2615 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff),
2616 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2617 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff),
2618 + .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
2619 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) },
2620 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) },
2621 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) },
2622 @@ -1002,18 +1026,24 @@ static const struct usb_device_id option_ids[] = {
2623 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1169, 0xff, 0xff, 0xff) },
2624 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1170, 0xff, 0xff, 0xff) },
2625 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1244, 0xff, 0xff, 0xff) },
2626 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff) },
2627 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff),
2628 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2629 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1246, 0xff, 0xff, 0xff) },
2630 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff) },
2631 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff),
2632 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2633 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1248, 0xff, 0xff, 0xff) },
2634 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1249, 0xff, 0xff, 0xff) },
2635 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1250, 0xff, 0xff, 0xff) },
2636 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1251, 0xff, 0xff, 0xff) },
2637 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff) },
2638 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff),
2639 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2640 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1253, 0xff, 0xff, 0xff) },
2641 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff) },
2642 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff) },
2643 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff) },
2644 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff),
2645 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2646 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff),
2647 + .driver_info = (kernel_ulong_t)&zte_1255_blacklist },
2648 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff),
2649 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2650 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1257, 0xff, 0xff, 0xff) },
2651 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1258, 0xff, 0xff, 0xff) },
2652 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1259, 0xff, 0xff, 0xff) },
2653 @@ -1058,8 +1088,16 @@ static const struct usb_device_id option_ids[] = {
2654 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) },
2655 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) },
2656 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) },
2657 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff),
2658 + .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
2659 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff),
2660 .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
2661 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1424, 0xff, 0xff, 0xff),
2662 + .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
2663 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1425, 0xff, 0xff, 0xff),
2664 + .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
2665 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */
2666 + .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
2667 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff,
2668 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist },
2669 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) },
2670 @@ -1071,15 +1109,21 @@ static const struct usb_device_id option_ids[] = {
2671 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) },
2672 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) },
2673 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) },
2674 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) },
2675 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff) },
2676 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) },
2677 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff),
2678 + .driver_info = (kernel_ulong_t)&net_intf1_blacklist },
2679 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff),
2680 + .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
2681 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff),
2682 + .driver_info = (kernel_ulong_t)&net_intf5_blacklist },
2683 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) },
2684 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) },
2685 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff) },
2686 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff),
2687 + .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
2688 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) },
2689 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff) },
2690 - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff) },
2691 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff),
2692 + .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
2693 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff),
2694 + .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
2695
2696 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) },
2697 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) },
2698 diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c
2699 index 5976b65..3aa582e 100644
2700 --- a/drivers/usb/serial/oti6858.c
2701 +++ b/drivers/usb/serial/oti6858.c
2702 @@ -139,8 +139,8 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty);
2703 static int oti6858_tiocmget(struct tty_struct *tty);
2704 static int oti6858_tiocmset(struct tty_struct *tty,
2705 unsigned int set, unsigned int clear);
2706 -static int oti6858_startup(struct usb_serial *serial);
2707 -static void oti6858_release(struct usb_serial *serial);
2708 +static int oti6858_port_probe(struct usb_serial_port *port);
2709 +static int oti6858_port_remove(struct usb_serial_port *port);
2710
2711 /* device info */
2712 static struct usb_serial_driver oti6858_device = {
2713 @@ -163,8 +163,8 @@ static struct usb_serial_driver oti6858_device = {
2714 .write_bulk_callback = oti6858_write_bulk_callback,
2715 .write_room = oti6858_write_room,
2716 .chars_in_buffer = oti6858_chars_in_buffer,
2717 - .attach = oti6858_startup,
2718 - .release = oti6858_release,
2719 + .port_probe = oti6858_port_probe,
2720 + .port_remove = oti6858_port_remove,
2721 };
2722
2723 static struct usb_serial_driver * const serial_drivers[] = {
2724 @@ -333,36 +333,33 @@ static void send_data(struct work_struct *work)
2725 usb_serial_port_softint(port);
2726 }
2727
2728 -static int oti6858_startup(struct usb_serial *serial)
2729 +static int oti6858_port_probe(struct usb_serial_port *port)
2730 {
2731 - struct usb_serial_port *port = serial->port[0];
2732 struct oti6858_private *priv;
2733 - int i;
2734 -
2735 - for (i = 0; i < serial->num_ports; ++i) {
2736 - priv = kzalloc(sizeof(struct oti6858_private), GFP_KERNEL);
2737 - if (!priv)
2738 - break;
2739 -
2740 - spin_lock_init(&priv->lock);
2741 - init_waitqueue_head(&priv->intr_wait);
2742 -/* INIT_WORK(&priv->setup_work, setup_line, serial->port[i]); */
2743 -/* INIT_WORK(&priv->write_work, send_data, serial->port[i]); */
2744 - priv->port = port;
2745 - INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line);
2746 - INIT_DELAYED_WORK(&priv->delayed_write_work, send_data);
2747 -
2748 - usb_set_serial_port_data(serial->port[i], priv);
2749 - }
2750 - if (i == serial->num_ports)
2751 - return 0;
2752
2753 - for (--i; i >= 0; --i) {
2754 - priv = usb_get_serial_port_data(serial->port[i]);
2755 - kfree(priv);
2756 - usb_set_serial_port_data(serial->port[i], NULL);
2757 - }
2758 - return -ENOMEM;
2759 + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
2760 + if (!priv)
2761 + return -ENOMEM;
2762 +
2763 + spin_lock_init(&priv->lock);
2764 + init_waitqueue_head(&priv->intr_wait);
2765 + priv->port = port;
2766 + INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line);
2767 + INIT_DELAYED_WORK(&priv->delayed_write_work, send_data);
2768 +
2769 + usb_set_serial_port_data(port, priv);
2770 +
2771 + return 0;
2772 +}
2773 +
2774 +static int oti6858_port_remove(struct usb_serial_port *port)
2775 +{
2776 + struct oti6858_private *priv;
2777 +
2778 + priv = usb_get_serial_port_data(port);
2779 + kfree(priv);
2780 +
2781 + return 0;
2782 }
2783
2784 static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
2785 @@ -714,15 +711,6 @@ static int oti6858_ioctl(struct tty_struct *tty,
2786 return -ENOIOCTLCMD;
2787 }
2788
2789 -
2790 -static void oti6858_release(struct usb_serial *serial)
2791 -{
2792 - int i;
2793 -
2794 - for (i = 0; i < serial->num_ports; ++i)
2795 - kfree(usb_get_serial_port_data(serial->port[i]));
2796 -}
2797 -
2798 static void oti6858_read_int_callback(struct urb *urb)
2799 {
2800 struct usb_serial_port *port = urb->context;
2801 diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
2802 index 13b8dd6..4d8d210 100644
2803 --- a/drivers/usb/serial/pl2303.c
2804 +++ b/drivers/usb/serial/pl2303.c
2805 @@ -135,12 +135,15 @@ enum pl2303_type {
2806 HX, /* HX version of the pl2303 chip */
2807 };
2808
2809 +struct pl2303_serial_private {
2810 + enum pl2303_type type;
2811 +};
2812 +
2813 struct pl2303_private {
2814 spinlock_t lock;
2815 wait_queue_head_t delta_msr_wait;
2816 u8 line_control;
2817 u8 line_status;
2818 - enum pl2303_type type;
2819 };
2820
2821 static int pl2303_vendor_read(__u16 value, __u16 index,
2822 @@ -169,14 +172,19 @@ static int pl2303_vendor_write(__u16 value, __u16 index,
2823
2824 static int pl2303_startup(struct usb_serial *serial)
2825 {
2826 - struct pl2303_private *priv;
2827 + struct pl2303_serial_private *spriv;
2828 enum pl2303_type type = type_0;
2829 unsigned char *buf;
2830 - int i;
2831 +
2832 + spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
2833 + if (!spriv)
2834 + return -ENOMEM;
2835
2836 buf = kmalloc(10, GFP_KERNEL);
2837 - if (buf == NULL)
2838 + if (!buf) {
2839 + kfree(spriv);
2840 return -ENOMEM;
2841 + }
2842
2843 if (serial->dev->descriptor.bDeviceClass == 0x02)
2844 type = type_0;
2845 @@ -188,15 +196,8 @@ static int pl2303_startup(struct usb_serial *serial)
2846 type = type_1;
2847 dev_dbg(&serial->interface->dev, "device type: %d\n", type);
2848
2849 - for (i = 0; i < serial->num_ports; ++i) {
2850 - priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
2851 - if (!priv)
2852 - goto cleanup;
2853 - spin_lock_init(&priv->lock);
2854 - init_waitqueue_head(&priv->delta_msr_wait);
2855 - priv->type = type;
2856 - usb_set_serial_port_data(serial->port[i], priv);
2857 - }
2858 + spriv->type = type;
2859 + usb_set_serial_data(serial, spriv);
2860
2861 pl2303_vendor_read(0x8484, 0, serial, buf);
2862 pl2303_vendor_write(0x0404, 0, serial);
2863 @@ -215,15 +216,40 @@ static int pl2303_startup(struct usb_serial *serial)
2864
2865 kfree(buf);
2866 return 0;
2867 +}
2868
2869 -cleanup:
2870 - kfree(buf);
2871 - for (--i; i >= 0; --i) {
2872 - priv = usb_get_serial_port_data(serial->port[i]);
2873 - kfree(priv);
2874 - usb_set_serial_port_data(serial->port[i], NULL);
2875 - }
2876 - return -ENOMEM;
2877 +static void pl2303_release(struct usb_serial *serial)
2878 +{
2879 + struct pl2303_serial_private *spriv;
2880 +
2881 + spriv = usb_get_serial_data(serial);
2882 + kfree(spriv);
2883 +}
2884 +
2885 +static int pl2303_port_probe(struct usb_serial_port *port)
2886 +{
2887 + struct pl2303_private *priv;
2888 +
2889 + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
2890 + if (!priv)
2891 + return -ENOMEM;
2892 +
2893 + spin_lock_init(&priv->lock);
2894 + init_waitqueue_head(&priv->delta_msr_wait);
2895 +
2896 + usb_set_serial_port_data(port, priv);
2897 +
2898 + return 0;
2899 +}
2900 +
2901 +static int pl2303_port_remove(struct usb_serial_port *port)
2902 +{
2903 + struct pl2303_private *priv;
2904 +
2905 + priv = usb_get_serial_port_data(port);
2906 + kfree(priv);
2907 +
2908 + return 0;
2909 }
2910
2911 static int set_control_lines(struct usb_device *dev, u8 value)
2912 @@ -242,6 +268,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
2913 struct usb_serial_port *port, struct ktermios *old_termios)
2914 {
2915 struct usb_serial *serial = port->serial;
2916 + struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
2917 struct pl2303_private *priv = usb_get_serial_port_data(port);
2918 unsigned long flags;
2919 unsigned int cflag;
2920 @@ -325,7 +352,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
2921 }
2922 if (baud > 1228800) {
2923 /* type_0, type_1 only support up to 1228800 baud */
2924 - if (priv->type != HX)
2925 + if (spriv->type != HX)
2926 baud = 1228800;
2927 else if (baud > 6000000)
2928 baud = 6000000;
2929 @@ -428,7 +455,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
2930 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
2931
2932 if (cflag & CRTSCTS) {
2933 - if (priv->type == HX)
2934 + if (spriv->type == HX)
2935 pl2303_vendor_write(0x0, 0x61, serial);
2936 else
2937 pl2303_vendor_write(0x0, 0x41, serial);
2938 @@ -470,10 +497,10 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
2939 {
2940 struct ktermios tmp_termios;
2941 struct usb_serial *serial = port->serial;
2942 - struct pl2303_private *priv = usb_get_serial_port_data(port);
2943 + struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
2944 int result;
2945
2946 - if (priv->type != HX) {
2947 + if (spriv->type != HX) {
2948 usb_clear_halt(serial->dev, port->write_urb->pipe);
2949 usb_clear_halt(serial->dev, port->read_urb->pipe);
2950 } else {
2951 @@ -657,17 +684,6 @@ static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
2952 dev_err(&port->dev, "error sending break = %d\n", result);
2953 }
2954
2955 -static void pl2303_release(struct usb_serial *serial)
2956 -{
2957 - int i;
2958 - struct pl2303_private *priv;
2959 -
2960 - for (i = 0; i < serial->num_ports; ++i) {
2961 - priv = usb_get_serial_port_data(serial->port[i]);
2962 - kfree(priv);
2963 - }
2964 -}
2965 -
2966 static void pl2303_update_line_status(struct usb_serial_port *port,
2967 unsigned char *data,
2968 unsigned int actual_length)
2969 @@ -829,6 +845,8 @@ static struct usb_serial_driver pl2303_device = {
2970 .read_int_callback = pl2303_read_int_callback,
2971 .attach = pl2303_startup,
2972 .release = pl2303_release,
2973 + .port_probe = pl2303_port_probe,
2974 + .port_remove = pl2303_port_remove,
2975 };
2976
2977 static struct usb_serial_driver * const serial_drivers[] = {
2978 diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
2979 index cad6089..2451c08 100644
2980 --- a/drivers/usb/serial/spcp8x5.c
2981 +++ b/drivers/usb/serial/spcp8x5.c
2982 @@ -159,13 +159,10 @@ struct spcp8x5_private {
2983 u8 line_status;
2984 };
2985
2986 -/* desc : when device plug in,this function would be called.
2987 - * thanks to usb_serial subsystem,then do almost every things for us. And what
2988 - * we should do just alloc the buffer */
2989 -static int spcp8x5_startup(struct usb_serial *serial)
2990 +static int spcp8x5_port_probe(struct usb_serial_port *port)
2991 {
2992 + struct usb_serial *serial = port->serial;
2993 struct spcp8x5_private *priv;
2994 - int i;
2995 enum spcp8x5_type type = SPCP825_007_TYPE;
2996 u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
2997
2998 @@ -182,34 +179,27 @@ static int spcp8x5_startup(struct usb_serial *serial)
2999 type = SPCP825_PHILIP_TYPE;
3000 dev_dbg(&serial->dev->dev, "device type = %d\n", (int)type);
3001
3002 - for (i = 0; i < serial->num_ports; ++i) {
3003 - priv = kzalloc(sizeof(struct spcp8x5_private), GFP_KERNEL);
3004 - if (!priv)
3005 - goto cleanup;
3006 + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
3007 + if (!priv)
3008 + return -ENOMEM;
3009
3010 - spin_lock_init(&priv->lock);
3011 - init_waitqueue_head(&priv->delta_msr_wait);
3012 - priv->type = type;
3013 - usb_set_serial_port_data(serial->port[i] , priv);
3014 - }
3015 + spin_lock_init(&priv->lock);
3016 + init_waitqueue_head(&priv->delta_msr_wait);
3017 + priv->type = type;
3018 +
3019 + usb_set_serial_port_data(port , priv);
3020
3021 return 0;
3022 -cleanup:
3023 - for (--i; i >= 0; --i) {
3024 - priv = usb_get_serial_port_data(serial->port[i]);
3025 - kfree(priv);
3026 - usb_set_serial_port_data(serial->port[i] , NULL);
3027 - }
3028 - return -ENOMEM;
3029 }
3030
3031 -/* call when the device plug out. free all the memory alloced by probe */
3032 -static void spcp8x5_release(struct usb_serial *serial)
3033 +static int spcp8x5_port_remove(struct usb_serial_port *port)
3034 {
3035 - int i;
3036 + struct spcp8x5_private *priv;
3037
3038 - for (i = 0; i < serial->num_ports; i++)
3039 - kfree(usb_get_serial_port_data(serial->port[i]));
3040 + priv = usb_get_serial_port_data(port);
3041 + kfree(priv);
3042 +
3043 + return 0;
3044 }
3045
3046 /* set the modem control line of the device.
3047 @@ -651,8 +641,8 @@ static struct usb_serial_driver spcp8x5_device = {
3048 .ioctl = spcp8x5_ioctl,
3049 .tiocmget = spcp8x5_tiocmget,
3050 .tiocmset = spcp8x5_tiocmset,
3051 - .attach = spcp8x5_startup,
3052 - .release = spcp8x5_release,
3053 + .port_probe = spcp8x5_port_probe,
3054 + .port_remove = spcp8x5_port_remove,
3055 .process_read_urb = spcp8x5_process_read_urb,
3056 };
3057
3058 diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c
3059 index 3fee23b..fe3a8a0 100644
3060 --- a/drivers/usb/serial/ssu100.c
3061 +++ b/drivers/usb/serial/ssu100.c
3062 @@ -69,13 +69,6 @@ struct ssu100_port_private {
3063 struct async_icount icount;
3064 };
3065
3066 -static void ssu100_release(struct usb_serial *serial)
3067 -{
3068 - struct ssu100_port_private *priv = usb_get_serial_port_data(*serial->port);
3069 -
3070 - kfree(priv);
3071 -}
3072 -
3073 static inline int ssu100_control_msg(struct usb_device *dev,
3074 u8 request, u16 data, u16 index)
3075 {
3076 @@ -444,21 +437,33 @@ static int ssu100_ioctl(struct tty_struct *tty,
3077
3078 static int ssu100_attach(struct usb_serial *serial)
3079 {
3080 + return ssu100_initdevice(serial->dev);
3081 +}
3082 +
3083 +static int ssu100_port_probe(struct usb_serial_port *port)
3084 +{
3085 struct ssu100_port_private *priv;
3086 - struct usb_serial_port *port = *serial->port;
3087
3088 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
3089 - if (!priv) {
3090 - dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__,
3091 - sizeof(*priv));
3092 + if (!priv)
3093 return -ENOMEM;
3094 - }
3095
3096 spin_lock_init(&priv->status_lock);
3097 init_waitqueue_head(&priv->delta_msr_wait);
3098 +
3099 usb_set_serial_port_data(port, priv);
3100
3101 - return ssu100_initdevice(serial->dev);
3102 + return 0;
3103 +}
3104 +
3105 +static int ssu100_port_remove(struct usb_serial_port *port)
3106 +{
3107 + struct ssu100_port_private *priv;
3108 +
3109 + priv = usb_get_serial_port_data(port);
3110 + kfree(priv);
3111 +
3112 + return 0;
3113 }
3114
3115 static int ssu100_tiocmget(struct tty_struct *tty)
3116 @@ -649,7 +654,8 @@ static struct usb_serial_driver ssu100_device = {
3117 .open = ssu100_open,
3118 .close = ssu100_close,
3119 .attach = ssu100_attach,
3120 - .release = ssu100_release,
3121 + .port_probe = ssu100_port_probe,
3122 + .port_remove = ssu100_port_remove,
3123 .dtr_rts = ssu100_dtr_rts,
3124 .process_read_urb = ssu100_process_read_urb,
3125 .tiocmget = ssu100_tiocmget,
3126 diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
3127 index a4404f5..33537bb 100644
3128 --- a/drivers/usb/serial/ti_usb_3410_5052.c
3129 +++ b/drivers/usb/serial/ti_usb_3410_5052.c
3130 @@ -98,6 +98,8 @@ struct ti_device {
3131
3132 static int ti_startup(struct usb_serial *serial);
3133 static void ti_release(struct usb_serial *serial);
3134 +static int ti_port_probe(struct usb_serial_port *port);
3135 +static int ti_port_remove(struct usb_serial_port *port);
3136 static int ti_open(struct tty_struct *tty, struct usb_serial_port *port);
3137 static void ti_close(struct usb_serial_port *port);
3138 static int ti_write(struct tty_struct *tty, struct usb_serial_port *port,
3139 @@ -223,6 +225,8 @@ static struct usb_serial_driver ti_1port_device = {
3140 .num_ports = 1,
3141 .attach = ti_startup,
3142 .release = ti_release,
3143 + .port_probe = ti_port_probe,
3144 + .port_remove = ti_port_remove,
3145 .open = ti_open,
3146 .close = ti_close,
3147 .write = ti_write,
3148 @@ -251,6 +255,8 @@ static struct usb_serial_driver ti_2port_device = {
3149 .num_ports = 2,
3150 .attach = ti_startup,
3151 .release = ti_release,
3152 + .port_probe = ti_port_probe,
3153 + .port_remove = ti_port_remove,
3154 .open = ti_open,
3155 .close = ti_close,
3156 .write = ti_write,
3157 @@ -358,11 +364,8 @@ module_exit(ti_exit);
3158 static int ti_startup(struct usb_serial *serial)
3159 {
3160 struct ti_device *tdev;
3161 - struct ti_port *tport;
3162 struct usb_device *dev = serial->dev;
3163 int status;
3164 - int i;
3165 -
3166
3167 dbg("%s - product 0x%4X, num configurations %d, configuration value %d",
3168 __func__, le16_to_cpu(dev->descriptor.idProduct),
3169 @@ -409,42 +412,8 @@ static int ti_startup(struct usb_serial *serial)
3170 goto free_tdev;
3171 }
3172
3173 - /* set up port structures */
3174 - for (i = 0; i < serial->num_ports; ++i) {
3175 - tport = kzalloc(sizeof(struct ti_port), GFP_KERNEL);
3176 - if (tport == NULL) {
3177 - dev_err(&dev->dev, "%s - out of memory\n", __func__);
3178 - status = -ENOMEM;
3179 - goto free_tports;
3180 - }
3181 - spin_lock_init(&tport->tp_lock);
3182 - tport->tp_uart_base_addr = (i == 0 ?
3183 - TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR);
3184 - tport->tp_closing_wait = closing_wait;
3185 - init_waitqueue_head(&tport->tp_msr_wait);
3186 - init_waitqueue_head(&tport->tp_write_wait);
3187 - if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE,
3188 - GFP_KERNEL)) {
3189 - dev_err(&dev->dev, "%s - out of memory\n", __func__);
3190 - kfree(tport);
3191 - status = -ENOMEM;
3192 - goto free_tports;
3193 - }
3194 - tport->tp_port = serial->port[i];
3195 - tport->tp_tdev = tdev;
3196 - usb_set_serial_port_data(serial->port[i], tport);
3197 - tport->tp_uart_mode = 0; /* default is RS232 */
3198 - }
3199 -
3200 return 0;
3201
3202 -free_tports:
3203 - for (--i; i >= 0; --i) {
3204 - tport = usb_get_serial_port_data(serial->port[i]);
3205 - kfifo_free(&tport->write_fifo);
3206 - kfree(tport);
3207 - usb_set_serial_port_data(serial->port[i], NULL);
3208 - }
3209 free_tdev:
3210 kfree(tdev);
3211 usb_set_serial_data(serial, NULL);
3212 @@ -454,21 +423,50 @@ free_tdev:
3213
3214 static void ti_release(struct usb_serial *serial)
3215 {
3216 - int i;
3217 struct ti_device *tdev = usb_get_serial_data(serial);
3218 +
3219 + kfree(tdev);
3220 +}
3221 +
3222 +static int ti_port_probe(struct usb_serial_port *port)
3223 +{
3224 struct ti_port *tport;
3225
3226 - for (i = 0; i < serial->num_ports; ++i) {
3227 - tport = usb_get_serial_port_data(serial->port[i]);
3228 - if (tport) {
3229 - kfifo_free(&tport->write_fifo);
3230 - kfree(tport);
3231 - }
3232 + tport = kzalloc(sizeof(*tport), GFP_KERNEL);
3233 + if (!tport)
3234 + return -ENOMEM;
3235 +
3236 + spin_lock_init(&tport->tp_lock);
3237 + if (port == port->serial->port[0])
3238 + tport->tp_uart_base_addr = TI_UART1_BASE_ADDR;
3239 + else
3240 + tport->tp_uart_base_addr = TI_UART2_BASE_ADDR;
3241 + tport->tp_closing_wait = closing_wait;
3242 + init_waitqueue_head(&tport->tp_msr_wait);
3243 + init_waitqueue_head(&tport->tp_write_wait);
3244 + if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE, GFP_KERNEL)) {
3245 + kfree(tport);
3246 + return -ENOMEM;
3247 }
3248 + tport->tp_port = port;
3249 + tport->tp_tdev = usb_get_serial_data(port->serial);
3250 + tport->tp_uart_mode = 0; /* default is RS232 */
3251
3252 - kfree(tdev);
3253 + usb_set_serial_port_data(port, tport);
3254 +
3255 + return 0;
3256 }
3257
3258 +static int ti_port_remove(struct usb_serial_port *port)
3259 +{
3260 + struct ti_port *tport;
3261 +
3262 + tport = usb_get_serial_port_data(port);
3263 + kfifo_free(&tport->write_fifo);
3264 + kfree(tport);
3265 +
3266 + return 0;
3267 +}
3268
3269 static int ti_open(struct tty_struct *tty, struct usb_serial_port *port)
3270 {
3271 diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
3272 index 1b50890..cf18217 100644
3273 --- a/fs/ext4/balloc.c
3274 +++ b/fs/ext4/balloc.c
3275 @@ -174,8 +174,7 @@ void ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh,
3276 ext4_free_inodes_set(sb, gdp, 0);
3277 ext4_itable_unused_set(sb, gdp, 0);
3278 memset(bh->b_data, 0xff, sb->s_blocksize);
3279 - ext4_block_bitmap_csum_set(sb, block_group, gdp, bh,
3280 - EXT4_BLOCKS_PER_GROUP(sb) / 8);
3281 + ext4_block_bitmap_csum_set(sb, block_group, gdp, bh);
3282 return;
3283 }
3284 memset(bh->b_data, 0, sb->s_blocksize);
3285 @@ -212,8 +211,7 @@ void ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh,
3286 */
3287 ext4_mark_bitmap_end(num_clusters_in_group(sb, block_group),
3288 sb->s_blocksize * 8, bh->b_data);
3289 - ext4_block_bitmap_csum_set(sb, block_group, gdp, bh,
3290 - EXT4_BLOCKS_PER_GROUP(sb) / 8);
3291 + ext4_block_bitmap_csum_set(sb, block_group, gdp, bh);
3292 ext4_group_desc_csum_set(sb, block_group, gdp);
3293 }
3294
3295 @@ -350,7 +348,7 @@ void ext4_validate_block_bitmap(struct super_block *sb,
3296 return;
3297 }
3298 if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group,
3299 - desc, bh, EXT4_BLOCKS_PER_GROUP(sb) / 8))) {
3300 + desc, bh))) {
3301 ext4_unlock_group(sb, block_group);
3302 ext4_error(sb, "bg %u: bad block bitmap checksum", block_group);
3303 return;
3304 diff --git a/fs/ext4/bitmap.c b/fs/ext4/bitmap.c
3305 index 5c2d181..3285aa5 100644
3306 --- a/fs/ext4/bitmap.c
3307 +++ b/fs/ext4/bitmap.c
3308 @@ -58,11 +58,12 @@ void ext4_inode_bitmap_csum_set(struct super_block *sb, ext4_group_t group,
3309
3310 int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
3311 struct ext4_group_desc *gdp,
3312 - struct buffer_head *bh, int sz)
3313 + struct buffer_head *bh)
3314 {
3315 __u32 hi;
3316 __u32 provided, calculated;
3317 struct ext4_sb_info *sbi = EXT4_SB(sb);
3318 + int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8;
3319
3320 if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
3321 EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
3322 @@ -84,8 +85,9 @@ int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
3323
3324 void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group,
3325 struct ext4_group_desc *gdp,
3326 - struct buffer_head *bh, int sz)
3327 + struct buffer_head *bh)
3328 {
3329 + int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8;
3330 __u32 csum;
3331 struct ext4_sb_info *sbi = EXT4_SB(sb);
3332
3333 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
3334 index c3411d4..5c69f2b 100644
3335 --- a/fs/ext4/ext4.h
3336 +++ b/fs/ext4/ext4.h
3337 @@ -1867,10 +1867,10 @@ int ext4_inode_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
3338 struct buffer_head *bh, int sz);
3339 void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group,
3340 struct ext4_group_desc *gdp,
3341 - struct buffer_head *bh, int sz);
3342 + struct buffer_head *bh);
3343 int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
3344 struct ext4_group_desc *gdp,
3345 - struct buffer_head *bh, int sz);
3346 + struct buffer_head *bh);
3347
3348 /* balloc.c */
3349 extern void ext4_validate_block_bitmap(struct super_block *sb,
3350 diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
3351 index aabbb3f..741bb94 100644
3352 --- a/fs/ext4/extents.c
3353 +++ b/fs/ext4/extents.c
3354 @@ -52,6 +52,9 @@
3355 #define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */
3356 #define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */
3357
3358 +#define EXT4_EXT_DATA_VALID1 0x8 /* first half contains valid data */
3359 +#define EXT4_EXT_DATA_VALID2 0x10 /* second half contains valid data */
3360 +
3361 static __le32 ext4_extent_block_csum(struct inode *inode,
3362 struct ext4_extent_header *eh)
3363 {
3364 @@ -2895,6 +2898,9 @@ static int ext4_split_extent_at(handle_t *handle,
3365 unsigned int ee_len, depth;
3366 int err = 0;
3367
3368 + BUG_ON((split_flag & (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2)) ==
3369 + (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2));
3370 +
3371 ext_debug("ext4_split_extents_at: inode %lu, logical"
3372 "block %llu\n", inode->i_ino, (unsigned long long)split);
3373
3374 @@ -2953,7 +2959,14 @@ static int ext4_split_extent_at(handle_t *handle,
3375
3376 err = ext4_ext_insert_extent(handle, inode, path, &newex, flags);
3377 if (err == -ENOSPC && (EXT4_EXT_MAY_ZEROOUT & split_flag)) {
3378 - err = ext4_ext_zeroout(inode, &orig_ex);
3379 + if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) {
3380 + if (split_flag & EXT4_EXT_DATA_VALID1)
3381 + err = ext4_ext_zeroout(inode, ex2);
3382 + else
3383 + err = ext4_ext_zeroout(inode, ex);
3384 + } else
3385 + err = ext4_ext_zeroout(inode, &orig_ex);
3386 +
3387 if (err)
3388 goto fix_extent_len;
3389 /* update the extent length and mark as initialized */
3390 @@ -3006,12 +3019,13 @@ static int ext4_split_extent(handle_t *handle,
3391 uninitialized = ext4_ext_is_uninitialized(ex);
3392
3393 if (map->m_lblk + map->m_len < ee_block + ee_len) {
3394 - split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT ?
3395 - EXT4_EXT_MAY_ZEROOUT : 0;
3396 + split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT;
3397 flags1 = flags | EXT4_GET_BLOCKS_PRE_IO;
3398 if (uninitialized)
3399 split_flag1 |= EXT4_EXT_MARK_UNINIT1 |
3400 EXT4_EXT_MARK_UNINIT2;
3401 + if (split_flag & EXT4_EXT_DATA_VALID2)
3402 + split_flag1 |= EXT4_EXT_DATA_VALID1;
3403 err = ext4_split_extent_at(handle, inode, path,
3404 map->m_lblk + map->m_len, split_flag1, flags1);
3405 if (err)
3406 @@ -3024,8 +3038,8 @@ static int ext4_split_extent(handle_t *handle,
3407 return PTR_ERR(path);
3408
3409 if (map->m_lblk >= ee_block) {
3410 - split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT ?
3411 - EXT4_EXT_MAY_ZEROOUT : 0;
3412 + split_flag1 = split_flag & (EXT4_EXT_MAY_ZEROOUT |
3413 + EXT4_EXT_DATA_VALID2);
3414 if (uninitialized)
3415 split_flag1 |= EXT4_EXT_MARK_UNINIT1;
3416 if (split_flag & EXT4_EXT_MARK_UNINIT2)
3417 @@ -3303,26 +3317,47 @@ static int ext4_split_unwritten_extents(handle_t *handle,
3418
3419 split_flag |= ee_block + ee_len <= eof_block ? EXT4_EXT_MAY_ZEROOUT : 0;
3420 split_flag |= EXT4_EXT_MARK_UNINIT2;
3421 -
3422 + if (flags & EXT4_GET_BLOCKS_CONVERT)
3423 + split_flag |= EXT4_EXT_DATA_VALID2;
3424 flags |= EXT4_GET_BLOCKS_PRE_IO;
3425 return ext4_split_extent(handle, inode, path, map, split_flag, flags);
3426 }
3427
3428 static int ext4_convert_unwritten_extents_endio(handle_t *handle,
3429 - struct inode *inode,
3430 - struct ext4_ext_path *path)
3431 + struct inode *inode,
3432 + struct ext4_map_blocks *map,
3433 + struct ext4_ext_path *path)
3434 {
3435 struct ext4_extent *ex;
3436 + ext4_lblk_t ee_block;
3437 + unsigned int ee_len;
3438 int depth;
3439 int err = 0;
3440
3441 depth = ext_depth(inode);
3442 ex = path[depth].p_ext;
3443 + ee_block = le32_to_cpu(ex->ee_block);
3444 + ee_len = ext4_ext_get_actual_len(ex);
3445
3446 ext_debug("ext4_convert_unwritten_extents_endio: inode %lu, logical"
3447 "block %llu, max_blocks %u\n", inode->i_ino,
3448 - (unsigned long long)le32_to_cpu(ex->ee_block),
3449 - ext4_ext_get_actual_len(ex));
3450 + (unsigned long long)ee_block, ee_len);
3451 +
3452 + /* If extent is larger than requested then split is required */
3453 + if (ee_block != map->m_lblk || ee_len > map->m_len) {
3454 + err = ext4_split_unwritten_extents(handle, inode, map, path,
3455 + EXT4_GET_BLOCKS_CONVERT);
3456 + if (err < 0)
3457 + goto out;
3458 + ext4_ext_drop_refs(path);
3459 + path = ext4_ext_find_extent(inode, map->m_lblk, path);
3460 + if (IS_ERR(path)) {
3461 + err = PTR_ERR(path);
3462 + goto out;
3463 + }
3464 + depth = ext_depth(inode);
3465 + ex = path[depth].p_ext;
3466 + }
3467
3468 err = ext4_ext_get_access(handle, inode, path + depth);
3469 if (err)
3470 @@ -3630,7 +3665,7 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode,
3471 }
3472 /* IO end_io complete, convert the filled extent to written */
3473 if ((flags & EXT4_GET_BLOCKS_CONVERT)) {
3474 - ret = ext4_convert_unwritten_extents_endio(handle, inode,
3475 + ret = ext4_convert_unwritten_extents_endio(handle, inode, map,
3476 path);
3477 if (ret >= 0) {
3478 ext4_update_inode_fsync_trans(handle, inode, 1);
3479 diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
3480 index 26154b8..8ce0076 100644
3481 --- a/fs/ext4/ialloc.c
3482 +++ b/fs/ext4/ialloc.c
3483 @@ -753,9 +753,7 @@ got:
3484 ext4_free_group_clusters_set(sb, gdp,
3485 ext4_free_clusters_after_init(sb, group, gdp));
3486 ext4_block_bitmap_csum_set(sb, group, gdp,
3487 - block_bitmap_bh,
3488 - EXT4_BLOCKS_PER_GROUP(sb) /
3489 - 8);
3490 + block_bitmap_bh);
3491 ext4_group_desc_csum_set(sb, group, gdp);
3492 }
3493 ext4_unlock_group(sb, group);
3494 diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
3495 index 8eae947..b26410c 100644
3496 --- a/fs/ext4/mballoc.c
3497 +++ b/fs/ext4/mballoc.c
3498 @@ -2804,8 +2804,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
3499 }
3500 len = ext4_free_group_clusters(sb, gdp) - ac->ac_b_ex.fe_len;
3501 ext4_free_group_clusters_set(sb, gdp, len);
3502 - ext4_block_bitmap_csum_set(sb, ac->ac_b_ex.fe_group, gdp, bitmap_bh,
3503 - EXT4_BLOCKS_PER_GROUP(sb) / 8);
3504 + ext4_block_bitmap_csum_set(sb, ac->ac_b_ex.fe_group, gdp, bitmap_bh);
3505 ext4_group_desc_csum_set(sb, ac->ac_b_ex.fe_group, gdp);
3506
3507 ext4_unlock_group(sb, ac->ac_b_ex.fe_group);
3508 @@ -4664,8 +4663,7 @@ do_more:
3509
3510 ret = ext4_free_group_clusters(sb, gdp) + count_clusters;
3511 ext4_free_group_clusters_set(sb, gdp, ret);
3512 - ext4_block_bitmap_csum_set(sb, block_group, gdp, bitmap_bh,
3513 - EXT4_BLOCKS_PER_GROUP(sb) / 8);
3514 + ext4_block_bitmap_csum_set(sb, block_group, gdp, bitmap_bh);
3515 ext4_group_desc_csum_set(sb, block_group, gdp);
3516 ext4_unlock_group(sb, block_group);
3517 percpu_counter_add(&sbi->s_freeclusters_counter, count_clusters);
3518 @@ -4809,8 +4807,7 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
3519 mb_free_blocks(NULL, &e4b, bit, count);
3520 blk_free_count = blocks_freed + ext4_free_group_clusters(sb, desc);
3521 ext4_free_group_clusters_set(sb, desc, blk_free_count);
3522 - ext4_block_bitmap_csum_set(sb, block_group, desc, bitmap_bh,
3523 - EXT4_BLOCKS_PER_GROUP(sb) / 8);
3524 + ext4_block_bitmap_csum_set(sb, block_group, desc, bitmap_bh);
3525 ext4_group_desc_csum_set(sb, block_group, desc);
3526 ext4_unlock_group(sb, block_group);
3527 percpu_counter_add(&sbi->s_freeclusters_counter,
3528 @@ -4990,8 +4987,9 @@ int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range)
3529 end = start + (range->len >> sb->s_blocksize_bits) - 1;
3530 minlen = range->minlen >> sb->s_blocksize_bits;
3531
3532 - if (unlikely(minlen > EXT4_CLUSTERS_PER_GROUP(sb)) ||
3533 - unlikely(start >= max_blks))
3534 + if (minlen > EXT4_CLUSTERS_PER_GROUP(sb) ||
3535 + start >= max_blks ||
3536 + range->len < sb->s_blocksize)
3537 return -EINVAL;
3538 if (end >= max_blks)
3539 end = max_blks - 1;
3540 diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
3541 index 0be1789..71241bc 100644
3542 --- a/fs/ext4/resize.c
3543 +++ b/fs/ext4/resize.c
3544 @@ -1121,8 +1121,7 @@ static int ext4_set_bitmap_checksums(struct super_block *sb,
3545 bh = ext4_get_bitmap(sb, group_data->block_bitmap);
3546 if (!bh)
3547 return -EIO;
3548 - ext4_block_bitmap_csum_set(sb, group, gdp, bh,
3549 - EXT4_BLOCKS_PER_GROUP(sb) / 8);
3550 + ext4_block_bitmap_csum_set(sb, group, gdp, bh);
3551 brelse(bh);
3552
3553 return 0;
3554 diff --git a/fs/lockd/clntxdr.c b/fs/lockd/clntxdr.c
3555 index d269ada..982d267 100644
3556 --- a/fs/lockd/clntxdr.c
3557 +++ b/fs/lockd/clntxdr.c
3558 @@ -223,7 +223,7 @@ static void encode_nlm_stat(struct xdr_stream *xdr,
3559 {
3560 __be32 *p;
3561
3562 - BUG_ON(be32_to_cpu(stat) > NLM_LCK_DENIED_GRACE_PERIOD);
3563 + WARN_ON_ONCE(be32_to_cpu(stat) > NLM_LCK_DENIED_GRACE_PERIOD);
3564 p = xdr_reserve_space(xdr, 4);
3565 *p = stat;
3566 }
3567 diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c
3568 index 3009a36..21171f0 100644
3569 --- a/fs/lockd/svcproc.c
3570 +++ b/fs/lockd/svcproc.c
3571 @@ -68,7 +68,8 @@ nlmsvc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
3572
3573 /* Obtain file pointer. Not used by FREE_ALL call. */
3574 if (filp != NULL) {
3575 - if ((error = nlm_lookup_file(rqstp, &file, &lock->fh)) != 0)
3576 + error = cast_status(nlm_lookup_file(rqstp, &file, &lock->fh));
3577 + if (error != 0)
3578 goto no_locks;
3579 *filp = file;
3580
3581 diff --git a/fs/proc/stat.c b/fs/proc/stat.c
3582 index 64c3b31..e296572 100644
3583 --- a/fs/proc/stat.c
3584 +++ b/fs/proc/stat.c
3585 @@ -45,10 +45,13 @@ static cputime64_t get_iowait_time(int cpu)
3586
3587 static u64 get_idle_time(int cpu)
3588 {
3589 - u64 idle, idle_time = get_cpu_idle_time_us(cpu, NULL);
3590 + u64 idle, idle_time = -1ULL;
3591 +
3592 + if (cpu_online(cpu))
3593 + idle_time = get_cpu_idle_time_us(cpu, NULL);
3594
3595 if (idle_time == -1ULL)
3596 - /* !NO_HZ so we can rely on cpustat.idle */
3597 + /* !NO_HZ or cpu offline so we can rely on cpustat.idle */
3598 idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];
3599 else
3600 idle = usecs_to_cputime64(idle_time);
3601 @@ -58,10 +61,13 @@ static u64 get_idle_time(int cpu)
3602
3603 static u64 get_iowait_time(int cpu)
3604 {
3605 - u64 iowait, iowait_time = get_cpu_iowait_time_us(cpu, NULL);
3606 + u64 iowait, iowait_time = -1ULL;
3607 +
3608 + if (cpu_online(cpu))
3609 + iowait_time = get_cpu_iowait_time_us(cpu, NULL);
3610
3611 if (iowait_time == -1ULL)
3612 - /* !NO_HZ so we can rely on cpustat.iowait */
3613 + /* !NO_HZ or cpu offline so we can rely on cpustat.iowait */
3614 iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];
3615 else
3616 iowait = usecs_to_cputime64(iowait_time);
3617 diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
3618 index a810987..561e130 100644
3619 --- a/include/linux/if_vlan.h
3620 +++ b/include/linux/if_vlan.h
3621 @@ -82,6 +82,8 @@ static inline int is_vlan_dev(struct net_device *dev)
3622 }
3623
3624 #define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT)
3625 +#define vlan_tx_nonzero_tag_present(__skb) \
3626 + (vlan_tx_tag_present(__skb) && ((__skb)->vlan_tci & VLAN_VID_MASK))
3627 #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT)
3628
3629 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
3630 @@ -91,7 +93,7 @@ extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev,
3631 extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
3632 extern u16 vlan_dev_vlan_id(const struct net_device *dev);
3633
3634 -extern bool vlan_do_receive(struct sk_buff **skb, bool last_handler);
3635 +extern bool vlan_do_receive(struct sk_buff **skb);
3636 extern struct sk_buff *vlan_untag(struct sk_buff *skb);
3637
3638 extern int vlan_vid_add(struct net_device *dev, unsigned short vid);
3639 @@ -120,10 +122,8 @@ static inline u16 vlan_dev_vlan_id(const struct net_device *dev)
3640 return 0;
3641 }
3642
3643 -static inline bool vlan_do_receive(struct sk_buff **skb, bool last_handler)
3644 +static inline bool vlan_do_receive(struct sk_buff **skb)
3645 {
3646 - if (((*skb)->vlan_tci & VLAN_VID_MASK) && last_handler)
3647 - (*skb)->pkt_type = PACKET_OTHERHOST;
3648 return false;
3649 }
3650
3651 diff --git a/include/linux/netlink.h b/include/linux/netlink.h
3652 index f74dd13..e893736 100644
3653 --- a/include/linux/netlink.h
3654 +++ b/include/linux/netlink.h
3655 @@ -153,6 +153,7 @@ struct nlattr {
3656
3657 #include <linux/capability.h>
3658 #include <linux/skbuff.h>
3659 +#include <linux/export.h>
3660
3661 struct net;
3662
3663 @@ -232,6 +233,8 @@ struct netlink_callback {
3664 struct netlink_callback *cb);
3665 int (*done)(struct netlink_callback *cb);
3666 void *data;
3667 + /* the module that dump function belong to */
3668 + struct module *module;
3669 u16 family;
3670 u16 min_dump_alloc;
3671 unsigned int prev_seq, seq;
3672 @@ -249,14 +252,24 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
3673
3674 struct netlink_dump_control {
3675 int (*dump)(struct sk_buff *skb, struct netlink_callback *);
3676 - int (*done)(struct netlink_callback*);
3677 + int (*done)(struct netlink_callback *);
3678 void *data;
3679 + struct module *module;
3680 u16 min_dump_alloc;
3681 };
3682
3683 -extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
3684 - const struct nlmsghdr *nlh,
3685 - struct netlink_dump_control *control);
3686 +extern int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
3687 + const struct nlmsghdr *nlh,
3688 + struct netlink_dump_control *control);
3689 +static inline int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
3690 + const struct nlmsghdr *nlh,
3691 + struct netlink_dump_control *control)
3692 +{
3693 + if (!control->module)
3694 + control->module = THIS_MODULE;
3695 +
3696 + return __netlink_dump_start(ssk, skb, nlh, control);
3697 +}
3698
3699
3700 #define NL_NONROOT_RECV 0x1
3701 diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
3702 index 7632c87..f3165d2 100644
3703 --- a/include/linux/skbuff.h
3704 +++ b/include/linux/skbuff.h
3705 @@ -589,9 +589,6 @@ static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
3706 return __alloc_skb(size, priority, SKB_ALLOC_FCLONE, NUMA_NO_NODE);
3707 }
3708
3709 -extern void skb_recycle(struct sk_buff *skb);
3710 -extern bool skb_recycle_check(struct sk_buff *skb, int skb_size);
3711 -
3712 extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
3713 extern int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask);
3714 extern struct sk_buff *skb_clone(struct sk_buff *skb,
3715 @@ -2642,27 +2639,6 @@ static inline void skb_checksum_none_assert(const struct sk_buff *skb)
3716
3717 bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
3718
3719 -static inline bool skb_is_recycleable(const struct sk_buff *skb, int skb_size)
3720 -{
3721 - if (irqs_disabled())
3722 - return false;
3723 -
3724 - if (skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY)
3725 - return false;
3726 -
3727 - if (skb_is_nonlinear(skb) || skb->fclone != SKB_FCLONE_UNAVAILABLE)
3728 - return false;
3729 -
3730 - skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD);
3731 - if (skb_end_offset(skb) < skb_size)
3732 - return false;
3733 -
3734 - if (skb_shared(skb) || skb_cloned(skb))
3735 - return false;
3736 -
3737 - return true;
3738 -}
3739 -
3740 /**
3741 * skb_head_is_locked - Determine if the skb->head is locked down
3742 * @skb: skb to check
3743 diff --git a/include/net/flow.h b/include/net/flow.h
3744 index e1dd508..628e11b 100644
3745 --- a/include/net/flow.h
3746 +++ b/include/net/flow.h
3747 @@ -21,6 +21,7 @@ struct flowi_common {
3748 __u8 flowic_flags;
3749 #define FLOWI_FLAG_ANYSRC 0x01
3750 #define FLOWI_FLAG_CAN_SLEEP 0x02
3751 +#define FLOWI_FLAG_KNOWN_NH 0x04
3752 __u32 flowic_secid;
3753 };
3754
3755 diff --git a/include/net/route.h b/include/net/route.h
3756 index da22243..bc40b63 100644
3757 --- a/include/net/route.h
3758 +++ b/include/net/route.h
3759 @@ -48,7 +48,8 @@ struct rtable {
3760 int rt_genid;
3761 unsigned int rt_flags;
3762 __u16 rt_type;
3763 - __u16 rt_is_input;
3764 + __u8 rt_is_input;
3765 + __u8 rt_uses_gateway;
3766
3767 int rt_iif;
3768
3769 diff --git a/include/rdma/rdma_netlink.h b/include/rdma/rdma_netlink.h
3770 index 3c5363a..bd3d8b2 100644
3771 --- a/include/rdma/rdma_netlink.h
3772 +++ b/include/rdma/rdma_netlink.h
3773 @@ -39,6 +39,7 @@ struct rdma_cm_id_stats {
3774
3775 struct ibnl_client_cbs {
3776 int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb);
3777 + struct module *module;
3778 };
3779
3780 int ibnl_init(void);
3781 diff --git a/kernel/cgroup.c b/kernel/cgroup.c
3782 index 7981850..ff2bce5 100644
3783 --- a/kernel/cgroup.c
3784 +++ b/kernel/cgroup.c
3785 @@ -1923,9 +1923,8 @@ static void cgroup_task_migrate(struct cgroup *cgrp, struct cgroup *oldcgrp,
3786 * trading it for newcg is protected by cgroup_mutex, we're safe to drop
3787 * it here; it will be freed under RCU.
3788 */
3789 - put_css_set(oldcg);
3790 -
3791 set_bit(CGRP_RELEASABLE, &oldcgrp->flags);
3792 + put_css_set(oldcg);
3793 }
3794
3795 /**
3796 @@ -4695,31 +4694,20 @@ static const struct file_operations proc_cgroupstats_operations = {
3797 *
3798 * A pointer to the shared css_set was automatically copied in
3799 * fork.c by dup_task_struct(). However, we ignore that copy, since
3800 - * it was not made under the protection of RCU, cgroup_mutex or
3801 - * threadgroup_change_begin(), so it might no longer be a valid
3802 - * cgroup pointer. cgroup_attach_task() might have already changed
3803 - * current->cgroups, allowing the previously referenced cgroup
3804 - * group to be removed and freed.
3805 - *
3806 - * Outside the pointer validity we also need to process the css_set
3807 - * inheritance between threadgoup_change_begin() and
3808 - * threadgoup_change_end(), this way there is no leak in any process
3809 - * wide migration performed by cgroup_attach_proc() that could otherwise
3810 - * miss a thread because it is too early or too late in the fork stage.
3811 + * it was not made under the protection of RCU or cgroup_mutex, so
3812 + * might no longer be a valid cgroup pointer. cgroup_attach_task() might
3813 + * have already changed current->cgroups, allowing the previously
3814 + * referenced cgroup group to be removed and freed.
3815 *
3816 * At the point that cgroup_fork() is called, 'current' is the parent
3817 * task, and the passed argument 'child' points to the child task.
3818 */
3819 void cgroup_fork(struct task_struct *child)
3820 {
3821 - /*
3822 - * We don't need to task_lock() current because current->cgroups
3823 - * can't be changed concurrently here. The parent obviously hasn't
3824 - * exited and called cgroup_exit(), and we are synchronized against
3825 - * cgroup migration through threadgroup_change_begin().
3826 - */
3827 + task_lock(current);
3828 child->cgroups = current->cgroups;
3829 get_css_set(child->cgroups);
3830 + task_unlock(current);
3831 INIT_LIST_HEAD(&child->cg_list);
3832 }
3833
3834 @@ -4772,19 +4760,10 @@ void cgroup_post_fork(struct task_struct *child)
3835 */
3836 if (use_task_css_set_links) {
3837 write_lock(&css_set_lock);
3838 - if (list_empty(&child->cg_list)) {
3839 - /*
3840 - * It's safe to use child->cgroups without task_lock()
3841 - * here because we are protected through
3842 - * threadgroup_change_begin() against concurrent
3843 - * css_set change in cgroup_task_migrate(). Also
3844 - * the task can't exit at that point until
3845 - * wake_up_new_task() is called, so we are protected
3846 - * against cgroup_exit() setting child->cgroup to
3847 - * init_css_set.
3848 - */
3849 + task_lock(child);
3850 + if (list_empty(&child->cg_list))
3851 list_add(&child->cg_list, &child->cgroups->tasks);
3852 - }
3853 + task_unlock(child);
3854 write_unlock(&css_set_lock);
3855 }
3856 }
3857 diff --git a/kernel/sys.c b/kernel/sys.c
3858 index 6fab59a..909148a 100644
3859 --- a/kernel/sys.c
3860 +++ b/kernel/sys.c
3861 @@ -1265,15 +1265,16 @@ DECLARE_RWSEM(uts_sem);
3862 * Work around broken programs that cannot handle "Linux 3.0".
3863 * Instead we map 3.x to 2.6.40+x, so e.g. 3.0 would be 2.6.40
3864 */
3865 -static int override_release(char __user *release, int len)
3866 +static int override_release(char __user *release, size_t len)
3867 {
3868 int ret = 0;
3869 - char buf[65];
3870
3871 if (current->personality & UNAME26) {
3872 - char *rest = UTS_RELEASE;
3873 + const char *rest = UTS_RELEASE;
3874 + char buf[65] = { 0 };
3875 int ndots = 0;
3876 unsigned v;
3877 + size_t copy;
3878
3879 while (*rest) {
3880 if (*rest == '.' && ++ndots >= 3)
3881 @@ -1283,8 +1284,9 @@ static int override_release(char __user *release, int len)
3882 rest++;
3883 }
3884 v = ((LINUX_VERSION_CODE >> 8) & 0xff) + 40;
3885 - snprintf(buf, len, "2.6.%u%s", v, rest);
3886 - ret = copy_to_user(release, buf, len);
3887 + copy = clamp_t(size_t, len, 1, sizeof(buf));
3888 + copy = scnprintf(buf, copy, "2.6.%u%s", v, rest);
3889 + ret = copy_to_user(release, buf, copy + 1);
3890 }
3891 return ret;
3892 }
3893 diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
3894 index 49491fa..ebd284f 100644
3895 --- a/kernel/trace/ring_buffer.c
3896 +++ b/kernel/trace/ring_buffer.c
3897 @@ -1567,6 +1567,10 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size,
3898
3899 put_online_cpus();
3900 } else {
3901 + /* Make sure this CPU has been intitialized */
3902 + if (!cpumask_test_cpu(cpu_id, buffer->cpumask))
3903 + goto out;
3904 +
3905 cpu_buffer = buffer->buffers[cpu_id];
3906
3907 if (nr_pages == cpu_buffer->nr_pages)
3908 diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
3909 index 830059d..fe29a64 100644
3910 --- a/net/8021q/vlan_core.c
3911 +++ b/net/8021q/vlan_core.c
3912 @@ -5,7 +5,7 @@
3913 #include <linux/export.h>
3914 #include "vlan.h"
3915
3916 -bool vlan_do_receive(struct sk_buff **skbp, bool last_handler)
3917 +bool vlan_do_receive(struct sk_buff **skbp)
3918 {
3919 struct sk_buff *skb = *skbp;
3920 u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK;
3921 @@ -13,14 +13,8 @@ bool vlan_do_receive(struct sk_buff **skbp, bool last_handler)
3922 struct vlan_pcpu_stats *rx_stats;
3923
3924 vlan_dev = vlan_find_dev(skb->dev, vlan_id);
3925 - if (!vlan_dev) {
3926 - /* Only the last call to vlan_do_receive() should change
3927 - * pkt_type to PACKET_OTHERHOST
3928 - */
3929 - if (vlan_id && last_handler)
3930 - skb->pkt_type = PACKET_OTHERHOST;
3931 + if (!vlan_dev)
3932 return false;
3933 - }
3934
3935 skb = *skbp = skb_share_check(skb, GFP_ATOMIC);
3936 if (unlikely(!skb))
3937 diff --git a/net/core/dev.c b/net/core/dev.c
3938 index 89e33a5..2fb9f59 100644
3939 --- a/net/core/dev.c
3940 +++ b/net/core/dev.c
3941 @@ -3275,18 +3275,18 @@ ncls:
3942 && !skb_pfmemalloc_protocol(skb))
3943 goto drop;
3944
3945 - rx_handler = rcu_dereference(skb->dev->rx_handler);
3946 if (vlan_tx_tag_present(skb)) {
3947 if (pt_prev) {
3948 ret = deliver_skb(skb, pt_prev, orig_dev);
3949 pt_prev = NULL;
3950 }
3951 - if (vlan_do_receive(&skb, !rx_handler))
3952 + if (vlan_do_receive(&skb))
3953 goto another_round;
3954 else if (unlikely(!skb))
3955 goto unlock;
3956 }
3957
3958 + rx_handler = rcu_dereference(skb->dev->rx_handler);
3959 if (rx_handler) {
3960 if (pt_prev) {
3961 ret = deliver_skb(skb, pt_prev, orig_dev);
3962 @@ -3306,6 +3306,9 @@ ncls:
3963 }
3964 }
3965
3966 + if (vlan_tx_nonzero_tag_present(skb))
3967 + skb->pkt_type = PACKET_OTHERHOST;
3968 +
3969 /* deliver only exact match when indicated */
3970 null_or_dev = deliver_exact ? skb->dev : NULL;
3971
3972 diff --git a/net/core/neighbour.c b/net/core/neighbour.c
3973 index 117afaf..058bb1e 100644
3974 --- a/net/core/neighbour.c
3975 +++ b/net/core/neighbour.c
3976 @@ -1301,8 +1301,6 @@ int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb)
3977 if (!dst)
3978 goto discard;
3979
3980 - __skb_pull(skb, skb_network_offset(skb));
3981 -
3982 if (!neigh_event_send(neigh, skb)) {
3983 int err;
3984 struct net_device *dev = neigh->dev;
3985 @@ -1312,6 +1310,7 @@ int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb)
3986 neigh_hh_init(neigh, dst);
3987
3988 do {
3989 + __skb_pull(skb, skb_network_offset(skb));
3990 seq = read_seqbegin(&neigh->ha_lock);
3991 err = dev_hard_header(skb, dev, ntohs(skb->protocol),
3992 neigh->ha, NULL, skb->len);
3993 @@ -1342,9 +1341,8 @@ int neigh_connected_output(struct neighbour *neigh, struct sk_buff *skb)
3994 unsigned int seq;
3995 int err;
3996
3997 - __skb_pull(skb, skb_network_offset(skb));
3998 -
3999 do {
4000 + __skb_pull(skb, skb_network_offset(skb));
4001 seq = read_seqbegin(&neigh->ha_lock);
4002 err = dev_hard_header(skb, dev, ntohs(skb->protocol),
4003 neigh->ha, NULL, skb->len);
4004 diff --git a/net/core/skbuff.c b/net/core/skbuff.c
4005 index e33ebae..ef172af 100644
4006 --- a/net/core/skbuff.c
4007 +++ b/net/core/skbuff.c
4008 @@ -641,53 +641,6 @@ void consume_skb(struct sk_buff *skb)
4009 }
4010 EXPORT_SYMBOL(consume_skb);
4011
4012 -/**
4013 - * skb_recycle - clean up an skb for reuse
4014 - * @skb: buffer
4015 - *
4016 - * Recycles the skb to be reused as a receive buffer. This
4017 - * function does any necessary reference count dropping, and
4018 - * cleans up the skbuff as if it just came from __alloc_skb().
4019 - */
4020 -void skb_recycle(struct sk_buff *skb)
4021 -{
4022 - struct skb_shared_info *shinfo;
4023 -
4024 - skb_release_head_state(skb);
4025 -
4026 - shinfo = skb_shinfo(skb);
4027 - memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
4028 - atomic_set(&shinfo->dataref, 1);
4029 -
4030 - memset(skb, 0, offsetof(struct sk_buff, tail));
4031 - skb->data = skb->head + NET_SKB_PAD;
4032 - skb_reset_tail_pointer(skb);
4033 -}
4034 -EXPORT_SYMBOL(skb_recycle);
4035 -
4036 -/**
4037 - * skb_recycle_check - check if skb can be reused for receive
4038 - * @skb: buffer
4039 - * @skb_size: minimum receive buffer size
4040 - *
4041 - * Checks that the skb passed in is not shared or cloned, and
4042 - * that it is linear and its head portion at least as large as
4043 - * skb_size so that it can be recycled as a receive buffer.
4044 - * If these conditions are met, this function does any necessary
4045 - * reference count dropping and cleans up the skbuff as if it
4046 - * just came from __alloc_skb().
4047 - */
4048 -bool skb_recycle_check(struct sk_buff *skb, int skb_size)
4049 -{
4050 - if (!skb_is_recycleable(skb, skb_size))
4051 - return false;
4052 -
4053 - skb_recycle(skb);
4054 -
4055 - return true;
4056 -}
4057 -EXPORT_SYMBOL(skb_recycle_check);
4058 -
4059 static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
4060 {
4061 new->tstamp = old->tstamp;
4062 diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
4063 index 8e2b475..f444ac7 100644
4064 --- a/net/ipv4/fib_frontend.c
4065 +++ b/net/ipv4/fib_frontend.c
4066 @@ -322,7 +322,8 @@ int fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
4067 {
4068 int r = secpath_exists(skb) ? 0 : IN_DEV_RPFILTER(idev);
4069
4070 - if (!r && !fib_num_tclassid_users(dev_net(dev))) {
4071 + if (!r && !fib_num_tclassid_users(dev_net(dev)) &&
4072 + (dev->ifindex != oif || !IN_DEV_TX_REDIRECTS(idev))) {
4073 *itag = 0;
4074 return 0;
4075 }
4076 diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
4077 index a747100..9633661 100644
4078 --- a/net/ipv4/fib_semantics.c
4079 +++ b/net/ipv4/fib_semantics.c
4080 @@ -840,6 +840,8 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
4081 change_nexthops(fi) {
4082 nexthop_nh->nh_parent = fi;
4083 nexthop_nh->nh_pcpu_rth_output = alloc_percpu(struct rtable __rcu *);
4084 + if (!nexthop_nh->nh_pcpu_rth_output)
4085 + goto failure;
4086 } endfor_nexthops(fi)
4087
4088 if (cfg->fc_mx) {
4089 diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
4090 index 7f75f21..0405cc8 100644
4091 --- a/net/ipv4/inet_connection_sock.c
4092 +++ b/net/ipv4/inet_connection_sock.c
4093 @@ -386,7 +386,7 @@ struct dst_entry *inet_csk_route_req(struct sock *sk,
4094 rt = ip_route_output_flow(net, fl4, sk);
4095 if (IS_ERR(rt))
4096 goto no_route;
4097 - if (opt && opt->opt.is_strictroute && rt->rt_gateway)
4098 + if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway)
4099 goto route_err;
4100 return &rt->dst;
4101
4102 @@ -422,7 +422,7 @@ struct dst_entry *inet_csk_route_child_sock(struct sock *sk,
4103 rt = ip_route_output_flow(net, fl4, sk);
4104 if (IS_ERR(rt))
4105 goto no_route;
4106 - if (opt && opt->opt.is_strictroute && rt->rt_gateway)
4107 + if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway)
4108 goto route_err;
4109 rcu_read_unlock();
4110 return &rt->dst;
4111 diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
4112 index ab09b12..694de3b 100644
4113 --- a/net/ipv4/ip_forward.c
4114 +++ b/net/ipv4/ip_forward.c
4115 @@ -85,7 +85,7 @@ int ip_forward(struct sk_buff *skb)
4116
4117 rt = skb_rtable(skb);
4118
4119 - if (opt->is_strictroute && opt->nexthop != rt->rt_gateway)
4120 + if (opt->is_strictroute && rt->rt_uses_gateway)
4121 goto sr_failed;
4122
4123 if (unlikely(skb->len > dst_mtu(&rt->dst) && !skb_is_gso(skb) &&
4124 diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
4125 index c196d74..94ad7ea 100644
4126 --- a/net/ipv4/ip_output.c
4127 +++ b/net/ipv4/ip_output.c
4128 @@ -193,7 +193,7 @@ static inline int ip_finish_output2(struct sk_buff *skb)
4129 }
4130
4131 rcu_read_lock_bh();
4132 - nexthop = rt->rt_gateway ? rt->rt_gateway : ip_hdr(skb)->daddr;
4133 + nexthop = (__force u32) rt_nexthop(rt, ip_hdr(skb)->daddr);
4134 neigh = __ipv4_neigh_lookup_noref(dev, nexthop);
4135 if (unlikely(!neigh))
4136 neigh = __neigh_create(&arp_tbl, &nexthop, dev, false);
4137 @@ -371,7 +371,7 @@ int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl)
4138 skb_dst_set_noref(skb, &rt->dst);
4139
4140 packet_routed:
4141 - if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_gateway)
4142 + if (inet_opt && inet_opt->opt.is_strictroute && rt->rt_uses_gateway)
4143 goto no_route;
4144
4145 /* OK, we know where to send it, allocate and build IP header. */
4146 diff --git a/net/ipv4/route.c b/net/ipv4/route.c
4147 index fd9af60..2a1383c 100644
4148 --- a/net/ipv4/route.c
4149 +++ b/net/ipv4/route.c
4150 @@ -802,7 +802,8 @@ void ip_rt_send_redirect(struct sk_buff *skb)
4151 net = dev_net(rt->dst.dev);
4152 peer = inet_getpeer_v4(net->ipv4.peers, ip_hdr(skb)->saddr, 1);
4153 if (!peer) {
4154 - icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway);
4155 + icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST,
4156 + rt_nexthop(rt, ip_hdr(skb)->daddr));
4157 return;
4158 }
4159
4160 @@ -827,7 +828,9 @@ void ip_rt_send_redirect(struct sk_buff *skb)
4161 time_after(jiffies,
4162 (peer->rate_last +
4163 (ip_rt_redirect_load << peer->rate_tokens)))) {
4164 - icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway);
4165 + __be32 gw = rt_nexthop(rt, ip_hdr(skb)->daddr);
4166 +
4167 + icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, gw);
4168 peer->rate_last = jiffies;
4169 ++peer->rate_tokens;
4170 #ifdef CONFIG_IP_ROUTE_VERBOSE
4171 @@ -835,7 +838,7 @@ void ip_rt_send_redirect(struct sk_buff *skb)
4172 peer->rate_tokens == ip_rt_redirect_number)
4173 net_warn_ratelimited("host %pI4/if%d ignores redirects for %pI4 to %pI4\n",
4174 &ip_hdr(skb)->saddr, inet_iif(skb),
4175 - &ip_hdr(skb)->daddr, &rt->rt_gateway);
4176 + &ip_hdr(skb)->daddr, &gw);
4177 #endif
4178 }
4179 out_put_peer:
4180 @@ -904,22 +907,32 @@ out: kfree_skb(skb);
4181 return 0;
4182 }
4183
4184 -static u32 __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
4185 +static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
4186 {
4187 + struct dst_entry *dst = &rt->dst;
4188 struct fib_result res;
4189
4190 + if (dst->dev->mtu < mtu)
4191 + return;
4192 +
4193 if (mtu < ip_rt_min_pmtu)
4194 mtu = ip_rt_min_pmtu;
4195
4196 + if (!rt->rt_pmtu) {
4197 + dst->obsolete = DST_OBSOLETE_KILL;
4198 + } else {
4199 + rt->rt_pmtu = mtu;
4200 + dst->expires = max(1UL, jiffies + ip_rt_mtu_expires);
4201 + }
4202 +
4203 rcu_read_lock();
4204 - if (fib_lookup(dev_net(rt->dst.dev), fl4, &res) == 0) {
4205 + if (fib_lookup(dev_net(dst->dev), fl4, &res) == 0) {
4206 struct fib_nh *nh = &FIB_RES_NH(res);
4207
4208 update_or_create_fnhe(nh, fl4->daddr, 0, mtu,
4209 jiffies + ip_rt_mtu_expires);
4210 }
4211 rcu_read_unlock();
4212 - return mtu;
4213 }
4214
4215 static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
4216 @@ -929,14 +942,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
4217 struct flowi4 fl4;
4218
4219 ip_rt_build_flow_key(&fl4, sk, skb);
4220 - mtu = __ip_rt_update_pmtu(rt, &fl4, mtu);
4221 -
4222 - if (!rt->rt_pmtu) {
4223 - dst->obsolete = DST_OBSOLETE_KILL;
4224 - } else {
4225 - rt->rt_pmtu = mtu;
4226 - rt->dst.expires = max(1UL, jiffies + ip_rt_mtu_expires);
4227 - }
4228 + __ip_rt_update_pmtu(rt, &fl4, mtu);
4229 }
4230
4231 void ipv4_update_pmtu(struct sk_buff *skb, struct net *net, u32 mtu,
4232 @@ -1123,7 +1129,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst)
4233 mtu = dst->dev->mtu;
4234
4235 if (unlikely(dst_metric_locked(dst, RTAX_MTU))) {
4236 - if (rt->rt_gateway && mtu > 576)
4237 + if (rt->rt_uses_gateway && mtu > 576)
4238 mtu = 576;
4239 }
4240
4241 @@ -1174,7 +1180,9 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
4242 if (fnhe->fnhe_gw) {
4243 rt->rt_flags |= RTCF_REDIRECTED;
4244 rt->rt_gateway = fnhe->fnhe_gw;
4245 - }
4246 + rt->rt_uses_gateway = 1;
4247 + } else if (!rt->rt_gateway)
4248 + rt->rt_gateway = daddr;
4249
4250 orig = rcu_dereference(fnhe->fnhe_rth);
4251 rcu_assign_pointer(fnhe->fnhe_rth, rt);
4252 @@ -1183,13 +1191,6 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
4253
4254 fnhe->fnhe_stamp = jiffies;
4255 ret = true;
4256 - } else {
4257 - /* Routes we intend to cache in nexthop exception have
4258 - * the DST_NOCACHE bit clear. However, if we are
4259 - * unsuccessful at storing this route into the cache
4260 - * we really need to set it.
4261 - */
4262 - rt->dst.flags |= DST_NOCACHE;
4263 }
4264 spin_unlock_bh(&fnhe_lock);
4265
4266 @@ -1204,8 +1205,6 @@ static bool rt_cache_route(struct fib_nh *nh, struct rtable *rt)
4267 if (rt_is_input_route(rt)) {
4268 p = (struct rtable **)&nh->nh_rth_input;
4269 } else {
4270 - if (!nh->nh_pcpu_rth_output)
4271 - goto nocache;
4272 p = (struct rtable **)__this_cpu_ptr(nh->nh_pcpu_rth_output);
4273 }
4274 orig = *p;
4275 @@ -1214,16 +1213,8 @@ static bool rt_cache_route(struct fib_nh *nh, struct rtable *rt)
4276 if (prev == orig) {
4277 if (orig)
4278 rt_free(orig);
4279 - } else {
4280 - /* Routes we intend to cache in the FIB nexthop have
4281 - * the DST_NOCACHE bit clear. However, if we are
4282 - * unsuccessful at storing this route into the cache
4283 - * we really need to set it.
4284 - */
4285 -nocache:
4286 - rt->dst.flags |= DST_NOCACHE;
4287 + } else
4288 ret = false;
4289 - }
4290
4291 return ret;
4292 }
4293 @@ -1284,8 +1275,10 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
4294 if (fi) {
4295 struct fib_nh *nh = &FIB_RES_NH(*res);
4296
4297 - if (nh->nh_gw && nh->nh_scope == RT_SCOPE_LINK)
4298 + if (nh->nh_gw && nh->nh_scope == RT_SCOPE_LINK) {
4299 rt->rt_gateway = nh->nh_gw;
4300 + rt->rt_uses_gateway = 1;
4301 + }
4302 dst_init_metrics(&rt->dst, fi->fib_metrics, true);
4303 #ifdef CONFIG_IP_ROUTE_CLASSID
4304 rt->dst.tclassid = nh->nh_tclassid;
4305 @@ -1294,8 +1287,18 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
4306 cached = rt_bind_exception(rt, fnhe, daddr);
4307 else if (!(rt->dst.flags & DST_NOCACHE))
4308 cached = rt_cache_route(nh, rt);
4309 - }
4310 - if (unlikely(!cached))
4311 + if (unlikely(!cached)) {
4312 + /* Routes we intend to cache in nexthop exception or
4313 + * FIB nexthop have the DST_NOCACHE bit clear.
4314 + * However, if we are unsuccessful at storing this
4315 + * route into the cache we really need to set it.
4316 + */
4317 + rt->dst.flags |= DST_NOCACHE;
4318 + if (!rt->rt_gateway)
4319 + rt->rt_gateway = daddr;
4320 + rt_add_uncached_list(rt);
4321 + }
4322 + } else
4323 rt_add_uncached_list(rt);
4324
4325 #ifdef CONFIG_IP_ROUTE_CLASSID
4326 @@ -1363,6 +1366,7 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
4327 rth->rt_iif = 0;
4328 rth->rt_pmtu = 0;
4329 rth->rt_gateway = 0;
4330 + rth->rt_uses_gateway = 0;
4331 INIT_LIST_HEAD(&rth->rt_uncached);
4332 if (our) {
4333 rth->dst.input= ip_local_deliver;
4334 @@ -1432,7 +1436,6 @@ static int __mkroute_input(struct sk_buff *skb,
4335 return -EINVAL;
4336 }
4337
4338 -
4339 err = fib_validate_source(skb, saddr, daddr, tos, FIB_RES_OIF(*res),
4340 in_dev->dev, in_dev, &itag);
4341 if (err < 0) {
4342 @@ -1442,10 +1445,13 @@ static int __mkroute_input(struct sk_buff *skb,
4343 goto cleanup;
4344 }
4345
4346 - if (out_dev == in_dev && err &&
4347 + do_cache = res->fi && !itag;
4348 + if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) &&
4349 (IN_DEV_SHARED_MEDIA(out_dev) ||
4350 - inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res))))
4351 + inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) {
4352 flags |= RTCF_DOREDIRECT;
4353 + do_cache = false;
4354 + }
4355
4356 if (skb->protocol != htons(ETH_P_IP)) {
4357 /* Not IP (i.e. ARP). Do not create route, if it is
4358 @@ -1462,15 +1468,11 @@ static int __mkroute_input(struct sk_buff *skb,
4359 }
4360 }
4361
4362 - do_cache = false;
4363 - if (res->fi) {
4364 - if (!itag) {
4365 - rth = rcu_dereference(FIB_RES_NH(*res).nh_rth_input);
4366 - if (rt_cache_valid(rth)) {
4367 - skb_dst_set_noref(skb, &rth->dst);
4368 - goto out;
4369 - }
4370 - do_cache = true;
4371 + if (do_cache) {
4372 + rth = rcu_dereference(FIB_RES_NH(*res).nh_rth_input);
4373 + if (rt_cache_valid(rth)) {
4374 + skb_dst_set_noref(skb, &rth->dst);
4375 + goto out;
4376 }
4377 }
4378
4379 @@ -1489,6 +1491,7 @@ static int __mkroute_input(struct sk_buff *skb,
4380 rth->rt_iif = 0;
4381 rth->rt_pmtu = 0;
4382 rth->rt_gateway = 0;
4383 + rth->rt_uses_gateway = 0;
4384 INIT_LIST_HEAD(&rth->rt_uncached);
4385
4386 rth->dst.input = ip_forward;
4387 @@ -1656,6 +1659,7 @@ local_input:
4388 rth->rt_iif = 0;
4389 rth->rt_pmtu = 0;
4390 rth->rt_gateway = 0;
4391 + rth->rt_uses_gateway = 0;
4392 INIT_LIST_HEAD(&rth->rt_uncached);
4393 if (res.type == RTN_UNREACHABLE) {
4394 rth->dst.input= ip_error;
4395 @@ -1758,6 +1762,7 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
4396 struct in_device *in_dev;
4397 u16 type = res->type;
4398 struct rtable *rth;
4399 + bool do_cache;
4400
4401 in_dev = __in_dev_get_rcu(dev_out);
4402 if (!in_dev)
4403 @@ -1794,24 +1799,36 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
4404 }
4405
4406 fnhe = NULL;
4407 + do_cache = fi != NULL;
4408 if (fi) {
4409 struct rtable __rcu **prth;
4410 + struct fib_nh *nh = &FIB_RES_NH(*res);
4411
4412 - fnhe = find_exception(&FIB_RES_NH(*res), fl4->daddr);
4413 + fnhe = find_exception(nh, fl4->daddr);
4414 if (fnhe)
4415 prth = &fnhe->fnhe_rth;
4416 - else
4417 - prth = __this_cpu_ptr(FIB_RES_NH(*res).nh_pcpu_rth_output);
4418 + else {
4419 + if (unlikely(fl4->flowi4_flags &
4420 + FLOWI_FLAG_KNOWN_NH &&
4421 + !(nh->nh_gw &&
4422 + nh->nh_scope == RT_SCOPE_LINK))) {
4423 + do_cache = false;
4424 + goto add;
4425 + }
4426 + prth = __this_cpu_ptr(nh->nh_pcpu_rth_output);
4427 + }
4428 rth = rcu_dereference(*prth);
4429 if (rt_cache_valid(rth)) {
4430 dst_hold(&rth->dst);
4431 return rth;
4432 }
4433 }
4434 +
4435 +add:
4436 rth = rt_dst_alloc(dev_out,
4437 IN_DEV_CONF_GET(in_dev, NOPOLICY),
4438 IN_DEV_CONF_GET(in_dev, NOXFRM),
4439 - fi);
4440 + do_cache);
4441 if (!rth)
4442 return ERR_PTR(-ENOBUFS);
4443
4444 @@ -1824,6 +1841,7 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
4445 rth->rt_iif = orig_oif ? : 0;
4446 rth->rt_pmtu = 0;
4447 rth->rt_gateway = 0;
4448 + rth->rt_uses_gateway = 0;
4449 INIT_LIST_HEAD(&rth->rt_uncached);
4450
4451 RT_CACHE_STAT_INC(out_slow_tot);
4452 @@ -2102,6 +2120,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
4453 rt->rt_flags = ort->rt_flags;
4454 rt->rt_type = ort->rt_type;
4455 rt->rt_gateway = ort->rt_gateway;
4456 + rt->rt_uses_gateway = ort->rt_uses_gateway;
4457
4458 INIT_LIST_HEAD(&rt->rt_uncached);
4459
4460 @@ -2180,12 +2199,22 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
4461 if (nla_put_be32(skb, RTA_PREFSRC, fl4->saddr))
4462 goto nla_put_failure;
4463 }
4464 - if (rt->rt_gateway &&
4465 + if (rt->rt_uses_gateway &&
4466 nla_put_be32(skb, RTA_GATEWAY, rt->rt_gateway))
4467 goto nla_put_failure;
4468
4469 + expires = rt->dst.expires;
4470 + if (expires) {
4471 + unsigned long now = jiffies;
4472 +
4473 + if (time_before(now, expires))
4474 + expires -= now;
4475 + else
4476 + expires = 0;
4477 + }
4478 +
4479 memcpy(metrics, dst_metrics_ptr(&rt->dst), sizeof(metrics));
4480 - if (rt->rt_pmtu)
4481 + if (rt->rt_pmtu && expires)
4482 metrics[RTAX_MTU - 1] = rt->rt_pmtu;
4483 if (rtnetlink_put_metrics(skb, metrics) < 0)
4484 goto nla_put_failure;
4485 @@ -2195,13 +2224,6 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
4486 goto nla_put_failure;
4487
4488 error = rt->dst.error;
4489 - expires = rt->dst.expires;
4490 - if (expires) {
4491 - if (time_before(jiffies, expires))
4492 - expires -= jiffies;
4493 - else
4494 - expires = 0;
4495 - }
4496
4497 if (rt_is_input_route(rt)) {
4498 if (nla_put_u32(skb, RTA_IIF, rt->rt_iif))
4499 diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
4500 index 00a748d..db7bfad 100644
4501 --- a/net/ipv4/tcp_ipv4.c
4502 +++ b/net/ipv4/tcp_ipv4.c
4503 @@ -693,10 +693,11 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
4504 arg.csumoffset = offsetof(struct tcphdr, check) / 2;
4505 arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0;
4506 /* When socket is gone, all binding information is lost.
4507 - * routing might fail in this case. using iif for oif to
4508 - * make sure we can deliver it
4509 + * routing might fail in this case. No choice here, if we choose to force
4510 + * input interface, we will misroute in case of asymmetric route.
4511 */
4512 - arg.bound_dev_if = sk ? sk->sk_bound_dev_if : inet_iif(skb);
4513 + if (sk)
4514 + arg.bound_dev_if = sk->sk_bound_dev_if;
4515
4516 net = dev_net(skb_dst(skb)->dev);
4517 arg.tos = ip_hdr(skb)->tos;
4518 diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
4519 index 681ea2f..05c5ab8 100644
4520 --- a/net/ipv4/xfrm4_policy.c
4521 +++ b/net/ipv4/xfrm4_policy.c
4522 @@ -91,6 +91,7 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
4523 RTCF_LOCAL);
4524 xdst->u.rt.rt_type = rt->rt_type;
4525 xdst->u.rt.rt_gateway = rt->rt_gateway;
4526 + xdst->u.rt.rt_uses_gateway = rt->rt_uses_gateway;
4527 xdst->u.rt.rt_pmtu = rt->rt_pmtu;
4528 INIT_LIST_HEAD(&xdst->u.rt.rt_uncached);
4529
4530 diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
4531 index ea3e9af..b10374d 100644
4532 --- a/net/ipv6/addrconf.c
4533 +++ b/net/ipv6/addrconf.c
4534 @@ -3088,14 +3088,15 @@ static struct inet6_ifaddr *if6_get_first(struct seq_file *seq, loff_t pos)
4535 struct hlist_node *n;
4536 hlist_for_each_entry_rcu_bh(ifa, n, &inet6_addr_lst[state->bucket],
4537 addr_lst) {
4538 + if (!net_eq(dev_net(ifa->idev->dev), net))
4539 + continue;
4540 /* sync with offset */
4541 if (p < state->offset) {
4542 p++;
4543 continue;
4544 }
4545 state->offset++;
4546 - if (net_eq(dev_net(ifa->idev->dev), net))
4547 - return ifa;
4548 + return ifa;
4549 }
4550
4551 /* prepare for next bucket */
4552 @@ -3113,18 +3114,20 @@ static struct inet6_ifaddr *if6_get_next(struct seq_file *seq,
4553 struct hlist_node *n = &ifa->addr_lst;
4554
4555 hlist_for_each_entry_continue_rcu_bh(ifa, n, addr_lst) {
4556 + if (!net_eq(dev_net(ifa->idev->dev), net))
4557 + continue;
4558 state->offset++;
4559 - if (net_eq(dev_net(ifa->idev->dev), net))
4560 - return ifa;
4561 + return ifa;
4562 }
4563
4564 while (++state->bucket < IN6_ADDR_HSIZE) {
4565 state->offset = 0;
4566 hlist_for_each_entry_rcu_bh(ifa, n,
4567 &inet6_addr_lst[state->bucket], addr_lst) {
4568 + if (!net_eq(dev_net(ifa->idev->dev), net))
4569 + continue;
4570 state->offset++;
4571 - if (net_eq(dev_net(ifa->idev->dev), net))
4572 - return ifa;
4573 + return ifa;
4574 }
4575 }
4576
4577 diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
4578 index e22e6d8..f757e3b 100644
4579 --- a/net/ipv6/af_inet6.c
4580 +++ b/net/ipv6/af_inet6.c
4581 @@ -880,22 +880,25 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
4582 nlen = skb_network_header_len(skb);
4583
4584 for (p = *head; p; p = p->next) {
4585 - struct ipv6hdr *iph2;
4586 + const struct ipv6hdr *iph2;
4587 + __be32 first_word; /* <Version:4><Traffic_Class:8><Flow_Label:20> */
4588
4589 if (!NAPI_GRO_CB(p)->same_flow)
4590 continue;
4591
4592 iph2 = ipv6_hdr(p);
4593 + first_word = *(__be32 *)iph ^ *(__be32 *)iph2 ;
4594
4595 - /* All fields must match except length. */
4596 + /* All fields must match except length and Traffic Class. */
4597 if (nlen != skb_network_header_len(p) ||
4598 - memcmp(iph, iph2, offsetof(struct ipv6hdr, payload_len)) ||
4599 + (first_word & htonl(0xF00FFFFF)) ||
4600 memcmp(&iph->nexthdr, &iph2->nexthdr,
4601 nlen - offsetof(struct ipv6hdr, nexthdr))) {
4602 NAPI_GRO_CB(p)->same_flow = 0;
4603 continue;
4604 }
4605 -
4606 + /* flush if Traffic Class fields are different */
4607 + NAPI_GRO_CB(p)->flush |= !!(first_word & htonl(0x0FF00000));
4608 NAPI_GRO_CB(p)->flush |= flush;
4609 }
4610
4611 diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
4612 index acd32e3..7e32d42 100644
4613 --- a/net/ipv6/tcp_ipv6.c
4614 +++ b/net/ipv6/tcp_ipv6.c
4615 @@ -863,7 +863,8 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
4616 __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr);
4617
4618 fl6.flowi6_proto = IPPROTO_TCP;
4619 - fl6.flowi6_oif = inet6_iif(skb);
4620 + if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL)
4621 + fl6.flowi6_oif = inet6_iif(skb);
4622 fl6.fl6_dport = t1->dest;
4623 fl6.fl6_sport = t1->source;
4624 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
4625 diff --git a/net/mac80211/mesh_sync.c b/net/mac80211/mesh_sync.c
4626 index accfa00..a16b7b4 100644
4627 --- a/net/mac80211/mesh_sync.c
4628 +++ b/net/mac80211/mesh_sync.c
4629 @@ -56,7 +56,6 @@ void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata)
4630 u64 tsfdelta;
4631
4632 spin_lock_bh(&ifmsh->sync_offset_lock);
4633 -
4634 if (ifmsh->sync_offset_clockdrift_max < beacon_int_fraction) {
4635 msync_dbg(sdata, "TBTT : max clockdrift=%lld; adjusting\n",
4636 (long long) ifmsh->sync_offset_clockdrift_max);
4637 @@ -69,11 +68,11 @@ void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata)
4638 tsfdelta = -beacon_int_fraction;
4639 ifmsh->sync_offset_clockdrift_max -= beacon_int_fraction;
4640 }
4641 + spin_unlock_bh(&ifmsh->sync_offset_lock);
4642
4643 tsf = drv_get_tsf(local, sdata);
4644 if (tsf != -1ULL)
4645 drv_set_tsf(local, sdata, tsf + tsfdelta);
4646 - spin_unlock_bh(&ifmsh->sync_offset_lock);
4647 }
4648
4649 static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
4650 diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c
4651 index 65b616a..c3c6291 100644
4652 --- a/net/netfilter/ipvs/ip_vs_xmit.c
4653 +++ b/net/netfilter/ipvs/ip_vs_xmit.c
4654 @@ -49,6 +49,7 @@ enum {
4655 IP_VS_RT_MODE_RDR = 4, /* Allow redirect from remote daddr to
4656 * local
4657 */
4658 + IP_VS_RT_MODE_KNOWN_NH = 16,/* Route via remote addr */
4659 };
4660
4661 /*
4662 @@ -103,6 +104,8 @@ __ip_vs_get_out_rt(struct sk_buff *skb, struct ip_vs_dest *dest,
4663 memset(&fl4, 0, sizeof(fl4));
4664 fl4.daddr = dest->addr.ip;
4665 fl4.flowi4_tos = rtos;
4666 + fl4.flowi4_flags = (rt_mode & IP_VS_RT_MODE_KNOWN_NH) ?
4667 + FLOWI_FLAG_KNOWN_NH : 0;
4668 rt = ip_route_output_key(net, &fl4);
4669 if (IS_ERR(rt)) {
4670 spin_unlock(&dest->dst_lock);
4671 @@ -127,6 +130,8 @@ __ip_vs_get_out_rt(struct sk_buff *skb, struct ip_vs_dest *dest,
4672 memset(&fl4, 0, sizeof(fl4));
4673 fl4.daddr = daddr;
4674 fl4.flowi4_tos = rtos;
4675 + fl4.flowi4_flags = (rt_mode & IP_VS_RT_MODE_KNOWN_NH) ?
4676 + FLOWI_FLAG_KNOWN_NH : 0;
4677 rt = ip_route_output_key(net, &fl4);
4678 if (IS_ERR(rt)) {
4679 IP_VS_DBG_RL("ip_route_output error, dest: %pI4\n",
4680 @@ -1014,7 +1019,8 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
4681 if (!(rt = __ip_vs_get_out_rt(skb, cp->dest, cp->daddr.ip,
4682 RT_TOS(iph->tos),
4683 IP_VS_RT_MODE_LOCAL |
4684 - IP_VS_RT_MODE_NON_LOCAL, NULL)))
4685 + IP_VS_RT_MODE_NON_LOCAL |
4686 + IP_VS_RT_MODE_KNOWN_NH, NULL)))
4687 goto tx_error_icmp;
4688 if (rt->rt_flags & RTCF_LOCAL) {
4689 ip_rt_put(rt);
4690 diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
4691 index 5270238..9172179 100644
4692 --- a/net/netlink/af_netlink.c
4693 +++ b/net/netlink/af_netlink.c
4694 @@ -169,6 +169,8 @@ static void netlink_sock_destruct(struct sock *sk)
4695 if (nlk->cb) {
4696 if (nlk->cb->done)
4697 nlk->cb->done(nlk->cb);
4698 +
4699 + module_put(nlk->cb->module);
4700 netlink_destroy_callback(nlk->cb);
4701 }
4702
4703 @@ -1760,6 +1762,7 @@ static int netlink_dump(struct sock *sk)
4704 nlk->cb = NULL;
4705 mutex_unlock(nlk->cb_mutex);
4706
4707 + module_put(cb->module);
4708 netlink_consume_callback(cb);
4709 return 0;
4710
4711 @@ -1769,9 +1772,9 @@ errout_skb:
4712 return err;
4713 }
4714
4715 -int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
4716 - const struct nlmsghdr *nlh,
4717 - struct netlink_dump_control *control)
4718 +int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
4719 + const struct nlmsghdr *nlh,
4720 + struct netlink_dump_control *control)
4721 {
4722 struct netlink_callback *cb;
4723 struct sock *sk;
4724 @@ -1786,6 +1789,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
4725 cb->done = control->done;
4726 cb->nlh = nlh;
4727 cb->data = control->data;
4728 + cb->module = control->module;
4729 cb->min_dump_alloc = control->min_dump_alloc;
4730 atomic_inc(&skb->users);
4731 cb->skb = skb;
4732 @@ -1796,19 +1800,28 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
4733 return -ECONNREFUSED;
4734 }
4735 nlk = nlk_sk(sk);
4736 - /* A dump is in progress... */
4737 +
4738 mutex_lock(nlk->cb_mutex);
4739 + /* A dump is in progress... */
4740 if (nlk->cb) {
4741 mutex_unlock(nlk->cb_mutex);
4742 netlink_destroy_callback(cb);
4743 - sock_put(sk);
4744 - return -EBUSY;
4745 + ret = -EBUSY;
4746 + goto out;
4747 }
4748 + /* add reference of module which cb->dump belongs to */
4749 + if (!try_module_get(cb->module)) {
4750 + mutex_unlock(nlk->cb_mutex);
4751 + netlink_destroy_callback(cb);
4752 + ret = -EPROTONOSUPPORT;
4753 + goto out;
4754 + }
4755 +
4756 nlk->cb = cb;
4757 mutex_unlock(nlk->cb_mutex);
4758
4759 ret = netlink_dump(sk);
4760 -
4761 +out:
4762 sock_put(sk);
4763
4764 if (ret)
4765 @@ -1819,7 +1832,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
4766 */
4767 return -EINTR;
4768 }
4769 -EXPORT_SYMBOL(netlink_dump_start);
4770 +EXPORT_SYMBOL(__netlink_dump_start);
4771
4772 void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
4773 {
4774 diff --git a/net/rds/send.c b/net/rds/send.c
4775 index 96531d4..88eace5 100644
4776 --- a/net/rds/send.c
4777 +++ b/net/rds/send.c
4778 @@ -1122,7 +1122,7 @@ rds_send_pong(struct rds_connection *conn, __be16 dport)
4779 rds_stats_inc(s_send_pong);
4780
4781 if (!test_bit(RDS_LL_SEND_FULL, &conn->c_flags))
4782 - rds_send_xmit(conn);
4783 + queue_delayed_work(rds_wq, &conn->c_send_w, 0);
4784
4785 rds_message_put(rm);
4786 return 0;
4787 diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
4788 index 2afd2a8..f86d95e 100644
4789 --- a/net/sunrpc/cache.c
4790 +++ b/net/sunrpc/cache.c
4791 @@ -1409,11 +1409,11 @@ static ssize_t read_flush(struct file *file, char __user *buf,
4792 size_t count, loff_t *ppos,
4793 struct cache_detail *cd)
4794 {
4795 - char tbuf[20];
4796 + char tbuf[22];
4797 unsigned long p = *ppos;
4798 size_t len;
4799
4800 - sprintf(tbuf, "%lu\n", convert_to_wallclock(cd->flush_time));
4801 + snprintf(tbuf, sizeof(tbuf), "%lu\n", convert_to_wallclock(cd->flush_time));
4802 len = strlen(tbuf);
4803 if (p >= len)
4804 return 0;
4805 diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
4806 index d1988cf..97f8918 100644
4807 --- a/net/sunrpc/xprtsock.c
4808 +++ b/net/sunrpc/xprtsock.c
4809 @@ -2539,6 +2539,7 @@ static struct rpc_xprt_ops xs_tcp_ops = {
4810 static struct rpc_xprt_ops bc_tcp_ops = {
4811 .reserve_xprt = xprt_reserve_xprt,
4812 .release_xprt = xprt_release_xprt,
4813 + .alloc_slot = xprt_alloc_slot,
4814 .rpcbind = xs_local_rpcbind,
4815 .buf_alloc = bc_malloc,
4816 .buf_free = bc_free,