Contents of /trunk/kernel26-alx/patches-3.10/0137-3.10.38-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(show 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 | 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 | } |