Magellan Linux

Contents of /trunk/kernel-lts/patches-3.4/0160-3.4.61-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2280 - (show annotations) (download)
Tue Sep 10 10:50:05 2013 UTC (10 years, 7 months ago) by niro
File size: 14218 byte(s)
-linux-3.4.61
1 diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
2 index feab3ba..b17dd69 100644
3 --- a/arch/powerpc/Kconfig
4 +++ b/arch/powerpc/Kconfig
5 @@ -979,6 +979,7 @@ config RELOCATABLE
6 must live at a different physical address than the primary
7 kernel.
8
9 +# This value must have zeroes in the bottom 60 bits otherwise lots will break
10 config PAGE_OFFSET
11 hex
12 default "0xc000000000000000"
13 diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
14 index f072e97..2e6c4e5a 100644
15 --- a/arch/powerpc/include/asm/page.h
16 +++ b/arch/powerpc/include/asm/page.h
17 @@ -211,9 +211,19 @@ extern long long virt_phys_offset;
18 #define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET))
19 #define __pa(x) ((unsigned long)(x) - VIRT_PHYS_OFFSET)
20 #else
21 +#ifdef CONFIG_PPC64
22 +/*
23 + * gcc miscompiles (unsigned long)(&static_var) - PAGE_OFFSET
24 + * with -mcmodel=medium, so we use & and | instead of - and + on 64-bit.
25 + */
26 +#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET))
27 +#define __pa(x) ((unsigned long)(x) & 0x0fffffffffffffffUL)
28 +
29 +#else /* 32-bit, non book E */
30 #define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))
31 #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)
32 #endif
33 +#endif
34
35 /*
36 * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
37 diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
38 index 3251d4b..d1a9674 100644
39 --- a/drivers/acpi/ec.c
40 +++ b/drivers/acpi/ec.c
41 @@ -978,6 +978,10 @@ static struct dmi_system_id __initdata ec_dmi_table[] = {
42 ec_skip_dsdt_scan, "HP Folio 13", {
43 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
44 DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13"),}, NULL},
45 + {
46 + ec_validate_ecdt, "ASUS hardware", {
47 + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer Inc."),
48 + DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),}, NULL},
49 {},
50 };
51
52 diff --git a/drivers/base/memory.c b/drivers/base/memory.c
53 index 7dda4f7..d63a06b 100644
54 --- a/drivers/base/memory.c
55 +++ b/drivers/base/memory.c
56 @@ -154,6 +154,8 @@ static ssize_t show_mem_removable(struct device *dev,
57 container_of(dev, struct memory_block, dev);
58
59 for (i = 0; i < sections_per_block; i++) {
60 + if (!present_section_nr(mem->start_section_nr + i))
61 + continue;
62 pfn = section_nr_to_pfn(mem->start_section_nr + i);
63 ret &= is_mem_section_removable(pfn, PAGES_PER_SECTION);
64 }
65 diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
66 index bb80853..ca72d1f 100644
67 --- a/drivers/base/regmap/regmap.c
68 +++ b/drivers/base/regmap/regmap.c
69 @@ -69,7 +69,7 @@ bool regmap_precious(struct regmap *map, unsigned int reg)
70 }
71
72 static bool regmap_volatile_range(struct regmap *map, unsigned int reg,
73 - unsigned int num)
74 + size_t num)
75 {
76 unsigned int i;
77
78 diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
79 index d031932..6884d01 100644
80 --- a/drivers/gpu/drm/i915/i915_reg.h
81 +++ b/drivers/gpu/drm/i915/i915_reg.h
82 @@ -3741,7 +3741,7 @@
83 #define EDP_LINK_TRAIN_600MV_0DB_IVB (0x30 <<22)
84 #define EDP_LINK_TRAIN_600MV_3_5DB_IVB (0x36 <<22)
85 #define EDP_LINK_TRAIN_800MV_0DB_IVB (0x38 <<22)
86 -#define EDP_LINK_TRAIN_800MV_3_5DB_IVB (0x33 <<22)
87 +#define EDP_LINK_TRAIN_800MV_3_5DB_IVB (0x3e <<22)
88
89 /* legacy values */
90 #define EDP_LINK_TRAIN_500MV_0DB_IVB (0x00 <<22)
91 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
92 index 21ee782..e1978a2 100644
93 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
94 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
95 @@ -29,7 +29,9 @@
96 #include "drmP.h"
97 #include "ttm/ttm_bo_driver.h"
98
99 -#define VMW_PPN_SIZE sizeof(unsigned long)
100 +#define VMW_PPN_SIZE (sizeof(unsigned long))
101 +/* A future safe maximum remap size. */
102 +#define VMW_PPN_PER_REMAP ((31 * 1024) / VMW_PPN_SIZE)
103
104 static int vmw_gmr2_bind(struct vmw_private *dev_priv,
105 struct page *pages[],
106 @@ -38,43 +40,61 @@ static int vmw_gmr2_bind(struct vmw_private *dev_priv,
107 {
108 SVGAFifoCmdDefineGMR2 define_cmd;
109 SVGAFifoCmdRemapGMR2 remap_cmd;
110 - uint32_t define_size = sizeof(define_cmd) + 4;
111 - uint32_t remap_size = VMW_PPN_SIZE * num_pages + sizeof(remap_cmd) + 4;
112 uint32_t *cmd;
113 uint32_t *cmd_orig;
114 + uint32_t define_size = sizeof(define_cmd) + sizeof(*cmd);
115 + uint32_t remap_num = num_pages / VMW_PPN_PER_REMAP + ((num_pages % VMW_PPN_PER_REMAP) > 0);
116 + uint32_t remap_size = VMW_PPN_SIZE * num_pages + (sizeof(remap_cmd) + sizeof(*cmd)) * remap_num;
117 + uint32_t remap_pos = 0;
118 + uint32_t cmd_size = define_size + remap_size;
119 uint32_t i;
120
121 - cmd_orig = cmd = vmw_fifo_reserve(dev_priv, define_size + remap_size);
122 + cmd_orig = cmd = vmw_fifo_reserve(dev_priv, cmd_size);
123 if (unlikely(cmd == NULL))
124 return -ENOMEM;
125
126 define_cmd.gmrId = gmr_id;
127 define_cmd.numPages = num_pages;
128
129 + *cmd++ = SVGA_CMD_DEFINE_GMR2;
130 + memcpy(cmd, &define_cmd, sizeof(define_cmd));
131 + cmd += sizeof(define_cmd) / sizeof(*cmd);
132 +
133 + /*
134 + * Need to split the command if there are too many
135 + * pages that goes into the gmr.
136 + */
137 +
138 remap_cmd.gmrId = gmr_id;
139 remap_cmd.flags = (VMW_PPN_SIZE > sizeof(*cmd)) ?
140 SVGA_REMAP_GMR2_PPN64 : SVGA_REMAP_GMR2_PPN32;
141 - remap_cmd.offsetPages = 0;
142 - remap_cmd.numPages = num_pages;
143
144 - *cmd++ = SVGA_CMD_DEFINE_GMR2;
145 - memcpy(cmd, &define_cmd, sizeof(define_cmd));
146 - cmd += sizeof(define_cmd) / sizeof(uint32);
147 + while (num_pages > 0) {
148 + unsigned long nr = min(num_pages, (unsigned long)VMW_PPN_PER_REMAP);
149 +
150 + remap_cmd.offsetPages = remap_pos;
151 + remap_cmd.numPages = nr;
152
153 - *cmd++ = SVGA_CMD_REMAP_GMR2;
154 - memcpy(cmd, &remap_cmd, sizeof(remap_cmd));
155 - cmd += sizeof(remap_cmd) / sizeof(uint32);
156 + *cmd++ = SVGA_CMD_REMAP_GMR2;
157 + memcpy(cmd, &remap_cmd, sizeof(remap_cmd));
158 + cmd += sizeof(remap_cmd) / sizeof(*cmd);
159
160 - for (i = 0; i < num_pages; ++i) {
161 - if (VMW_PPN_SIZE <= 4)
162 - *cmd = page_to_pfn(*pages++);
163 - else
164 - *((uint64_t *)cmd) = page_to_pfn(*pages++);
165 + for (i = 0; i < nr; ++i) {
166 + if (VMW_PPN_SIZE <= 4)
167 + *cmd = page_to_pfn(*pages++);
168 + else
169 + *((uint64_t *)cmd) = page_to_pfn(*pages++);
170
171 - cmd += VMW_PPN_SIZE / sizeof(*cmd);
172 + cmd += VMW_PPN_SIZE / sizeof(*cmd);
173 + }
174 +
175 + num_pages -= nr;
176 + remap_pos += nr;
177 }
178
179 - vmw_fifo_commit(dev_priv, define_size + remap_size);
180 + BUG_ON(cmd != cmd_orig + cmd_size / sizeof(*cmd));
181 +
182 + vmw_fifo_commit(dev_priv, cmd_size);
183
184 return 0;
185 }
186 diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
187 index 3e40a64..b290a8e 100644
188 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
189 +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
190 @@ -448,6 +448,7 @@ static void ath9k_htc_tx_process(struct ath9k_htc_priv *priv,
191 struct ieee80211_conf *cur_conf = &priv->hw->conf;
192 bool txok;
193 int slot;
194 + int hdrlen, padsize;
195
196 slot = strip_drv_header(priv, skb);
197 if (slot < 0) {
198 @@ -504,6 +505,15 @@ send_mac80211:
199
200 ath9k_htc_tx_clear_slot(priv, slot);
201
202 + /* Remove padding before handing frame back to mac80211 */
203 + hdrlen = ieee80211_get_hdrlen_from_skb(skb);
204 +
205 + padsize = hdrlen & 3;
206 + if (padsize && skb->len > hdrlen + padsize) {
207 + memmove(skb->data + padsize, skb->data, hdrlen);
208 + skb_pull(skb, padsize);
209 + }
210 +
211 /* Send status to mac80211 */
212 ieee80211_tx_status(priv->hw, skb);
213 }
214 diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
215 index 409ed06..3223daa 100644
216 --- a/drivers/net/wireless/iwlegacy/4965-mac.c
217 +++ b/drivers/net/wireless/iwlegacy/4965-mac.c
218 @@ -4415,9 +4415,9 @@ il4965_irq_tasklet(struct il_priv *il)
219 set_bit(S_RFKILL, &il->status);
220 } else {
221 clear_bit(S_RFKILL, &il->status);
222 - wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
223 il_force_reset(il, true);
224 }
225 + wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
226
227 handled |= CSR_INT_BIT_RF_KILL;
228 }
229 diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c
230 index 52a5f62..2d88ce8 100644
231 --- a/drivers/target/target_core_cdb.c
232 +++ b/drivers/target/target_core_cdb.c
233 @@ -97,9 +97,12 @@ target_emulate_inquiry_std(struct se_cmd *cmd, char *buf)
234
235 buf[7] = 0x2; /* CmdQue=1 */
236
237 - snprintf(&buf[8], 8, "LIO-ORG");
238 - snprintf(&buf[16], 16, "%s", dev->se_sub_dev->t10_wwn.model);
239 - snprintf(&buf[32], 4, "%s", dev->se_sub_dev->t10_wwn.revision);
240 + memcpy(&buf[8], "LIO-ORG ", 8);
241 + memset(&buf[16], 0x20, 16);
242 + memcpy(&buf[16], dev->se_sub_dev->t10_wwn.model,
243 + min_t(size_t, strlen(dev->se_sub_dev->t10_wwn.model), 16));
244 + memcpy(&buf[32], dev->se_sub_dev->t10_wwn.revision,
245 + min_t(size_t, strlen(dev->se_sub_dev->t10_wwn.revision), 4));
246 buf[4] = 31; /* Set additional length to 31 */
247
248 return 0;
249 diff --git a/drivers/tty/hvc/hvsi_lib.c b/drivers/tty/hvc/hvsi_lib.c
250 index 6f4dd83..3749688 100644
251 --- a/drivers/tty/hvc/hvsi_lib.c
252 +++ b/drivers/tty/hvc/hvsi_lib.c
253 @@ -341,8 +341,8 @@ void hvsilib_establish(struct hvsi_priv *pv)
254
255 pr_devel("HVSI@%x: ... waiting handshake\n", pv->termno);
256
257 - /* Try for up to 200s */
258 - for (timeout = 0; timeout < 20; timeout++) {
259 + /* Try for up to 400ms */
260 + for (timeout = 0; timeout < 40; timeout++) {
261 if (pv->established)
262 goto established;
263 if (!hvsi_get_packet(pv))
264 diff --git a/fs/bio.c b/fs/bio.c
265 index 84da885..c0e5a4e 100644
266 --- a/fs/bio.c
267 +++ b/fs/bio.c
268 @@ -787,12 +787,22 @@ static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs,
269 int bio_uncopy_user(struct bio *bio)
270 {
271 struct bio_map_data *bmd = bio->bi_private;
272 - int ret = 0;
273 + struct bio_vec *bvec;
274 + int ret = 0, i;
275
276 - if (!bio_flagged(bio, BIO_NULL_MAPPED))
277 - ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs,
278 - bmd->nr_sgvecs, bio_data_dir(bio) == READ,
279 - 0, bmd->is_our_pages);
280 + if (!bio_flagged(bio, BIO_NULL_MAPPED)) {
281 + /*
282 + * if we're in a workqueue, the request is orphaned, so
283 + * don't copy into a random user address space, just free.
284 + */
285 + if (current->mm)
286 + ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs,
287 + bmd->nr_sgvecs, bio_data_dir(bio) == READ,
288 + 0, bmd->is_our_pages);
289 + else if (bmd->is_our_pages)
290 + __bio_for_each_segment(bvec, bio, i, 0)
291 + __free_page(bvec->bv_page);
292 + }
293 bio_free_map_data(bmd);
294 bio_put(bio);
295 return ret;
296 diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c
297 index 9197a1b..b6f17c0 100644
298 --- a/fs/jfs/jfs_dtree.c
299 +++ b/fs/jfs/jfs_dtree.c
300 @@ -3047,6 +3047,14 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
301
302 dir_index = (u32) filp->f_pos;
303
304 + /*
305 + * NFSv4 reserves cookies 1 and 2 for . and .. so we add
306 + * the value we return to the vfs is one greater than the
307 + * one we use internally.
308 + */
309 + if (dir_index)
310 + dir_index--;
311 +
312 if (dir_index > 1) {
313 struct dir_table_slot dirtab_slot;
314
315 @@ -3086,7 +3094,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
316 if (p->header.flag & BT_INTERNAL) {
317 jfs_err("jfs_readdir: bad index table");
318 DT_PUTPAGE(mp);
319 - filp->f_pos = -1;
320 + filp->f_pos = DIREND;
321 return 0;
322 }
323 } else {
324 @@ -3094,7 +3102,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
325 /*
326 * self "."
327 */
328 - filp->f_pos = 0;
329 + filp->f_pos = 1;
330 if (filldir(dirent, ".", 1, 0, ip->i_ino,
331 DT_DIR))
332 return 0;
333 @@ -3102,7 +3110,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
334 /*
335 * parent ".."
336 */
337 - filp->f_pos = 1;
338 + filp->f_pos = 2;
339 if (filldir(dirent, "..", 2, 1, PARENT(ip), DT_DIR))
340 return 0;
341
342 @@ -3123,24 +3131,25 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
343 /*
344 * Legacy filesystem - OS/2 & Linux JFS < 0.3.6
345 *
346 - * pn = index = 0: First entry "."
347 - * pn = 0; index = 1: Second entry ".."
348 + * pn = 0; index = 1: First entry "."
349 + * pn = 0; index = 2: Second entry ".."
350 * pn > 0: Real entries, pn=1 -> leftmost page
351 * pn = index = -1: No more entries
352 */
353 dtpos = filp->f_pos;
354 - if (dtpos == 0) {
355 + if (dtpos < 2) {
356 /* build "." entry */
357
358 + filp->f_pos = 1;
359 if (filldir(dirent, ".", 1, filp->f_pos, ip->i_ino,
360 DT_DIR))
361 return 0;
362 - dtoffset->index = 1;
363 + dtoffset->index = 2;
364 filp->f_pos = dtpos;
365 }
366
367 if (dtoffset->pn == 0) {
368 - if (dtoffset->index == 1) {
369 + if (dtoffset->index == 2) {
370 /* build ".." entry */
371
372 if (filldir(dirent, "..", 2, filp->f_pos,
373 @@ -3233,6 +3242,12 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
374 }
375 jfs_dirent->position = unique_pos++;
376 }
377 + /*
378 + * We add 1 to the index because we may
379 + * use a value of 2 internally, and NFSv4
380 + * doesn't like that.
381 + */
382 + jfs_dirent->position++;
383 } else {
384 jfs_dirent->position = dtpos;
385 len = min(d_namleft, DTLHDRDATALEN_LEGACY);
386 diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c
387 index b97a3dd..6997cdd 100644
388 --- a/net/sunrpc/xdr.c
389 +++ b/net/sunrpc/xdr.c
390 @@ -233,10 +233,13 @@ _shift_data_right_pages(struct page **pages, size_t pgto_base,
391 pgfrom_base -= copy;
392
393 vto = kmap_atomic(*pgto);
394 - vfrom = kmap_atomic(*pgfrom);
395 - memmove(vto + pgto_base, vfrom + pgfrom_base, copy);
396 + if (*pgto != *pgfrom) {
397 + vfrom = kmap_atomic(*pgfrom);
398 + memcpy(vto + pgto_base, vfrom + pgfrom_base, copy);
399 + kunmap_atomic(vfrom);
400 + } else
401 + memmove(vto + pgto_base, vto + pgfrom_base, copy);
402 flush_dcache_page(*pgto);
403 - kunmap_atomic(vfrom);
404 kunmap_atomic(vto);
405
406 } while ((len -= copy) != 0);
407 diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
408 index d7ccf28..4589acd 100644
409 --- a/sound/isa/opti9xx/opti92x-ad1848.c
410 +++ b/sound/isa/opti9xx/opti92x-ad1848.c
411 @@ -173,11 +173,7 @@ MODULE_DEVICE_TABLE(pnp_card, snd_opti9xx_pnpids);
412
413 #endif /* CONFIG_PNP */
414
415 -#ifdef OPTi93X
416 -#define DEV_NAME "opti93x"
417 -#else
418 -#define DEV_NAME "opti92x"
419 -#endif
420 +#define DEV_NAME KBUILD_MODNAME
421
422 static char * snd_opti9xx_names[] = {
423 "unknown",
424 @@ -1126,7 +1122,7 @@ static void __devexit snd_opti9xx_pnp_remove(struct pnp_card_link * pcard)
425
426 static struct pnp_card_driver opti9xx_pnpc_driver = {
427 .flags = PNP_DRIVER_RES_DISABLE,
428 - .name = "opti9xx",
429 + .name = DEV_NAME,
430 .id_table = snd_opti9xx_pnpids,
431 .probe = snd_opti9xx_pnp_probe,
432 .remove = __devexit_p(snd_opti9xx_pnp_remove),