Annotation of /trunk/kernel26-alx/patches-3.10/0137-3.10.38-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(hide annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 22573 byte(s)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 22573 byte(s)
-3.10.84-alx-r1
1 | niro | 2672 | diff --git a/Makefile b/Makefile |
2 | index bd9fb5b72fc0..bd51b50a567b 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 10 | ||
8 | -SUBLEVEL = 37 | ||
9 | +SUBLEVEL = 38 | ||
10 | EXTRAVERSION = | ||
11 | NAME = TOSSUG Baby Fish | ||
12 | |||
13 | diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig | ||
14 | index 9ac9f1666339..2668b3142fa2 100644 | ||
15 | --- a/arch/sparc/Kconfig | ||
16 | +++ b/arch/sparc/Kconfig | ||
17 | @@ -25,7 +25,7 @@ config SPARC | ||
18 | select RTC_DRV_M48T59 | ||
19 | select HAVE_DMA_ATTRS | ||
20 | select HAVE_DMA_API_DEBUG | ||
21 | - select HAVE_ARCH_JUMP_LABEL | ||
22 | + select HAVE_ARCH_JUMP_LABEL if SPARC64 | ||
23 | select HAVE_GENERIC_HARDIRQS | ||
24 | select GENERIC_IRQ_SHOW | ||
25 | select ARCH_WANT_IPC_PARSE_VERSION | ||
26 | diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h | ||
27 | index e562d3caee57..ad7e178337f1 100644 | ||
28 | --- a/arch/sparc/include/asm/uaccess_64.h | ||
29 | +++ b/arch/sparc/include/asm/uaccess_64.h | ||
30 | @@ -262,8 +262,8 @@ extern unsigned long __must_check __clear_user(void __user *, unsigned long); | ||
31 | extern __must_check long strlen_user(const char __user *str); | ||
32 | extern __must_check long strnlen_user(const char __user *str, long n); | ||
33 | |||
34 | -#define __copy_to_user_inatomic ___copy_to_user | ||
35 | -#define __copy_from_user_inatomic ___copy_from_user | ||
36 | +#define __copy_to_user_inatomic __copy_to_user | ||
37 | +#define __copy_from_user_inatomic __copy_from_user | ||
38 | |||
39 | struct pt_regs; | ||
40 | extern unsigned long compute_effective_address(struct pt_regs *, | ||
41 | diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c | ||
42 | index baf4366e2d6a..906cbf0f8608 100644 | ||
43 | --- a/arch/sparc/kernel/pci.c | ||
44 | +++ b/arch/sparc/kernel/pci.c | ||
45 | @@ -399,8 +399,8 @@ static void apb_fake_ranges(struct pci_dev *dev, | ||
46 | apb_calc_first_last(map, &first, &last); | ||
47 | res = bus->resource[1]; | ||
48 | res->flags = IORESOURCE_MEM; | ||
49 | - region.start = (first << 21); | ||
50 | - region.end = (last << 21) + ((1 << 21) - 1); | ||
51 | + region.start = (first << 29); | ||
52 | + region.end = (last << 29) + ((1 << 29) - 1); | ||
53 | pcibios_bus_to_resource(dev, res, ®ion); | ||
54 | } | ||
55 | |||
56 | diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c | ||
57 | index baebab215492..b9cc9763faf4 100644 | ||
58 | --- a/arch/sparc/kernel/process_64.c | ||
59 | +++ b/arch/sparc/kernel/process_64.c | ||
60 | @@ -57,9 +57,12 @@ void arch_cpu_idle(void) | ||
61 | { | ||
62 | if (tlb_type != hypervisor) { | ||
63 | touch_nmi_watchdog(); | ||
64 | + local_irq_enable(); | ||
65 | } else { | ||
66 | unsigned long pstate; | ||
67 | |||
68 | + local_irq_enable(); | ||
69 | + | ||
70 | /* The sun4v sleeping code requires that we have PSTATE.IE cleared over | ||
71 | * the cpu sleep hypervisor call. | ||
72 | */ | ||
73 | @@ -81,7 +84,6 @@ void arch_cpu_idle(void) | ||
74 | : "=&r" (pstate) | ||
75 | : "i" (PSTATE_IE)); | ||
76 | } | ||
77 | - local_irq_enable(); | ||
78 | } | ||
79 | |||
80 | #ifdef CONFIG_HOTPLUG_CPU | ||
81 | diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S | ||
82 | index 73ec8a798d95..c79c687fbe1e 100644 | ||
83 | --- a/arch/sparc/kernel/syscalls.S | ||
84 | +++ b/arch/sparc/kernel/syscalls.S | ||
85 | @@ -189,7 +189,8 @@ linux_sparc_syscall32: | ||
86 | mov %i0, %l5 ! IEU1 | ||
87 | 5: call %l7 ! CTI Group brk forced | ||
88 | srl %i5, 0, %o5 ! IEU1 | ||
89 | - ba,a,pt %xcc, 3f | ||
90 | + ba,pt %xcc, 3f | ||
91 | + sra %o0, 0, %o0 | ||
92 | |||
93 | /* Linux native system calls enter here... */ | ||
94 | .align 32 | ||
95 | @@ -217,7 +218,6 @@ linux_sparc_syscall: | ||
96 | 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] | ||
97 | ret_sys_call: | ||
98 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 | ||
99 | - sra %o0, 0, %o0 | ||
100 | mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2 | ||
101 | sllx %g2, 32, %g2 | ||
102 | |||
103 | diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c | ||
104 | index 63bdb29b2549..4f7c82cdd0f5 100644 | ||
105 | --- a/arch/x86/kernel/early-quirks.c | ||
106 | +++ b/arch/x86/kernel/early-quirks.c | ||
107 | @@ -202,18 +202,15 @@ static void __init intel_remapping_check(int num, int slot, int func) | ||
108 | revision = read_pci_config_byte(num, slot, func, PCI_REVISION_ID); | ||
109 | |||
110 | /* | ||
111 | - * Revision 13 of all triggering devices id in this quirk have | ||
112 | - * a problem draining interrupts when irq remapping is enabled, | ||
113 | - * and should be flagged as broken. Additionally revisions 0x12 | ||
114 | - * and 0x22 of device id 0x3405 has this problem. | ||
115 | + * Revision <= 13 of all triggering devices id in this quirk | ||
116 | + * have a problem draining interrupts when irq remapping is | ||
117 | + * enabled, and should be flagged as broken. Additionally | ||
118 | + * revision 0x22 of device id 0x3405 has this problem. | ||
119 | */ | ||
120 | - if (revision == 0x13) | ||
121 | + if (revision <= 0x13) | ||
122 | set_irq_remapping_broken(); | ||
123 | - else if ((device == 0x3405) && | ||
124 | - ((revision == 0x12) || | ||
125 | - (revision == 0x22))) | ||
126 | + else if (device == 0x3405 && revision == 0x22) | ||
127 | set_irq_remapping_broken(); | ||
128 | - | ||
129 | } | ||
130 | |||
131 | #define QFLAG_APPLY_ONCE 0x1 | ||
132 | diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c | ||
133 | index a22a7a502740..8156cafad11a 100644 | ||
134 | --- a/drivers/char/ipmi/ipmi_bt_sm.c | ||
135 | +++ b/drivers/char/ipmi/ipmi_bt_sm.c | ||
136 | @@ -352,7 +352,7 @@ static inline void write_all_bytes(struct si_sm_data *bt) | ||
137 | |||
138 | static inline int read_all_bytes(struct si_sm_data *bt) | ||
139 | { | ||
140 | - unsigned char i; | ||
141 | + unsigned int i; | ||
142 | |||
143 | /* | ||
144 | * length is "framing info", minimum = 4: NetFn, Seq, Cmd, cCode. | ||
145 | diff --git a/drivers/staging/comedi/drivers/8255_pci.c b/drivers/staging/comedi/drivers/8255_pci.c | ||
146 | index 05bcf0dffb8c..e54031c558e8 100644 | ||
147 | --- a/drivers/staging/comedi/drivers/8255_pci.c | ||
148 | +++ b/drivers/staging/comedi/drivers/8255_pci.c | ||
149 | @@ -59,6 +59,7 @@ Configuration Options: not applicable, uses PCI auto config | ||
150 | #include "../comedidev.h" | ||
151 | |||
152 | #include "8255.h" | ||
153 | +#include "mite.h" | ||
154 | |||
155 | enum pci_8255_boardid { | ||
156 | BOARD_ADLINK_PCI7224, | ||
157 | @@ -82,6 +83,7 @@ struct pci_8255_boardinfo { | ||
158 | const char *name; | ||
159 | int dio_badr; | ||
160 | int n_8255; | ||
161 | + unsigned int has_mite:1; | ||
162 | }; | ||
163 | |||
164 | static const struct pci_8255_boardinfo pci_8255_boards[] = { | ||
165 | @@ -129,36 +131,43 @@ static const struct pci_8255_boardinfo pci_8255_boards[] = { | ||
166 | .name = "ni_pci-dio-96", | ||
167 | .dio_badr = 1, | ||
168 | .n_8255 = 4, | ||
169 | + .has_mite = 1, | ||
170 | }, | ||
171 | [BOARD_NI_PCIDIO96B] = { | ||
172 | .name = "ni_pci-dio-96b", | ||
173 | .dio_badr = 1, | ||
174 | .n_8255 = 4, | ||
175 | + .has_mite = 1, | ||
176 | }, | ||
177 | [BOARD_NI_PXI6508] = { | ||
178 | .name = "ni_pxi-6508", | ||
179 | .dio_badr = 1, | ||
180 | .n_8255 = 4, | ||
181 | + .has_mite = 1, | ||
182 | }, | ||
183 | [BOARD_NI_PCI6503] = { | ||
184 | .name = "ni_pci-6503", | ||
185 | .dio_badr = 1, | ||
186 | .n_8255 = 1, | ||
187 | + .has_mite = 1, | ||
188 | }, | ||
189 | [BOARD_NI_PCI6503B] = { | ||
190 | .name = "ni_pci-6503b", | ||
191 | .dio_badr = 1, | ||
192 | .n_8255 = 1, | ||
193 | + .has_mite = 1, | ||
194 | }, | ||
195 | [BOARD_NI_PCI6503X] = { | ||
196 | .name = "ni_pci-6503x", | ||
197 | .dio_badr = 1, | ||
198 | .n_8255 = 1, | ||
199 | + .has_mite = 1, | ||
200 | }, | ||
201 | [BOARD_NI_PXI_6503] = { | ||
202 | .name = "ni_pxi-6503", | ||
203 | .dio_badr = 1, | ||
204 | .n_8255 = 1, | ||
205 | + .has_mite = 1, | ||
206 | }, | ||
207 | }; | ||
208 | |||
209 | @@ -166,6 +175,25 @@ struct pci_8255_private { | ||
210 | void __iomem *mmio_base; | ||
211 | }; | ||
212 | |||
213 | +static int pci_8255_mite_init(struct pci_dev *pcidev) | ||
214 | +{ | ||
215 | + void __iomem *mite_base; | ||
216 | + u32 main_phys_addr; | ||
217 | + | ||
218 | + /* ioremap the MITE registers (BAR 0) temporarily */ | ||
219 | + mite_base = pci_ioremap_bar(pcidev, 0); | ||
220 | + if (!mite_base) | ||
221 | + return -ENOMEM; | ||
222 | + | ||
223 | + /* set data window to main registers (BAR 1) */ | ||
224 | + main_phys_addr = pci_resource_start(pcidev, 1); | ||
225 | + writel(main_phys_addr | WENAB, mite_base + MITE_IODWBSR); | ||
226 | + | ||
227 | + /* finished with MITE registers */ | ||
228 | + iounmap(mite_base); | ||
229 | + return 0; | ||
230 | +} | ||
231 | + | ||
232 | static int pci_8255_mmio(int dir, int port, int data, unsigned long iobase) | ||
233 | { | ||
234 | void __iomem *mmio_base = (void __iomem *)iobase; | ||
235 | @@ -205,6 +233,12 @@ static int pci_8255_auto_attach(struct comedi_device *dev, | ||
236 | if (ret) | ||
237 | return ret; | ||
238 | |||
239 | + if (board->has_mite) { | ||
240 | + ret = pci_8255_mite_init(pcidev); | ||
241 | + if (ret) | ||
242 | + return ret; | ||
243 | + } | ||
244 | + | ||
245 | is_mmio = (pci_resource_flags(pcidev, board->dio_badr) & | ||
246 | IORESOURCE_MEM) != 0; | ||
247 | if (is_mmio) { | ||
248 | diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c | ||
249 | index 59d26ef538d8..3723c0ebb316 100644 | ||
250 | --- a/drivers/tty/tty_io.c | ||
251 | +++ b/drivers/tty/tty_io.c | ||
252 | @@ -1267,12 +1267,13 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p) | ||
253 | * | ||
254 | * Locking: None | ||
255 | */ | ||
256 | -static void tty_line_name(struct tty_driver *driver, int index, char *p) | ||
257 | +static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p) | ||
258 | { | ||
259 | if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE) | ||
260 | - strcpy(p, driver->name); | ||
261 | + return sprintf(p, "%s", driver->name); | ||
262 | else | ||
263 | - sprintf(p, "%s%d", driver->name, index + driver->name_base); | ||
264 | + return sprintf(p, "%s%d", driver->name, | ||
265 | + index + driver->name_base); | ||
266 | } | ||
267 | |||
268 | /** | ||
269 | @@ -3538,9 +3539,19 @@ static ssize_t show_cons_active(struct device *dev, | ||
270 | if (i >= ARRAY_SIZE(cs)) | ||
271 | break; | ||
272 | } | ||
273 | - while (i--) | ||
274 | - count += sprintf(buf + count, "%s%d%c", | ||
275 | - cs[i]->name, cs[i]->index, i ? ' ':'\n'); | ||
276 | + while (i--) { | ||
277 | + int index = cs[i]->index; | ||
278 | + struct tty_driver *drv = cs[i]->device(cs[i], &index); | ||
279 | + | ||
280 | + /* don't resolve tty0 as some programs depend on it */ | ||
281 | + if (drv && (cs[i]->index > 0 || drv->major != TTY_MAJOR)) | ||
282 | + count += tty_line_name(drv, index, buf + count); | ||
283 | + else | ||
284 | + count += sprintf(buf + count, "%s%d", | ||
285 | + cs[i]->name, cs[i]->index); | ||
286 | + | ||
287 | + count += sprintf(buf + count, "%c", i ? ' ':'\n'); | ||
288 | + } | ||
289 | console_unlock(); | ||
290 | |||
291 | return count; | ||
292 | diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c | ||
293 | index b8b60b660c8f..4354b9127713 100644 | ||
294 | --- a/fs/btrfs/disk-io.c | ||
295 | +++ b/fs/btrfs/disk-io.c | ||
296 | @@ -3161,6 +3161,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info) | ||
297 | /* send down all the barriers */ | ||
298 | head = &info->fs_devices->devices; | ||
299 | list_for_each_entry_rcu(dev, head, dev_list) { | ||
300 | + if (dev->missing) | ||
301 | + continue; | ||
302 | if (!dev->bdev) { | ||
303 | errors_send++; | ||
304 | continue; | ||
305 | @@ -3175,6 +3177,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info) | ||
306 | |||
307 | /* wait for all the barriers */ | ||
308 | list_for_each_entry_rcu(dev, head, dev_list) { | ||
309 | + if (dev->missing) | ||
310 | + continue; | ||
311 | if (!dev->bdev) { | ||
312 | errors_wait++; | ||
313 | continue; | ||
314 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
315 | index a2b625e279db..84d817b842a8 100644 | ||
316 | --- a/fs/ext4/extents.c | ||
317 | +++ b/fs/ext4/extents.c | ||
318 | @@ -2511,6 +2511,27 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, | ||
319 | ex_ee_block = le32_to_cpu(ex->ee_block); | ||
320 | ex_ee_len = ext4_ext_get_actual_len(ex); | ||
321 | |||
322 | + /* | ||
323 | + * If we're starting with an extent other than the last one in the | ||
324 | + * node, we need to see if it shares a cluster with the extent to | ||
325 | + * the right (towards the end of the file). If its leftmost cluster | ||
326 | + * is this extent's rightmost cluster and it is not cluster aligned, | ||
327 | + * we'll mark it as a partial that is not to be deallocated. | ||
328 | + */ | ||
329 | + | ||
330 | + if (ex != EXT_LAST_EXTENT(eh)) { | ||
331 | + ext4_fsblk_t current_pblk, right_pblk; | ||
332 | + long long current_cluster, right_cluster; | ||
333 | + | ||
334 | + current_pblk = ext4_ext_pblock(ex) + ex_ee_len - 1; | ||
335 | + current_cluster = (long long)EXT4_B2C(sbi, current_pblk); | ||
336 | + right_pblk = ext4_ext_pblock(ex + 1); | ||
337 | + right_cluster = (long long)EXT4_B2C(sbi, right_pblk); | ||
338 | + if (current_cluster == right_cluster && | ||
339 | + EXT4_PBLK_COFF(sbi, right_pblk)) | ||
340 | + *partial_cluster = -right_cluster; | ||
341 | + } | ||
342 | + | ||
343 | trace_ext4_ext_rm_leaf(inode, start, ex, *partial_cluster); | ||
344 | |||
345 | while (ex >= EXT_FIRST_EXTENT(eh) && | ||
346 | @@ -4032,7 +4053,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, | ||
347 | struct ext4_extent newex, *ex, *ex2; | ||
348 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | ||
349 | ext4_fsblk_t newblock = 0; | ||
350 | - int free_on_err = 0, err = 0, depth; | ||
351 | + int free_on_err = 0, err = 0, depth, ret; | ||
352 | unsigned int allocated = 0, offset = 0; | ||
353 | unsigned int allocated_clusters = 0; | ||
354 | struct ext4_allocation_request ar; | ||
355 | @@ -4093,9 +4114,13 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, | ||
356 | if (!ext4_ext_is_uninitialized(ex)) | ||
357 | goto out; | ||
358 | |||
359 | - allocated = ext4_ext_handle_uninitialized_extents( | ||
360 | + ret = ext4_ext_handle_uninitialized_extents( | ||
361 | handle, inode, map, path, flags, | ||
362 | allocated, newblock); | ||
363 | + if (ret < 0) | ||
364 | + err = ret; | ||
365 | + else | ||
366 | + allocated = ret; | ||
367 | goto out3; | ||
368 | } | ||
369 | } | ||
370 | diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c | ||
371 | index e3ab1e4dc442..387213ac2608 100644 | ||
372 | --- a/fs/fs-writeback.c | ||
373 | +++ b/fs/fs-writeback.c | ||
374 | @@ -87,16 +87,29 @@ static inline struct inode *wb_inode(struct list_head *head) | ||
375 | #define CREATE_TRACE_POINTS | ||
376 | #include <trace/events/writeback.h> | ||
377 | |||
378 | +static void bdi_wakeup_thread(struct backing_dev_info *bdi) | ||
379 | +{ | ||
380 | + spin_lock_bh(&bdi->wb_lock); | ||
381 | + if (test_bit(BDI_registered, &bdi->state)) | ||
382 | + mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0); | ||
383 | + spin_unlock_bh(&bdi->wb_lock); | ||
384 | +} | ||
385 | + | ||
386 | static void bdi_queue_work(struct backing_dev_info *bdi, | ||
387 | struct wb_writeback_work *work) | ||
388 | { | ||
389 | trace_writeback_queue(bdi, work); | ||
390 | |||
391 | spin_lock_bh(&bdi->wb_lock); | ||
392 | + if (!test_bit(BDI_registered, &bdi->state)) { | ||
393 | + if (work->done) | ||
394 | + complete(work->done); | ||
395 | + goto out_unlock; | ||
396 | + } | ||
397 | list_add_tail(&work->list, &bdi->work_list); | ||
398 | - spin_unlock_bh(&bdi->wb_lock); | ||
399 | - | ||
400 | mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0); | ||
401 | +out_unlock: | ||
402 | + spin_unlock_bh(&bdi->wb_lock); | ||
403 | } | ||
404 | |||
405 | static void | ||
406 | @@ -112,7 +125,7 @@ __bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages, | ||
407 | work = kzalloc(sizeof(*work), GFP_ATOMIC); | ||
408 | if (!work) { | ||
409 | trace_writeback_nowork(bdi); | ||
410 | - mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0); | ||
411 | + bdi_wakeup_thread(bdi); | ||
412 | return; | ||
413 | } | ||
414 | |||
415 | @@ -159,7 +172,7 @@ void bdi_start_background_writeback(struct backing_dev_info *bdi) | ||
416 | * writeback as soon as there is no other work to do. | ||
417 | */ | ||
418 | trace_writeback_wake_background(bdi); | ||
419 | - mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0); | ||
420 | + bdi_wakeup_thread(bdi); | ||
421 | } | ||
422 | |||
423 | /* | ||
424 | @@ -1016,7 +1029,7 @@ void bdi_writeback_workfn(struct work_struct *work) | ||
425 | current->flags |= PF_SWAPWRITE; | ||
426 | |||
427 | if (likely(!current_is_workqueue_rescuer() || | ||
428 | - list_empty(&bdi->bdi_list))) { | ||
429 | + !test_bit(BDI_registered, &bdi->state))) { | ||
430 | /* | ||
431 | * The normal path. Keep writing back @bdi until its | ||
432 | * work_list is empty. Note that this path is also taken | ||
433 | @@ -1038,10 +1051,10 @@ void bdi_writeback_workfn(struct work_struct *work) | ||
434 | trace_writeback_pages_written(pages_written); | ||
435 | } | ||
436 | |||
437 | - if (!list_empty(&bdi->work_list) || | ||
438 | - (wb_has_dirty_io(wb) && dirty_writeback_interval)) | ||
439 | - queue_delayed_work(bdi_wq, &wb->dwork, | ||
440 | - msecs_to_jiffies(dirty_writeback_interval * 10)); | ||
441 | + if (!list_empty(&bdi->work_list)) | ||
442 | + mod_delayed_work(bdi_wq, &wb->dwork, 0); | ||
443 | + else if (wb_has_dirty_io(wb) && dirty_writeback_interval) | ||
444 | + bdi_wakeup_thread_delayed(bdi); | ||
445 | |||
446 | current->flags &= ~PF_SWAPWRITE; | ||
447 | } | ||
448 | diff --git a/fs/jffs2/compr_rtime.c b/fs/jffs2/compr_rtime.c | ||
449 | index 16a5047903a6..406d9cc84ba8 100644 | ||
450 | --- a/fs/jffs2/compr_rtime.c | ||
451 | +++ b/fs/jffs2/compr_rtime.c | ||
452 | @@ -33,7 +33,7 @@ static int jffs2_rtime_compress(unsigned char *data_in, | ||
453 | unsigned char *cpage_out, | ||
454 | uint32_t *sourcelen, uint32_t *dstlen) | ||
455 | { | ||
456 | - short positions[256]; | ||
457 | + unsigned short positions[256]; | ||
458 | int outpos = 0; | ||
459 | int pos=0; | ||
460 | |||
461 | @@ -74,7 +74,7 @@ static int jffs2_rtime_decompress(unsigned char *data_in, | ||
462 | unsigned char *cpage_out, | ||
463 | uint32_t srclen, uint32_t destlen) | ||
464 | { | ||
465 | - short positions[256]; | ||
466 | + unsigned short positions[256]; | ||
467 | int outpos = 0; | ||
468 | int pos=0; | ||
469 | |||
470 | diff --git a/fs/jffs2/nodelist.h b/fs/jffs2/nodelist.h | ||
471 | index e4619b00f7c5..fa35ff79ab35 100644 | ||
472 | --- a/fs/jffs2/nodelist.h | ||
473 | +++ b/fs/jffs2/nodelist.h | ||
474 | @@ -231,7 +231,7 @@ struct jffs2_tmp_dnode_info | ||
475 | uint32_t version; | ||
476 | uint32_t data_crc; | ||
477 | uint32_t partial_crc; | ||
478 | - uint16_t csize; | ||
479 | + uint32_t csize; | ||
480 | uint16_t overlapped; | ||
481 | }; | ||
482 | |||
483 | diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c | ||
484 | index 03310721712f..b6bd4affd9ad 100644 | ||
485 | --- a/fs/jffs2/nodemgmt.c | ||
486 | +++ b/fs/jffs2/nodemgmt.c | ||
487 | @@ -179,6 +179,7 @@ int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, | ||
488 | spin_unlock(&c->erase_completion_lock); | ||
489 | |||
490 | schedule(); | ||
491 | + remove_wait_queue(&c->erase_wait, &wait); | ||
492 | } else | ||
493 | spin_unlock(&c->erase_completion_lock); | ||
494 | } else if (ret) | ||
495 | @@ -211,20 +212,25 @@ out: | ||
496 | int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, | ||
497 | uint32_t *len, uint32_t sumsize) | ||
498 | { | ||
499 | - int ret = -EAGAIN; | ||
500 | + int ret; | ||
501 | minsize = PAD(minsize); | ||
502 | |||
503 | jffs2_dbg(1, "%s(): Requested 0x%x bytes\n", __func__, minsize); | ||
504 | |||
505 | - spin_lock(&c->erase_completion_lock); | ||
506 | - while(ret == -EAGAIN) { | ||
507 | + while (true) { | ||
508 | + spin_lock(&c->erase_completion_lock); | ||
509 | ret = jffs2_do_reserve_space(c, minsize, len, sumsize); | ||
510 | if (ret) { | ||
511 | jffs2_dbg(1, "%s(): looping, ret is %d\n", | ||
512 | __func__, ret); | ||
513 | } | ||
514 | + spin_unlock(&c->erase_completion_lock); | ||
515 | + | ||
516 | + if (ret == -EAGAIN) | ||
517 | + cond_resched(); | ||
518 | + else | ||
519 | + break; | ||
520 | } | ||
521 | - spin_unlock(&c->erase_completion_lock); | ||
522 | if (!ret) | ||
523 | ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); | ||
524 | |||
525 | diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h | ||
526 | index c3881553f7d1..4cfdbf28fc6a 100644 | ||
527 | --- a/include/linux/backing-dev.h | ||
528 | +++ b/include/linux/backing-dev.h | ||
529 | @@ -95,7 +95,7 @@ struct backing_dev_info { | ||
530 | unsigned int max_ratio, max_prop_frac; | ||
531 | |||
532 | struct bdi_writeback wb; /* default writeback info for this bdi */ | ||
533 | - spinlock_t wb_lock; /* protects work_list */ | ||
534 | + spinlock_t wb_lock; /* protects work_list & wb.dwork scheduling */ | ||
535 | |||
536 | struct list_head work_list; | ||
537 | |||
538 | diff --git a/kernel/exit.c b/kernel/exit.c | ||
539 | index 7bb73f9d09db..6682b2ea5b11 100644 | ||
540 | --- a/kernel/exit.c | ||
541 | +++ b/kernel/exit.c | ||
542 | @@ -570,9 +570,6 @@ static void reparent_leader(struct task_struct *father, struct task_struct *p, | ||
543 | struct list_head *dead) | ||
544 | { | ||
545 | list_move_tail(&p->sibling, &p->real_parent->children); | ||
546 | - | ||
547 | - if (p->exit_state == EXIT_DEAD) | ||
548 | - return; | ||
549 | /* | ||
550 | * If this is a threaded reparent there is no need to | ||
551 | * notify anyone anything has happened. | ||
552 | @@ -580,9 +577,19 @@ static void reparent_leader(struct task_struct *father, struct task_struct *p, | ||
553 | if (same_thread_group(p->real_parent, father)) | ||
554 | return; | ||
555 | |||
556 | - /* We don't want people slaying init. */ | ||
557 | + /* | ||
558 | + * We don't want people slaying init. | ||
559 | + * | ||
560 | + * Note: we do this even if it is EXIT_DEAD, wait_task_zombie() | ||
561 | + * can change ->exit_state to EXIT_ZOMBIE. If this is the final | ||
562 | + * state, do_notify_parent() was already called and ->exit_signal | ||
563 | + * doesn't matter. | ||
564 | + */ | ||
565 | p->exit_signal = SIGCHLD; | ||
566 | |||
567 | + if (p->exit_state == EXIT_DEAD) | ||
568 | + return; | ||
569 | + | ||
570 | /* If it has exited notify the new parent about this child's death. */ | ||
571 | if (!p->ptrace && | ||
572 | p->exit_state == EXIT_ZOMBIE && thread_group_empty(p)) { | ||
573 | @@ -794,6 +801,8 @@ void do_exit(long code) | ||
574 | exit_shm(tsk); | ||
575 | exit_files(tsk); | ||
576 | exit_fs(tsk); | ||
577 | + if (group_dead) | ||
578 | + disassociate_ctty(1); | ||
579 | exit_task_namespaces(tsk); | ||
580 | exit_task_work(tsk); | ||
581 | check_stack_usage(); | ||
582 | @@ -809,13 +818,9 @@ void do_exit(long code) | ||
583 | |||
584 | cgroup_exit(tsk, 1); | ||
585 | |||
586 | - if (group_dead) | ||
587 | - disassociate_ctty(1); | ||
588 | - | ||
589 | module_put(task_thread_info(tsk)->exec_domain->module); | ||
590 | |||
591 | proc_exit_connector(tsk); | ||
592 | - | ||
593 | /* | ||
594 | * FIXME: do that only when needed, using sched_exit tracepoint | ||
595 | */ | ||
596 | diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c | ||
597 | index 6917e8edb48e..e32703d5e0ab 100644 | ||
598 | --- a/kernel/pid_namespace.c | ||
599 | +++ b/kernel/pid_namespace.c | ||
600 | @@ -312,7 +312,9 @@ static void *pidns_get(struct task_struct *task) | ||
601 | struct pid_namespace *ns; | ||
602 | |||
603 | rcu_read_lock(); | ||
604 | - ns = get_pid_ns(task_active_pid_ns(task)); | ||
605 | + ns = task_active_pid_ns(task); | ||
606 | + if (ns) | ||
607 | + get_pid_ns(ns); | ||
608 | rcu_read_unlock(); | ||
609 | |||
610 | return ns; | ||
611 | diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c | ||
612 | index 9064b919a406..9bea1d7dd21f 100644 | ||
613 | --- a/kernel/user_namespace.c | ||
614 | +++ b/kernel/user_namespace.c | ||
615 | @@ -148,7 +148,7 @@ static u32 map_id_range_down(struct uid_gid_map *map, u32 id, u32 count) | ||
616 | |||
617 | /* Find the matching extent */ | ||
618 | extents = map->nr_extents; | ||
619 | - smp_read_barrier_depends(); | ||
620 | + smp_rmb(); | ||
621 | for (idx = 0; idx < extents; idx++) { | ||
622 | first = map->extent[idx].first; | ||
623 | last = first + map->extent[idx].count - 1; | ||
624 | @@ -172,7 +172,7 @@ static u32 map_id_down(struct uid_gid_map *map, u32 id) | ||
625 | |||
626 | /* Find the matching extent */ | ||
627 | extents = map->nr_extents; | ||
628 | - smp_read_barrier_depends(); | ||
629 | + smp_rmb(); | ||
630 | for (idx = 0; idx < extents; idx++) { | ||
631 | first = map->extent[idx].first; | ||
632 | last = first + map->extent[idx].count - 1; | ||
633 | @@ -195,7 +195,7 @@ static u32 map_id_up(struct uid_gid_map *map, u32 id) | ||
634 | |||
635 | /* Find the matching extent */ | ||
636 | extents = map->nr_extents; | ||
637 | - smp_read_barrier_depends(); | ||
638 | + smp_rmb(); | ||
639 | for (idx = 0; idx < extents; idx++) { | ||
640 | first = map->extent[idx].lower_first; | ||
641 | last = first + map->extent[idx].count - 1; | ||
642 | @@ -611,9 +611,8 @@ static ssize_t map_write(struct file *file, const char __user *buf, | ||
643 | * were written before the count of the extents. | ||
644 | * | ||
645 | * To achieve this smp_wmb() is used on guarantee the write | ||
646 | - * order and smp_read_barrier_depends() is guaranteed that we | ||
647 | - * don't have crazy architectures returning stale data. | ||
648 | - * | ||
649 | + * order and smp_rmb() is guaranteed that we don't have crazy | ||
650 | + * architectures returning stale data. | ||
651 | */ | ||
652 | mutex_lock(&id_map_mutex); | ||
653 | |||
654 | diff --git a/mm/backing-dev.c b/mm/backing-dev.c | ||
655 | index 502517492258..eea1a9dfac38 100644 | ||
656 | --- a/mm/backing-dev.c | ||
657 | +++ b/mm/backing-dev.c | ||
658 | @@ -287,13 +287,19 @@ int bdi_has_dirty_io(struct backing_dev_info *bdi) | ||
659 | * Note, we wouldn't bother setting up the timer, but this function is on the | ||
660 | * fast-path (used by '__mark_inode_dirty()'), so we save few context switches | ||
661 | * by delaying the wake-up. | ||
662 | + * | ||
663 | + * We have to be careful not to postpone flush work if it is scheduled for | ||
664 | + * earlier. Thus we use queue_delayed_work(). | ||
665 | */ | ||
666 | void bdi_wakeup_thread_delayed(struct backing_dev_info *bdi) | ||
667 | { | ||
668 | unsigned long timeout; | ||
669 | |||
670 | timeout = msecs_to_jiffies(dirty_writeback_interval * 10); | ||
671 | - mod_delayed_work(bdi_wq, &bdi->wb.dwork, timeout); | ||
672 | + spin_lock_bh(&bdi->wb_lock); | ||
673 | + if (test_bit(BDI_registered, &bdi->state)) | ||
674 | + queue_delayed_work(bdi_wq, &bdi->wb.dwork, timeout); | ||
675 | + spin_unlock_bh(&bdi->wb_lock); | ||
676 | } | ||
677 | |||
678 | /* | ||
679 | @@ -306,9 +312,6 @@ static void bdi_remove_from_list(struct backing_dev_info *bdi) | ||
680 | spin_unlock_bh(&bdi_lock); | ||
681 | |||
682 | synchronize_rcu_expedited(); | ||
683 | - | ||
684 | - /* bdi_list is now unused, clear it to mark @bdi dying */ | ||
685 | - INIT_LIST_HEAD(&bdi->bdi_list); | ||
686 | } | ||
687 | |||
688 | int bdi_register(struct backing_dev_info *bdi, struct device *parent, | ||
689 | @@ -359,6 +362,11 @@ static void bdi_wb_shutdown(struct backing_dev_info *bdi) | ||
690 | */ | ||
691 | bdi_remove_from_list(bdi); | ||
692 | |||
693 | + /* Make sure nobody queues further work */ | ||
694 | + spin_lock_bh(&bdi->wb_lock); | ||
695 | + clear_bit(BDI_registered, &bdi->state); | ||
696 | + spin_unlock_bh(&bdi->wb_lock); | ||
697 | + | ||
698 | /* | ||
699 | * Drain work list and shutdown the delayed_work. At this point, | ||
700 | * @bdi->bdi_list is empty telling bdi_Writeback_workfn() that @bdi | ||
701 | diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c | ||
702 | index dcaa6dbbab2c..cfca44f8d048 100644 | ||
703 | --- a/net/bluetooth/hci_event.c | ||
704 | +++ b/net/bluetooth/hci_event.c | ||
705 | @@ -3619,7 +3619,13 @@ static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
706 | |||
707 | hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp); | ||
708 | |||
709 | - if (ltk->type & HCI_SMP_STK) { | ||
710 | + /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a | ||
711 | + * temporary key used to encrypt a connection following | ||
712 | + * pairing. It is used during the Encrypted Session Setup to | ||
713 | + * distribute the keys. Later, security can be re-established | ||
714 | + * using a distributed LTK. | ||
715 | + */ | ||
716 | + if (ltk->type == HCI_SMP_STK_SLAVE) { | ||
717 | list_del(<k->list); | ||
718 | kfree(ltk); | ||
719 | } |