Annotation of /trunk/kernel-magellan/patches-3.2/0111-3.2.12-all-fixes.patch
Parent Directory | Revision Log
Revision 1706 -
(hide annotations)
(download)
Thu Mar 22 12:46:31 2012 UTC (12 years, 6 months ago) by niro
File size: 52103 byte(s)
Thu Mar 22 12:46:31 2012 UTC (12 years, 6 months ago) by niro
File size: 52103 byte(s)
-linux-3.2.12
1 | niro | 1706 | diff --git a/Documentation/hwmon/w83627ehf b/Documentation/hwmon/w83627ehf |
2 | index 3f44dbd..75f3155 100644 | ||
3 | --- a/Documentation/hwmon/w83627ehf | ||
4 | +++ b/Documentation/hwmon/w83627ehf | ||
5 | @@ -50,7 +50,7 @@ W83627DHG, W83627DHG-P, W83627UHG, W83667HG, W83667HG-B, W83667HG-I | ||
6 | (NCT6775F), and NCT6776F super I/O chips. We will refer to them collectively | ||
7 | as Winbond chips. | ||
8 | |||
9 | -The chips implement 2 to 4 temperature sensors (9 for NCT6775F and NCT6776F), | ||
10 | +The chips implement 3 to 4 temperature sensors (9 for NCT6775F and NCT6776F), | ||
11 | 2 to 5 fan rotation speed sensors, 8 to 10 analog voltage sensors, one VID | ||
12 | (except for 627UHG), alarms with beep warnings (control unimplemented), | ||
13 | and some automatic fan regulation strategies (plus manual fan control mode). | ||
14 | diff --git a/Documentation/hwmon/zl6100 b/Documentation/hwmon/zl6100 | ||
15 | index 7617798..c5e1a5b 100644 | ||
16 | --- a/Documentation/hwmon/zl6100 | ||
17 | +++ b/Documentation/hwmon/zl6100 | ||
18 | @@ -73,14 +73,12 @@ Module parameters | ||
19 | delay | ||
20 | ----- | ||
21 | |||
22 | -Some Intersil/Zilker Labs DC-DC controllers require a minimum interval between | ||
23 | -I2C bus accesses. According to Intersil, the minimum interval is 2 ms, though | ||
24 | -1 ms appears to be sufficient and has not caused any problems in testing. | ||
25 | -The problem is known to affect ZL6100, ZL2105, and ZL2008. It is known not to | ||
26 | -affect ZL2004 and ZL6105. The driver automatically sets the interval to 1 ms | ||
27 | -except for ZL2004 and ZL6105. To enable manual override, the driver provides a | ||
28 | -writeable module parameter, 'delay', which can be used to set the interval to | ||
29 | -a value between 0 and 65,535 microseconds. | ||
30 | +Intersil/Zilker Labs DC-DC controllers require a minimum interval between I2C | ||
31 | +bus accesses. According to Intersil, the minimum interval is 2 ms, though 1 ms | ||
32 | +appears to be sufficient and has not caused any problems in testing. The problem | ||
33 | +is known to affect all currently supported chips. For manual override, the | ||
34 | +driver provides a writeable module parameter, 'delay', which can be used to set | ||
35 | +the interval to a value between 0 and 65,535 microseconds. | ||
36 | |||
37 | |||
38 | Sysfs entries | ||
39 | diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile | ||
40 | index ad1fb5d..eddcfb3 100644 | ||
41 | --- a/arch/sparc/Makefile | ||
42 | +++ b/arch/sparc/Makefile | ||
43 | @@ -31,7 +31,7 @@ UTS_MACHINE := sparc | ||
44 | |||
45 | #KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7 | ||
46 | KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7 | ||
47 | -KBUILD_AFLAGS += -m32 | ||
48 | +KBUILD_AFLAGS += -m32 -Wa,-Av8 | ||
49 | |||
50 | #LDFLAGS_vmlinux = -N -Ttext 0xf0004000 | ||
51 | # Since 2.5.40, the first stage is left not btfix-ed. | ||
52 | diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c | ||
53 | index 121f1be..957c216 100644 | ||
54 | --- a/arch/x86/kernel/cpu/perf_event_intel.c | ||
55 | +++ b/arch/x86/kernel/cpu/perf_event_intel.c | ||
56 | @@ -389,14 +389,15 @@ static __initconst const u64 westmere_hw_cache_event_ids | ||
57 | #define NHM_LOCAL_DRAM (1 << 14) | ||
58 | #define NHM_NON_DRAM (1 << 15) | ||
59 | |||
60 | -#define NHM_ALL_DRAM (NHM_REMOTE_DRAM|NHM_LOCAL_DRAM) | ||
61 | +#define NHM_LOCAL (NHM_LOCAL_DRAM|NHM_REMOTE_CACHE_FWD) | ||
62 | +#define NHM_REMOTE (NHM_REMOTE_DRAM) | ||
63 | |||
64 | #define NHM_DMND_READ (NHM_DMND_DATA_RD) | ||
65 | #define NHM_DMND_WRITE (NHM_DMND_RFO|NHM_DMND_WB) | ||
66 | #define NHM_DMND_PREFETCH (NHM_PF_DATA_RD|NHM_PF_DATA_RFO) | ||
67 | |||
68 | #define NHM_L3_HIT (NHM_UNCORE_HIT|NHM_OTHER_CORE_HIT_SNP|NHM_OTHER_CORE_HITM) | ||
69 | -#define NHM_L3_MISS (NHM_NON_DRAM|NHM_ALL_DRAM|NHM_REMOTE_CACHE_FWD) | ||
70 | +#define NHM_L3_MISS (NHM_NON_DRAM|NHM_LOCAL_DRAM|NHM_REMOTE_DRAM|NHM_REMOTE_CACHE_FWD) | ||
71 | #define NHM_L3_ACCESS (NHM_L3_HIT|NHM_L3_MISS) | ||
72 | |||
73 | static __initconst const u64 nehalem_hw_cache_extra_regs | ||
74 | @@ -420,16 +421,16 @@ static __initconst const u64 nehalem_hw_cache_extra_regs | ||
75 | }, | ||
76 | [ C(NODE) ] = { | ||
77 | [ C(OP_READ) ] = { | ||
78 | - [ C(RESULT_ACCESS) ] = NHM_DMND_READ|NHM_ALL_DRAM, | ||
79 | - [ C(RESULT_MISS) ] = NHM_DMND_READ|NHM_REMOTE_DRAM, | ||
80 | + [ C(RESULT_ACCESS) ] = NHM_DMND_READ|NHM_LOCAL|NHM_REMOTE, | ||
81 | + [ C(RESULT_MISS) ] = NHM_DMND_READ|NHM_REMOTE, | ||
82 | }, | ||
83 | [ C(OP_WRITE) ] = { | ||
84 | - [ C(RESULT_ACCESS) ] = NHM_DMND_WRITE|NHM_ALL_DRAM, | ||
85 | - [ C(RESULT_MISS) ] = NHM_DMND_WRITE|NHM_REMOTE_DRAM, | ||
86 | + [ C(RESULT_ACCESS) ] = NHM_DMND_WRITE|NHM_LOCAL|NHM_REMOTE, | ||
87 | + [ C(RESULT_MISS) ] = NHM_DMND_WRITE|NHM_REMOTE, | ||
88 | }, | ||
89 | [ C(OP_PREFETCH) ] = { | ||
90 | - [ C(RESULT_ACCESS) ] = NHM_DMND_PREFETCH|NHM_ALL_DRAM, | ||
91 | - [ C(RESULT_MISS) ] = NHM_DMND_PREFETCH|NHM_REMOTE_DRAM, | ||
92 | + [ C(RESULT_ACCESS) ] = NHM_DMND_PREFETCH|NHM_LOCAL|NHM_REMOTE, | ||
93 | + [ C(RESULT_MISS) ] = NHM_DMND_PREFETCH|NHM_REMOTE, | ||
94 | }, | ||
95 | }, | ||
96 | }; | ||
97 | diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c | ||
98 | index fc45ba8..e395693 100644 | ||
99 | --- a/arch/x86/lib/delay.c | ||
100 | +++ b/arch/x86/lib/delay.c | ||
101 | @@ -48,9 +48,9 @@ static void delay_loop(unsigned long loops) | ||
102 | } | ||
103 | |||
104 | /* TSC based delay: */ | ||
105 | -static void delay_tsc(unsigned long loops) | ||
106 | +static void delay_tsc(unsigned long __loops) | ||
107 | { | ||
108 | - unsigned long bclock, now; | ||
109 | + u32 bclock, now, loops = __loops; | ||
110 | int cpu; | ||
111 | |||
112 | preempt_disable(); | ||
113 | diff --git a/block/genhd.c b/block/genhd.c | ||
114 | index 02e9fca..997afd6 100644 | ||
115 | --- a/block/genhd.c | ||
116 | +++ b/block/genhd.c | ||
117 | @@ -36,6 +36,7 @@ static DEFINE_IDR(ext_devt_idr); | ||
118 | |||
119 | static struct device_type disk_type; | ||
120 | |||
121 | +static void disk_alloc_events(struct gendisk *disk); | ||
122 | static void disk_add_events(struct gendisk *disk); | ||
123 | static void disk_del_events(struct gendisk *disk); | ||
124 | static void disk_release_events(struct gendisk *disk); | ||
125 | @@ -602,6 +603,8 @@ void add_disk(struct gendisk *disk) | ||
126 | disk->major = MAJOR(devt); | ||
127 | disk->first_minor = MINOR(devt); | ||
128 | |||
129 | + disk_alloc_events(disk); | ||
130 | + | ||
131 | /* Register BDI before referencing it from bdev */ | ||
132 | bdi = &disk->queue->backing_dev_info; | ||
133 | bdi_register_dev(bdi, disk_devt(disk)); | ||
134 | @@ -1476,9 +1479,9 @@ static void __disk_unblock_events(struct gendisk *disk, bool check_now) | ||
135 | intv = disk_events_poll_jiffies(disk); | ||
136 | set_timer_slack(&ev->dwork.timer, intv / 4); | ||
137 | if (check_now) | ||
138 | - queue_delayed_work(system_nrt_wq, &ev->dwork, 0); | ||
139 | + queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, 0); | ||
140 | else if (intv) | ||
141 | - queue_delayed_work(system_nrt_wq, &ev->dwork, intv); | ||
142 | + queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, intv); | ||
143 | out_unlock: | ||
144 | spin_unlock_irqrestore(&ev->lock, flags); | ||
145 | } | ||
146 | @@ -1522,7 +1525,7 @@ void disk_flush_events(struct gendisk *disk, unsigned int mask) | ||
147 | ev->clearing |= mask; | ||
148 | if (!ev->block) { | ||
149 | cancel_delayed_work(&ev->dwork); | ||
150 | - queue_delayed_work(system_nrt_wq, &ev->dwork, 0); | ||
151 | + queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, 0); | ||
152 | } | ||
153 | spin_unlock_irq(&ev->lock); | ||
154 | } | ||
155 | @@ -1559,7 +1562,7 @@ unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask) | ||
156 | |||
157 | /* uncondtionally schedule event check and wait for it to finish */ | ||
158 | disk_block_events(disk); | ||
159 | - queue_delayed_work(system_nrt_wq, &ev->dwork, 0); | ||
160 | + queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, 0); | ||
161 | flush_delayed_work(&ev->dwork); | ||
162 | __disk_unblock_events(disk, false); | ||
163 | |||
164 | @@ -1596,7 +1599,7 @@ static void disk_events_workfn(struct work_struct *work) | ||
165 | |||
166 | intv = disk_events_poll_jiffies(disk); | ||
167 | if (!ev->block && intv) | ||
168 | - queue_delayed_work(system_nrt_wq, &ev->dwork, intv); | ||
169 | + queue_delayed_work(system_nrt_freezable_wq, &ev->dwork, intv); | ||
170 | |||
171 | spin_unlock_irq(&ev->lock); | ||
172 | |||
173 | @@ -1734,9 +1737,9 @@ module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops, | ||
174 | &disk_events_dfl_poll_msecs, 0644); | ||
175 | |||
176 | /* | ||
177 | - * disk_{add|del|release}_events - initialize and destroy disk_events. | ||
178 | + * disk_{alloc|add|del|release}_events - initialize and destroy disk_events. | ||
179 | */ | ||
180 | -static void disk_add_events(struct gendisk *disk) | ||
181 | +static void disk_alloc_events(struct gendisk *disk) | ||
182 | { | ||
183 | struct disk_events *ev; | ||
184 | |||
185 | @@ -1749,16 +1752,6 @@ static void disk_add_events(struct gendisk *disk) | ||
186 | return; | ||
187 | } | ||
188 | |||
189 | - if (sysfs_create_files(&disk_to_dev(disk)->kobj, | ||
190 | - disk_events_attrs) < 0) { | ||
191 | - pr_warn("%s: failed to create sysfs files for events\n", | ||
192 | - disk->disk_name); | ||
193 | - kfree(ev); | ||
194 | - return; | ||
195 | - } | ||
196 | - | ||
197 | - disk->ev = ev; | ||
198 | - | ||
199 | INIT_LIST_HEAD(&ev->node); | ||
200 | ev->disk = disk; | ||
201 | spin_lock_init(&ev->lock); | ||
202 | @@ -1767,8 +1760,21 @@ static void disk_add_events(struct gendisk *disk) | ||
203 | ev->poll_msecs = -1; | ||
204 | INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn); | ||
205 | |||
206 | + disk->ev = ev; | ||
207 | +} | ||
208 | + | ||
209 | +static void disk_add_events(struct gendisk *disk) | ||
210 | +{ | ||
211 | + if (!disk->ev) | ||
212 | + return; | ||
213 | + | ||
214 | + /* FIXME: error handling */ | ||
215 | + if (sysfs_create_files(&disk_to_dev(disk)->kobj, disk_events_attrs) < 0) | ||
216 | + pr_warn("%s: failed to create sysfs files for events\n", | ||
217 | + disk->disk_name); | ||
218 | + | ||
219 | mutex_lock(&disk_events_mutex); | ||
220 | - list_add_tail(&ev->node, &disk_events); | ||
221 | + list_add_tail(&disk->ev->node, &disk_events); | ||
222 | mutex_unlock(&disk_events_mutex); | ||
223 | |||
224 | /* | ||
225 | diff --git a/drivers/block/sx8.c b/drivers/block/sx8.c | ||
226 | index b70f0fc..eec7b7a 100644 | ||
227 | --- a/drivers/block/sx8.c | ||
228 | +++ b/drivers/block/sx8.c | ||
229 | @@ -1116,7 +1116,7 @@ static inline void carm_handle_resp(struct carm_host *host, | ||
230 | break; | ||
231 | case MISC_GET_FW_VER: { | ||
232 | struct carm_fw_ver *ver = (struct carm_fw_ver *) | ||
233 | - mem + sizeof(struct carm_msg_get_fw_ver); | ||
234 | + (mem + sizeof(struct carm_msg_get_fw_ver)); | ||
235 | if (!error) { | ||
236 | host->fw_ver = le32_to_cpu(ver->version); | ||
237 | host->flags |= (ver->features & FL_FW_VER_MASK); | ||
238 | diff --git a/drivers/hwmon/pmbus/zl6100.c b/drivers/hwmon/pmbus/zl6100.c | ||
239 | index ba296fd..5c5cdd2 100644 | ||
240 | --- a/drivers/hwmon/pmbus/zl6100.c | ||
241 | +++ b/drivers/hwmon/pmbus/zl6100.c | ||
242 | @@ -178,16 +178,11 @@ static int zl6100_probe(struct i2c_client *client, | ||
243 | data->id = mid->driver_data; | ||
244 | |||
245 | /* | ||
246 | - * ZL2008, ZL2105, and ZL6100 are known to require a wait time | ||
247 | - * between I2C accesses. ZL2004 and ZL6105 are known to be safe. | ||
248 | - * | ||
249 | - * Only clear the wait time for chips known to be safe. The wait time | ||
250 | - * can be cleared later for additional chips if tests show that it | ||
251 | - * is not needed (in other words, better be safe than sorry). | ||
252 | + * According to information from the chip vendor, all currently | ||
253 | + * supported chips are known to require a wait time between I2C | ||
254 | + * accesses. | ||
255 | */ | ||
256 | data->delay = delay; | ||
257 | - if (data->id == zl2004 || data->id == zl6105) | ||
258 | - data->delay = 0; | ||
259 | |||
260 | /* | ||
261 | * Since there was a direct I2C device access above, wait before | ||
262 | diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c | ||
263 | index c25387d..ceaec92 100644 | ||
264 | --- a/drivers/hwmon/w83627ehf.c | ||
265 | +++ b/drivers/hwmon/w83627ehf.c | ||
266 | @@ -39,7 +39,7 @@ | ||
267 | 0x8860 0xa1 | ||
268 | w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 | ||
269 | w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 | ||
270 | - w83627uhg 8 2 2 2 0xa230 0xc1 0x5ca3 | ||
271 | + w83627uhg 8 2 2 3 0xa230 0xc1 0x5ca3 | ||
272 | w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 | ||
273 | w83667hg-b 9 5 3 4 0xb350 0xc1 0x5ca3 | ||
274 | nct6775f 9 4 3 9 0xb470 0xc1 0x5ca3 | ||
275 | @@ -1607,7 +1607,7 @@ store_##reg(struct device *dev, struct device_attribute *attr, \ | ||
276 | val = step_time_to_reg(val, data->pwm_mode[nr]); \ | ||
277 | mutex_lock(&data->update_lock); \ | ||
278 | data->reg[nr] = val; \ | ||
279 | - w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \ | ||
280 | + w83627ehf_write_value(data, data->REG_##REG[nr], val); \ | ||
281 | mutex_unlock(&data->update_lock); \ | ||
282 | return count; \ | ||
283 | } \ | ||
284 | @@ -2004,7 +2004,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | ||
285 | goto exit; | ||
286 | } | ||
287 | |||
288 | - data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL); | ||
289 | + data = devm_kzalloc(&pdev->dev, sizeof(struct w83627ehf_data), | ||
290 | + GFP_KERNEL); | ||
291 | if (!data) { | ||
292 | err = -ENOMEM; | ||
293 | goto exit_release; | ||
294 | @@ -2157,16 +2158,16 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | ||
295 | w83627ehf_set_temp_reg_ehf(data, 3); | ||
296 | |||
297 | /* | ||
298 | - * Temperature sources for temp1 and temp2 are selected with | ||
299 | + * Temperature sources for temp2 and temp3 are selected with | ||
300 | * bank 0, registers 0x49 and 0x4a. | ||
301 | */ | ||
302 | data->temp_src[0] = 0; /* SYSTIN */ | ||
303 | reg = w83627ehf_read_value(data, 0x49) & 0x07; | ||
304 | /* Adjust to have the same mapping as other source registers */ | ||
305 | if (reg == 0) | ||
306 | - data->temp_src[1]++; | ||
307 | + data->temp_src[1] = 1; | ||
308 | else if (reg >= 2 && reg <= 5) | ||
309 | - data->temp_src[1] += 2; | ||
310 | + data->temp_src[1] = reg + 2; | ||
311 | else /* should never happen */ | ||
312 | data->have_temp &= ~(1 << 1); | ||
313 | reg = w83627ehf_read_value(data, 0x4a); | ||
314 | @@ -2498,9 +2499,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | ||
315 | |||
316 | exit_remove: | ||
317 | w83627ehf_device_remove_files(dev); | ||
318 | - kfree(data); | ||
319 | - platform_set_drvdata(pdev, NULL); | ||
320 | exit_release: | ||
321 | + platform_set_drvdata(pdev, NULL); | ||
322 | release_region(res->start, IOREGION_LENGTH); | ||
323 | exit: | ||
324 | return err; | ||
325 | @@ -2514,7 +2514,6 @@ static int __devexit w83627ehf_remove(struct platform_device *pdev) | ||
326 | w83627ehf_device_remove_files(&pdev->dev); | ||
327 | release_region(data->addr, IOREGION_LENGTH); | ||
328 | platform_set_drvdata(pdev, NULL); | ||
329 | - kfree(data); | ||
330 | |||
331 | return 0; | ||
332 | } | ||
333 | diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c | ||
334 | index 525c734..24f94f4 100644 | ||
335 | --- a/drivers/i2c/algos/i2c-algo-bit.c | ||
336 | +++ b/drivers/i2c/algos/i2c-algo-bit.c | ||
337 | @@ -103,8 +103,14 @@ static int sclhi(struct i2c_algo_bit_data *adap) | ||
338 | * chips may hold it low ("clock stretching") while they | ||
339 | * are processing data internally. | ||
340 | */ | ||
341 | - if (time_after(jiffies, start + adap->timeout)) | ||
342 | + if (time_after(jiffies, start + adap->timeout)) { | ||
343 | + /* Test one last time, as we may have been preempted | ||
344 | + * between last check and timeout test. | ||
345 | + */ | ||
346 | + if (getscl(adap)) | ||
347 | + break; | ||
348 | return -ETIMEDOUT; | ||
349 | + } | ||
350 | cond_resched(); | ||
351 | } | ||
352 | #ifdef DEBUG | ||
353 | diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c | ||
354 | index 54a4a3f..a319281 100644 | ||
355 | --- a/drivers/media/video/omap3isp/ispccdc.c | ||
356 | +++ b/drivers/media/video/omap3isp/ispccdc.c | ||
357 | @@ -1406,8 +1406,7 @@ static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) | ||
358 | |||
359 | static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc) | ||
360 | { | ||
361 | - struct isp_pipeline *pipe = | ||
362 | - to_isp_pipeline(&ccdc->video_out.video.entity); | ||
363 | + struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); | ||
364 | struct video_device *vdev = ccdc->subdev.devnode; | ||
365 | struct v4l2_event event; | ||
366 | |||
367 | diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | ||
368 | index 02c7ed8..eccdcff 100644 | ||
369 | --- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | ||
370 | +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | ||
371 | @@ -2241,10 +2241,6 @@ static netdev_tx_t atl1c_xmit_frame(struct sk_buff *skb, | ||
372 | dev_info(&adapter->pdev->dev, "tx locked\n"); | ||
373 | return NETDEV_TX_LOCKED; | ||
374 | } | ||
375 | - if (skb->mark == 0x01) | ||
376 | - type = atl1c_trans_high; | ||
377 | - else | ||
378 | - type = atl1c_trans_normal; | ||
379 | |||
380 | if (atl1c_tpd_avail(adapter, type) < tpd_req) { | ||
381 | /* no enough descriptor, just stop queue */ | ||
382 | diff --git a/drivers/net/ethernet/packetengines/Kconfig b/drivers/net/ethernet/packetengines/Kconfig | ||
383 | index b97132d..8f29feb 100644 | ||
384 | --- a/drivers/net/ethernet/packetengines/Kconfig | ||
385 | +++ b/drivers/net/ethernet/packetengines/Kconfig | ||
386 | @@ -4,6 +4,7 @@ | ||
387 | |||
388 | config NET_PACKET_ENGINE | ||
389 | bool "Packet Engine devices" | ||
390 | + default y | ||
391 | depends on PCI | ||
392 | ---help--- | ||
393 | If you have a network (Ethernet) card belonging to this class, say Y | ||
394 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c | ||
395 | index c8f47f1..0cf2351 100644 | ||
396 | --- a/drivers/net/ethernet/realtek/r8169.c | ||
397 | +++ b/drivers/net/ethernet/realtek/r8169.c | ||
398 | @@ -3781,12 +3781,20 @@ static void rtl8169_init_ring_indexes(struct rtl8169_private *tp) | ||
399 | |||
400 | static void rtl_hw_jumbo_enable(struct rtl8169_private *tp) | ||
401 | { | ||
402 | + void __iomem *ioaddr = tp->mmio_addr; | ||
403 | + | ||
404 | + RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
405 | rtl_generic_op(tp, tp->jumbo_ops.enable); | ||
406 | + RTL_W8(Cfg9346, Cfg9346_Lock); | ||
407 | } | ||
408 | |||
409 | static void rtl_hw_jumbo_disable(struct rtl8169_private *tp) | ||
410 | { | ||
411 | + void __iomem *ioaddr = tp->mmio_addr; | ||
412 | + | ||
413 | + RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
414 | rtl_generic_op(tp, tp->jumbo_ops.disable); | ||
415 | + RTL_W8(Cfg9346, Cfg9346_Lock); | ||
416 | } | ||
417 | |||
418 | static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp) | ||
419 | diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c | ||
420 | index 752d521..5ef4cc0 100644 | ||
421 | --- a/drivers/net/ethernet/sfc/rx.c | ||
422 | +++ b/drivers/net/ethernet/sfc/rx.c | ||
423 | @@ -156,11 +156,10 @@ static int efx_init_rx_buffers_skb(struct efx_rx_queue *rx_queue) | ||
424 | if (unlikely(!skb)) | ||
425 | return -ENOMEM; | ||
426 | |||
427 | - /* Adjust the SKB for padding and checksum */ | ||
428 | + /* Adjust the SKB for padding */ | ||
429 | skb_reserve(skb, NET_IP_ALIGN); | ||
430 | rx_buf->len = skb_len - NET_IP_ALIGN; | ||
431 | rx_buf->is_page = false; | ||
432 | - skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
433 | |||
434 | rx_buf->dma_addr = pci_map_single(efx->pci_dev, | ||
435 | skb->data, rx_buf->len, | ||
436 | @@ -499,6 +498,7 @@ static void efx_rx_packet_gro(struct efx_channel *channel, | ||
437 | |||
438 | EFX_BUG_ON_PARANOID(!checksummed); | ||
439 | rx_buf->u.skb = NULL; | ||
440 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
441 | |||
442 | gro_result = napi_gro_receive(napi, skb); | ||
443 | } | ||
444 | diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c | ||
445 | index edfa15d..486b404 100644 | ||
446 | --- a/drivers/net/ppp/ppp_generic.c | ||
447 | +++ b/drivers/net/ppp/ppp_generic.c | ||
448 | @@ -2024,14 +2024,22 @@ ppp_mp_reconstruct(struct ppp *ppp) | ||
449 | continue; | ||
450 | } | ||
451 | if (PPP_MP_CB(p)->sequence != seq) { | ||
452 | + u32 oldseq; | ||
453 | /* Fragment `seq' is missing. If it is after | ||
454 | minseq, it might arrive later, so stop here. */ | ||
455 | if (seq_after(seq, minseq)) | ||
456 | break; | ||
457 | /* Fragment `seq' is lost, keep going. */ | ||
458 | lost = 1; | ||
459 | + oldseq = seq; | ||
460 | seq = seq_before(minseq, PPP_MP_CB(p)->sequence)? | ||
461 | minseq + 1: PPP_MP_CB(p)->sequence; | ||
462 | + | ||
463 | + if (ppp->debug & 1) | ||
464 | + netdev_printk(KERN_DEBUG, ppp->dev, | ||
465 | + "lost frag %u..%u\n", | ||
466 | + oldseq, seq-1); | ||
467 | + | ||
468 | goto again; | ||
469 | } | ||
470 | |||
471 | @@ -2076,6 +2084,10 @@ ppp_mp_reconstruct(struct ppp *ppp) | ||
472 | struct sk_buff *tmp2; | ||
473 | |||
474 | skb_queue_reverse_walk_from_safe(list, p, tmp2) { | ||
475 | + if (ppp->debug & 1) | ||
476 | + netdev_printk(KERN_DEBUG, ppp->dev, | ||
477 | + "discarding frag %u\n", | ||
478 | + PPP_MP_CB(p)->sequence); | ||
479 | __skb_unlink(p, list); | ||
480 | kfree_skb(p); | ||
481 | } | ||
482 | @@ -2091,6 +2103,17 @@ ppp_mp_reconstruct(struct ppp *ppp) | ||
483 | /* If we have discarded any fragments, | ||
484 | signal a receive error. */ | ||
485 | if (PPP_MP_CB(head)->sequence != ppp->nextseq) { | ||
486 | + skb_queue_walk_safe(list, p, tmp) { | ||
487 | + if (p == head) | ||
488 | + break; | ||
489 | + if (ppp->debug & 1) | ||
490 | + netdev_printk(KERN_DEBUG, ppp->dev, | ||
491 | + "discarding frag %u\n", | ||
492 | + PPP_MP_CB(p)->sequence); | ||
493 | + __skb_unlink(p, list); | ||
494 | + kfree_skb(p); | ||
495 | + } | ||
496 | + | ||
497 | if (ppp->debug & 1) | ||
498 | netdev_printk(KERN_DEBUG, ppp->dev, | ||
499 | " missed pkts %u..%u\n", | ||
500 | diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c | ||
501 | index f5e063a..fda4be2 100644 | ||
502 | --- a/drivers/net/usb/asix.c | ||
503 | +++ b/drivers/net/usb/asix.c | ||
504 | @@ -1595,6 +1595,10 @@ static const struct usb_device_id products [] = { | ||
505 | USB_DEVICE (0x6189, 0x182d), | ||
506 | .driver_info = (unsigned long) &ax8817x_info, | ||
507 | }, { | ||
508 | + // Sitecom LN-031 "USB 2.0 10/100/1000 Ethernet adapter" | ||
509 | + USB_DEVICE (0x0df6, 0x0056), | ||
510 | + .driver_info = (unsigned long) &ax88178_info, | ||
511 | +}, { | ||
512 | // corega FEther USB2-TX | ||
513 | USB_DEVICE (0x07aa, 0x0017), | ||
514 | .driver_info = (unsigned long) &ax8817x_info, | ||
515 | diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c | ||
516 | index d96bfb1..d426261 100644 | ||
517 | --- a/drivers/net/vmxnet3/vmxnet3_drv.c | ||
518 | +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | ||
519 | @@ -830,13 +830,8 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | ||
520 | ctx->l4_hdr_size = ((struct tcphdr *) | ||
521 | skb_transport_header(skb))->doff * 4; | ||
522 | else if (iph->protocol == IPPROTO_UDP) | ||
523 | - /* | ||
524 | - * Use tcp header size so that bytes to | ||
525 | - * be copied are more than required by | ||
526 | - * the device. | ||
527 | - */ | ||
528 | ctx->l4_hdr_size = | ||
529 | - sizeof(struct tcphdr); | ||
530 | + sizeof(struct udphdr); | ||
531 | else | ||
532 | ctx->l4_hdr_size = 0; | ||
533 | } else { | ||
534 | diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h | ||
535 | index b18eac1..8df921b 100644 | ||
536 | --- a/drivers/net/vmxnet3/vmxnet3_int.h | ||
537 | +++ b/drivers/net/vmxnet3/vmxnet3_int.h | ||
538 | @@ -70,10 +70,10 @@ | ||
539 | /* | ||
540 | * Version numbers | ||
541 | */ | ||
542 | -#define VMXNET3_DRIVER_VERSION_STRING "1.1.18.0-k" | ||
543 | +#define VMXNET3_DRIVER_VERSION_STRING "1.1.29.0-k" | ||
544 | |||
545 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | ||
546 | -#define VMXNET3_DRIVER_VERSION_NUM 0x01011200 | ||
547 | +#define VMXNET3_DRIVER_VERSION_NUM 0x01011D00 | ||
548 | |||
549 | #if defined(CONFIG_PCI_MSI) | ||
550 | /* RSS only makes sense if MSI-X is supported. */ | ||
551 | diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
552 | index edd317f..21b529b 100644 | ||
553 | --- a/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
554 | +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
555 | @@ -426,10 +426,14 @@ void rt2x00lib_txdone(struct queue_entry *entry, | ||
556 | /* | ||
557 | * If the data queue was below the threshold before the txdone | ||
558 | * handler we must make sure the packet queue in the mac80211 stack | ||
559 | - * is reenabled when the txdone handler has finished. | ||
560 | + * is reenabled when the txdone handler has finished. This has to be | ||
561 | + * serialized with rt2x00mac_tx(), otherwise we can wake up queue | ||
562 | + * before it was stopped. | ||
563 | */ | ||
564 | + spin_lock_bh(&entry->queue->tx_lock); | ||
565 | if (!rt2x00queue_threshold(entry->queue)) | ||
566 | rt2x00queue_unpause_queue(entry->queue); | ||
567 | + spin_unlock_bh(&entry->queue->tx_lock); | ||
568 | } | ||
569 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); | ||
570 | |||
571 | diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c | ||
572 | index bf0acff..373dae1 100644 | ||
573 | --- a/drivers/net/wireless/rt2x00/rt2x00mac.c | ||
574 | +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | ||
575 | @@ -152,13 +152,22 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
576 | if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) | ||
577 | goto exit_fail; | ||
578 | |||
579 | + /* | ||
580 | + * Pausing queue has to be serialized with rt2x00lib_txdone(). Note | ||
581 | + * we should not use spin_lock_bh variant as bottom halve was already | ||
582 | + * disabled before ieee80211_xmit() call. | ||
583 | + */ | ||
584 | + spin_lock(&queue->tx_lock); | ||
585 | if (rt2x00queue_threshold(queue)) | ||
586 | rt2x00queue_pause_queue(queue); | ||
587 | + spin_unlock(&queue->tx_lock); | ||
588 | |||
589 | return; | ||
590 | |||
591 | exit_fail: | ||
592 | + spin_lock(&queue->tx_lock); | ||
593 | rt2x00queue_pause_queue(queue); | ||
594 | + spin_unlock(&queue->tx_lock); | ||
595 | exit_free_skb: | ||
596 | dev_kfree_skb_any(skb); | ||
597 | } | ||
598 | diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c | ||
599 | index 5adfb3e..9b1b2b7 100644 | ||
600 | --- a/drivers/net/wireless/rt2x00/rt2x00queue.c | ||
601 | +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | ||
602 | @@ -619,6 +619,9 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | ||
603 | else if (test_bit(REQUIRE_DMA, &queue->rt2x00dev->cap_flags)) | ||
604 | rt2x00queue_align_frame(skb); | ||
605 | |||
606 | + /* | ||
607 | + * That function must be called with bh disabled. | ||
608 | + */ | ||
609 | spin_lock(&queue->tx_lock); | ||
610 | |||
611 | if (unlikely(rt2x00queue_full(queue))) { | ||
612 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c | ||
613 | index 1cfbf22..24f049e 100644 | ||
614 | --- a/drivers/pci/pcie/aspm.c | ||
615 | +++ b/drivers/pci/pcie/aspm.c | ||
616 | @@ -500,6 +500,9 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) | ||
617 | int pos; | ||
618 | u32 reg32; | ||
619 | |||
620 | + if (aspm_disabled) | ||
621 | + return 0; | ||
622 | + | ||
623 | /* | ||
624 | * Some functions in a slot might not all be PCIe functions, | ||
625 | * very strange. Disable ASPM for the whole slot | ||
626 | diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c | ||
627 | index b848277..1e5290b 100644 | ||
628 | --- a/drivers/platform/x86/acer-wmi.c | ||
629 | +++ b/drivers/platform/x86/acer-wmi.c | ||
630 | @@ -679,6 +679,32 @@ static acpi_status AMW0_find_mailled(void) | ||
631 | return AE_OK; | ||
632 | } | ||
633 | |||
634 | +static int AMW0_set_cap_acpi_check_device_found; | ||
635 | + | ||
636 | +static acpi_status AMW0_set_cap_acpi_check_device_cb(acpi_handle handle, | ||
637 | + u32 level, void *context, void **retval) | ||
638 | +{ | ||
639 | + AMW0_set_cap_acpi_check_device_found = 1; | ||
640 | + return AE_OK; | ||
641 | +} | ||
642 | + | ||
643 | +static const struct acpi_device_id norfkill_ids[] = { | ||
644 | + { "VPC2004", 0}, | ||
645 | + { "IBM0068", 0}, | ||
646 | + { "LEN0068", 0}, | ||
647 | + { "", 0}, | ||
648 | +}; | ||
649 | + | ||
650 | +static int AMW0_set_cap_acpi_check_device(void) | ||
651 | +{ | ||
652 | + const struct acpi_device_id *id; | ||
653 | + | ||
654 | + for (id = norfkill_ids; id->id[0]; id++) | ||
655 | + acpi_get_devices(id->id, AMW0_set_cap_acpi_check_device_cb, | ||
656 | + NULL, NULL); | ||
657 | + return AMW0_set_cap_acpi_check_device_found; | ||
658 | +} | ||
659 | + | ||
660 | static acpi_status AMW0_set_capabilities(void) | ||
661 | { | ||
662 | struct wmab_args args; | ||
663 | @@ -692,7 +718,9 @@ static acpi_status AMW0_set_capabilities(void) | ||
664 | * work. | ||
665 | */ | ||
666 | if (wmi_has_guid(AMW0_GUID2)) { | ||
667 | - interface->capability |= ACER_CAP_WIRELESS; | ||
668 | + if ((quirks != &quirk_unknown) || | ||
669 | + !AMW0_set_cap_acpi_check_device()) | ||
670 | + interface->capability |= ACER_CAP_WIRELESS; | ||
671 | return AE_OK; | ||
672 | } | ||
673 | |||
674 | diff --git a/drivers/rapidio/devices/tsi721.h b/drivers/rapidio/devices/tsi721.h | ||
675 | index 822e54c..1c226b3 100644 | ||
676 | --- a/drivers/rapidio/devices/tsi721.h | ||
677 | +++ b/drivers/rapidio/devices/tsi721.h | ||
678 | @@ -118,34 +118,34 @@ | ||
679 | |||
680 | #define TSI721_IDB_ENTRY_SIZE 64 | ||
681 | |||
682 | -#define TSI721_IDQ_CTL(x) (0x20000 + (x) * 1000) | ||
683 | +#define TSI721_IDQ_CTL(x) (0x20000 + (x) * 0x1000) | ||
684 | #define TSI721_IDQ_SUSPEND 0x00000002 | ||
685 | #define TSI721_IDQ_INIT 0x00000001 | ||
686 | |||
687 | -#define TSI721_IDQ_STS(x) (0x20004 + (x) * 1000) | ||
688 | +#define TSI721_IDQ_STS(x) (0x20004 + (x) * 0x1000) | ||
689 | #define TSI721_IDQ_RUN 0x00200000 | ||
690 | |||
691 | -#define TSI721_IDQ_MASK(x) (0x20008 + (x) * 1000) | ||
692 | +#define TSI721_IDQ_MASK(x) (0x20008 + (x) * 0x1000) | ||
693 | #define TSI721_IDQ_MASK_MASK 0xffff0000 | ||
694 | #define TSI721_IDQ_MASK_PATT 0x0000ffff | ||
695 | |||
696 | -#define TSI721_IDQ_RP(x) (0x2000c + (x) * 1000) | ||
697 | +#define TSI721_IDQ_RP(x) (0x2000c + (x) * 0x1000) | ||
698 | #define TSI721_IDQ_RP_PTR 0x0007ffff | ||
699 | |||
700 | -#define TSI721_IDQ_WP(x) (0x20010 + (x) * 1000) | ||
701 | +#define TSI721_IDQ_WP(x) (0x20010 + (x) * 0x1000) | ||
702 | #define TSI721_IDQ_WP_PTR 0x0007ffff | ||
703 | |||
704 | -#define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 1000) | ||
705 | +#define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 0x1000) | ||
706 | #define TSI721_IDQ_BASEL_ADDR 0xffffffc0 | ||
707 | -#define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 1000) | ||
708 | -#define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 1000) | ||
709 | +#define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 0x1000) | ||
710 | +#define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 0x1000) | ||
711 | #define TSI721_IDQ_SIZE_VAL(size) (__fls(size) - 4) | ||
712 | #define TSI721_IDQ_SIZE_MIN 512 | ||
713 | #define TSI721_IDQ_SIZE_MAX (512 * 1024) | ||
714 | |||
715 | -#define TSI721_SR_CHINT(x) (0x20040 + (x) * 1000) | ||
716 | -#define TSI721_SR_CHINTE(x) (0x20044 + (x) * 1000) | ||
717 | -#define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 1000) | ||
718 | +#define TSI721_SR_CHINT(x) (0x20040 + (x) * 0x1000) | ||
719 | +#define TSI721_SR_CHINTE(x) (0x20044 + (x) * 0x1000) | ||
720 | +#define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 0x1000) | ||
721 | #define TSI721_SR_CHINT_ODBOK 0x00000020 | ||
722 | #define TSI721_SR_CHINT_IDBQRCV 0x00000010 | ||
723 | #define TSI721_SR_CHINT_SUSP 0x00000008 | ||
724 | @@ -156,7 +156,7 @@ | ||
725 | |||
726 | #define TSI721_IBWIN_NUM 8 | ||
727 | |||
728 | -#define TSI721_IBWINLB(x) (0x29000 + (x) * 20) | ||
729 | +#define TSI721_IBWINLB(x) (0x29000 + (x) * 0x20) | ||
730 | #define TSI721_IBWINLB_BA 0xfffff000 | ||
731 | #define TSI721_IBWINLB_WEN 0x00000001 | ||
732 | |||
733 | @@ -187,13 +187,13 @@ | ||
734 | */ | ||
735 | #define TSI721_OBWIN_NUM TSI721_PC2SR_WINS | ||
736 | |||
737 | -#define TSI721_OBWINLB(x) (0x40000 + (x) * 20) | ||
738 | +#define TSI721_OBWINLB(x) (0x40000 + (x) * 0x20) | ||
739 | #define TSI721_OBWINLB_BA 0xffff8000 | ||
740 | #define TSI721_OBWINLB_WEN 0x00000001 | ||
741 | |||
742 | -#define TSI721_OBWINUB(x) (0x40004 + (x) * 20) | ||
743 | +#define TSI721_OBWINUB(x) (0x40004 + (x) * 0x20) | ||
744 | |||
745 | -#define TSI721_OBWINSZ(x) (0x40008 + (x) * 20) | ||
746 | +#define TSI721_OBWINSZ(x) (0x40008 + (x) * 0x20) | ||
747 | #define TSI721_OBWINSZ_SIZE 0x00001f00 | ||
748 | #define TSI721_OBWIN_SIZE(size) (__fls(size) - 15) | ||
749 | |||
750 | diff --git a/drivers/regulator/tps6524x-regulator.c b/drivers/regulator/tps6524x-regulator.c | ||
751 | index 9166aa0..229b6f4 100644 | ||
752 | --- a/drivers/regulator/tps6524x-regulator.c | ||
753 | +++ b/drivers/regulator/tps6524x-regulator.c | ||
754 | @@ -481,7 +481,7 @@ static int set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, | ||
755 | if (i >= info->n_voltages) | ||
756 | i = info->n_voltages - 1; | ||
757 | |||
758 | - *selector = info->voltages[i]; | ||
759 | + *selector = i; | ||
760 | |||
761 | return write_field(hw, &info->voltage, i); | ||
762 | } | ||
763 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
764 | index 0c1d5c73..03d3528 100644 | ||
765 | --- a/drivers/target/iscsi/iscsi_target.c | ||
766 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
767 | @@ -1029,7 +1029,7 @@ done: | ||
768 | return iscsit_add_reject_from_cmd( | ||
769 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, | ||
770 | 1, 1, buf, cmd); | ||
771 | - } else if (transport_ret == -EINVAL) { | ||
772 | + } else if (transport_ret < 0) { | ||
773 | /* | ||
774 | * Unsupported SAM Opcode. CHECK_CONDITION will be sent | ||
775 | * in iscsit_execute_cmd() during the CmdSN OOO Execution | ||
776 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c | ||
777 | index 778c1a6..6cf6ff4 100644 | ||
778 | --- a/drivers/target/target_core_pr.c | ||
779 | +++ b/drivers/target/target_core_pr.c | ||
780 | @@ -120,7 +120,7 @@ static struct t10_pr_registration *core_scsi3_locate_pr_reg(struct se_device *, | ||
781 | struct se_node_acl *, struct se_session *); | ||
782 | static void core_scsi3_put_pr_reg(struct t10_pr_registration *); | ||
783 | |||
784 | -static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | ||
785 | +static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd) | ||
786 | { | ||
787 | struct se_session *se_sess = cmd->se_sess; | ||
788 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; | ||
789 | @@ -130,7 +130,7 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | ||
790 | int conflict = 0; | ||
791 | |||
792 | if (!crh) | ||
793 | - return false; | ||
794 | + return -EINVAL; | ||
795 | |||
796 | pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl, | ||
797 | se_sess); | ||
798 | @@ -158,16 +158,14 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | ||
799 | */ | ||
800 | if (pr_reg->pr_res_holder) { | ||
801 | core_scsi3_put_pr_reg(pr_reg); | ||
802 | - *ret = 0; | ||
803 | - return false; | ||
804 | + return 1; | ||
805 | } | ||
806 | if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) || | ||
807 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) || | ||
808 | (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) || | ||
809 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) { | ||
810 | core_scsi3_put_pr_reg(pr_reg); | ||
811 | - *ret = 0; | ||
812 | - return true; | ||
813 | + return 1; | ||
814 | } | ||
815 | core_scsi3_put_pr_reg(pr_reg); | ||
816 | conflict = 1; | ||
817 | @@ -192,10 +190,10 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | ||
818 | " while active SPC-3 registrations exist," | ||
819 | " returning RESERVATION_CONFLICT\n"); | ||
820 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
821 | - return true; | ||
822 | + return -EBUSY; | ||
823 | } | ||
824 | |||
825 | - return false; | ||
826 | + return 0; | ||
827 | } | ||
828 | |||
829 | int target_scsi2_reservation_release(struct se_task *task) | ||
830 | @@ -204,12 +202,18 @@ int target_scsi2_reservation_release(struct se_task *task) | ||
831 | struct se_device *dev = cmd->se_dev; | ||
832 | struct se_session *sess = cmd->se_sess; | ||
833 | struct se_portal_group *tpg = sess->se_tpg; | ||
834 | - int ret = 0; | ||
835 | + int ret = 0, rc; | ||
836 | |||
837 | if (!sess || !tpg) | ||
838 | goto out; | ||
839 | - if (target_check_scsi2_reservation_conflict(cmd, &ret)) | ||
840 | + rc = target_check_scsi2_reservation_conflict(cmd); | ||
841 | + if (rc == 1) | ||
842 | + goto out; | ||
843 | + else if (rc < 0) { | ||
844 | + cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
845 | + ret = -EINVAL; | ||
846 | goto out; | ||
847 | + } | ||
848 | |||
849 | ret = 0; | ||
850 | spin_lock(&dev->dev_reservation_lock); | ||
851 | @@ -246,7 +250,7 @@ int target_scsi2_reservation_reserve(struct se_task *task) | ||
852 | struct se_device *dev = cmd->se_dev; | ||
853 | struct se_session *sess = cmd->se_sess; | ||
854 | struct se_portal_group *tpg = sess->se_tpg; | ||
855 | - int ret = 0; | ||
856 | + int ret = 0, rc; | ||
857 | |||
858 | if ((cmd->t_task_cdb[1] & 0x01) && | ||
859 | (cmd->t_task_cdb[1] & 0x02)) { | ||
860 | @@ -262,8 +266,14 @@ int target_scsi2_reservation_reserve(struct se_task *task) | ||
861 | */ | ||
862 | if (!sess || !tpg) | ||
863 | goto out; | ||
864 | - if (target_check_scsi2_reservation_conflict(cmd, &ret)) | ||
865 | + rc = target_check_scsi2_reservation_conflict(cmd); | ||
866 | + if (rc == 1) | ||
867 | goto out; | ||
868 | + else if (rc < 0) { | ||
869 | + cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
870 | + ret = -EINVAL; | ||
871 | + goto out; | ||
872 | + } | ||
873 | |||
874 | ret = 0; | ||
875 | spin_lock(&dev->dev_reservation_lock); | ||
876 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | ||
877 | index e4ddb93..cdb774b 100644 | ||
878 | --- a/drivers/target/target_core_transport.c | ||
879 | +++ b/drivers/target/target_core_transport.c | ||
880 | @@ -2507,6 +2507,7 @@ static int transport_generic_cmd_sequencer( | ||
881 | cmd, cdb, pr_reg_type) != 0) { | ||
882 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; | ||
883 | cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT; | ||
884 | + cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; | ||
885 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
886 | return -EBUSY; | ||
887 | } | ||
888 | diff --git a/fs/aio.c b/fs/aio.c | ||
889 | index 67e4b90..b9d64d8 100644 | ||
890 | --- a/fs/aio.c | ||
891 | +++ b/fs/aio.c | ||
892 | @@ -228,12 +228,6 @@ static void __put_ioctx(struct kioctx *ctx) | ||
893 | call_rcu(&ctx->rcu_head, ctx_rcu_free); | ||
894 | } | ||
895 | |||
896 | -static inline void get_ioctx(struct kioctx *kioctx) | ||
897 | -{ | ||
898 | - BUG_ON(atomic_read(&kioctx->users) <= 0); | ||
899 | - atomic_inc(&kioctx->users); | ||
900 | -} | ||
901 | - | ||
902 | static inline int try_get_ioctx(struct kioctx *kioctx) | ||
903 | { | ||
904 | return atomic_inc_not_zero(&kioctx->users); | ||
905 | @@ -273,7 +267,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) | ||
906 | mm = ctx->mm = current->mm; | ||
907 | atomic_inc(&mm->mm_count); | ||
908 | |||
909 | - atomic_set(&ctx->users, 1); | ||
910 | + atomic_set(&ctx->users, 2); | ||
911 | spin_lock_init(&ctx->ctx_lock); | ||
912 | spin_lock_init(&ctx->ring_info.ring_lock); | ||
913 | init_waitqueue_head(&ctx->wait); | ||
914 | @@ -609,11 +603,16 @@ static void aio_fput_routine(struct work_struct *data) | ||
915 | fput(req->ki_filp); | ||
916 | |||
917 | /* Link the iocb into the context's free list */ | ||
918 | + rcu_read_lock(); | ||
919 | spin_lock_irq(&ctx->ctx_lock); | ||
920 | really_put_req(ctx, req); | ||
921 | + /* | ||
922 | + * at that point ctx might've been killed, but actual | ||
923 | + * freeing is RCU'd | ||
924 | + */ | ||
925 | spin_unlock_irq(&ctx->ctx_lock); | ||
926 | + rcu_read_unlock(); | ||
927 | |||
928 | - put_ioctx(ctx); | ||
929 | spin_lock_irq(&fput_lock); | ||
930 | } | ||
931 | spin_unlock_irq(&fput_lock); | ||
932 | @@ -644,7 +643,6 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req) | ||
933 | * this function will be executed w/out any aio kthread wakeup. | ||
934 | */ | ||
935 | if (unlikely(!fput_atomic(req->ki_filp))) { | ||
936 | - get_ioctx(ctx); | ||
937 | spin_lock(&fput_lock); | ||
938 | list_add(&req->ki_list, &fput_head); | ||
939 | spin_unlock(&fput_lock); | ||
940 | @@ -1338,10 +1336,10 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp) | ||
941 | ret = PTR_ERR(ioctx); | ||
942 | if (!IS_ERR(ioctx)) { | ||
943 | ret = put_user(ioctx->user_id, ctxp); | ||
944 | - if (!ret) | ||
945 | + if (!ret) { | ||
946 | + put_ioctx(ioctx); | ||
947 | return 0; | ||
948 | - | ||
949 | - get_ioctx(ioctx); /* io_destroy() expects us to hold a ref */ | ||
950 | + } | ||
951 | io_destroy(ioctx); | ||
952 | } | ||
953 | |||
954 | diff --git a/fs/block_dev.c b/fs/block_dev.c | ||
955 | index b07f1da..abe9b48 100644 | ||
956 | --- a/fs/block_dev.c | ||
957 | +++ b/fs/block_dev.c | ||
958 | @@ -1159,8 +1159,12 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
959 | * The latter is necessary to prevent ghost | ||
960 | * partitions on a removed medium. | ||
961 | */ | ||
962 | - if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM)) | ||
963 | - rescan_partitions(disk, bdev); | ||
964 | + if (bdev->bd_invalidated) { | ||
965 | + if (!ret) | ||
966 | + rescan_partitions(disk, bdev); | ||
967 | + else if (ret == -ENOMEDIUM) | ||
968 | + invalidate_partitions(disk, bdev); | ||
969 | + } | ||
970 | if (ret) | ||
971 | goto out_clear; | ||
972 | } else { | ||
973 | @@ -1190,8 +1194,12 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
974 | if (bdev->bd_disk->fops->open) | ||
975 | ret = bdev->bd_disk->fops->open(bdev, mode); | ||
976 | /* the same as first opener case, read comment there */ | ||
977 | - if (bdev->bd_invalidated && (!ret || ret == -ENOMEDIUM)) | ||
978 | - rescan_partitions(bdev->bd_disk, bdev); | ||
979 | + if (bdev->bd_invalidated) { | ||
980 | + if (!ret) | ||
981 | + rescan_partitions(bdev->bd_disk, bdev); | ||
982 | + else if (ret == -ENOMEDIUM) | ||
983 | + invalidate_partitions(bdev->bd_disk, bdev); | ||
984 | + } | ||
985 | if (ret) | ||
986 | goto out_unlock_bdev; | ||
987 | } | ||
988 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c | ||
989 | index 4dd9283..5e64748 100644 | ||
990 | --- a/fs/cifs/file.c | ||
991 | +++ b/fs/cifs/file.c | ||
992 | @@ -920,16 +920,26 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile) | ||
993 | for (lockp = &inode->i_flock; *lockp != NULL; \ | ||
994 | lockp = &(*lockp)->fl_next) | ||
995 | |||
996 | +struct lock_to_push { | ||
997 | + struct list_head llist; | ||
998 | + __u64 offset; | ||
999 | + __u64 length; | ||
1000 | + __u32 pid; | ||
1001 | + __u16 netfid; | ||
1002 | + __u8 type; | ||
1003 | +}; | ||
1004 | + | ||
1005 | static int | ||
1006 | cifs_push_posix_locks(struct cifsFileInfo *cfile) | ||
1007 | { | ||
1008 | struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode); | ||
1009 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); | ||
1010 | struct file_lock *flock, **before; | ||
1011 | - struct cifsLockInfo *lck, *tmp; | ||
1012 | + unsigned int count = 0, i = 0; | ||
1013 | int rc = 0, xid, type; | ||
1014 | + struct list_head locks_to_send, *el; | ||
1015 | + struct lock_to_push *lck, *tmp; | ||
1016 | __u64 length; | ||
1017 | - struct list_head locks_to_send; | ||
1018 | |||
1019 | xid = GetXid(); | ||
1020 | |||
1021 | @@ -940,29 +950,55 @@ cifs_push_posix_locks(struct cifsFileInfo *cfile) | ||
1022 | return rc; | ||
1023 | } | ||
1024 | |||
1025 | + lock_flocks(); | ||
1026 | + cifs_for_each_lock(cfile->dentry->d_inode, before) { | ||
1027 | + if ((*before)->fl_flags & FL_POSIX) | ||
1028 | + count++; | ||
1029 | + } | ||
1030 | + unlock_flocks(); | ||
1031 | + | ||
1032 | INIT_LIST_HEAD(&locks_to_send); | ||
1033 | |||
1034 | + /* | ||
1035 | + * Allocating count locks is enough because no locks can be added to | ||
1036 | + * the list while we are holding cinode->lock_mutex that protects | ||
1037 | + * locking operations of this inode. | ||
1038 | + */ | ||
1039 | + for (; i < count; i++) { | ||
1040 | + lck = kmalloc(sizeof(struct lock_to_push), GFP_KERNEL); | ||
1041 | + if (!lck) { | ||
1042 | + rc = -ENOMEM; | ||
1043 | + goto err_out; | ||
1044 | + } | ||
1045 | + list_add_tail(&lck->llist, &locks_to_send); | ||
1046 | + } | ||
1047 | + | ||
1048 | + i = 0; | ||
1049 | + el = locks_to_send.next; | ||
1050 | lock_flocks(); | ||
1051 | cifs_for_each_lock(cfile->dentry->d_inode, before) { | ||
1052 | + if (el == &locks_to_send) { | ||
1053 | + /* something is really wrong */ | ||
1054 | + cERROR(1, "Can't push all brlocks!"); | ||
1055 | + break; | ||
1056 | + } | ||
1057 | flock = *before; | ||
1058 | + if ((flock->fl_flags & FL_POSIX) == 0) | ||
1059 | + continue; | ||
1060 | length = 1 + flock->fl_end - flock->fl_start; | ||
1061 | if (flock->fl_type == F_RDLCK || flock->fl_type == F_SHLCK) | ||
1062 | type = CIFS_RDLCK; | ||
1063 | else | ||
1064 | type = CIFS_WRLCK; | ||
1065 | - | ||
1066 | - lck = cifs_lock_init(flock->fl_start, length, type, | ||
1067 | - cfile->netfid); | ||
1068 | - if (!lck) { | ||
1069 | - rc = -ENOMEM; | ||
1070 | - goto send_locks; | ||
1071 | - } | ||
1072 | + lck = list_entry(el, struct lock_to_push, llist); | ||
1073 | lck->pid = flock->fl_pid; | ||
1074 | - | ||
1075 | - list_add_tail(&lck->llist, &locks_to_send); | ||
1076 | + lck->netfid = cfile->netfid; | ||
1077 | + lck->length = length; | ||
1078 | + lck->type = type; | ||
1079 | + lck->offset = flock->fl_start; | ||
1080 | + i++; | ||
1081 | + el = el->next; | ||
1082 | } | ||
1083 | - | ||
1084 | -send_locks: | ||
1085 | unlock_flocks(); | ||
1086 | |||
1087 | list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) { | ||
1088 | @@ -979,11 +1015,18 @@ send_locks: | ||
1089 | kfree(lck); | ||
1090 | } | ||
1091 | |||
1092 | +out: | ||
1093 | cinode->can_cache_brlcks = false; | ||
1094 | mutex_unlock(&cinode->lock_mutex); | ||
1095 | |||
1096 | FreeXid(xid); | ||
1097 | return rc; | ||
1098 | +err_out: | ||
1099 | + list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) { | ||
1100 | + list_del(&lck->llist); | ||
1101 | + kfree(lck); | ||
1102 | + } | ||
1103 | + goto out; | ||
1104 | } | ||
1105 | |||
1106 | static int | ||
1107 | diff --git a/fs/namei.c b/fs/namei.c | ||
1108 | index 744e942..9680cef 100644 | ||
1109 | --- a/fs/namei.c | ||
1110 | +++ b/fs/namei.c | ||
1111 | @@ -2139,7 +2139,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | ||
1112 | /* sayonara */ | ||
1113 | error = complete_walk(nd); | ||
1114 | if (error) | ||
1115 | - return ERR_PTR(-ECHILD); | ||
1116 | + return ERR_PTR(error); | ||
1117 | |||
1118 | error = -ENOTDIR; | ||
1119 | if (nd->flags & LOOKUP_DIRECTORY) { | ||
1120 | @@ -2238,7 +2238,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | ||
1121 | /* Why this, you ask? _Now_ we might have grown LOOKUP_JUMPED... */ | ||
1122 | error = complete_walk(nd); | ||
1123 | if (error) | ||
1124 | - goto exit; | ||
1125 | + return ERR_PTR(error); | ||
1126 | error = -EISDIR; | ||
1127 | if (S_ISDIR(nd->inode->i_mode)) | ||
1128 | goto exit; | ||
1129 | diff --git a/fs/partitions/check.c b/fs/partitions/check.c | ||
1130 | index e3c63d1..6b5fcc5 100644 | ||
1131 | --- a/fs/partitions/check.c | ||
1132 | +++ b/fs/partitions/check.c | ||
1133 | @@ -539,17 +539,11 @@ static bool disk_unlock_native_capacity(struct gendisk *disk) | ||
1134 | } | ||
1135 | } | ||
1136 | |||
1137 | -int rescan_partitions(struct gendisk *disk, struct block_device *bdev) | ||
1138 | +static int drop_partitions(struct gendisk *disk, struct block_device *bdev) | ||
1139 | { | ||
1140 | - struct parsed_partitions *state = NULL; | ||
1141 | struct disk_part_iter piter; | ||
1142 | struct hd_struct *part; | ||
1143 | - int p, highest, res; | ||
1144 | -rescan: | ||
1145 | - if (state && !IS_ERR(state)) { | ||
1146 | - kfree(state); | ||
1147 | - state = NULL; | ||
1148 | - } | ||
1149 | + int res; | ||
1150 | |||
1151 | if (bdev->bd_part_count) | ||
1152 | return -EBUSY; | ||
1153 | @@ -562,6 +556,24 @@ rescan: | ||
1154 | delete_partition(disk, part->partno); | ||
1155 | disk_part_iter_exit(&piter); | ||
1156 | |||
1157 | + return 0; | ||
1158 | +} | ||
1159 | + | ||
1160 | +int rescan_partitions(struct gendisk *disk, struct block_device *bdev) | ||
1161 | +{ | ||
1162 | + struct parsed_partitions *state = NULL; | ||
1163 | + struct hd_struct *part; | ||
1164 | + int p, highest, res; | ||
1165 | +rescan: | ||
1166 | + if (state && !IS_ERR(state)) { | ||
1167 | + kfree(state); | ||
1168 | + state = NULL; | ||
1169 | + } | ||
1170 | + | ||
1171 | + res = drop_partitions(disk, bdev); | ||
1172 | + if (res) | ||
1173 | + return res; | ||
1174 | + | ||
1175 | if (disk->fops->revalidate_disk) | ||
1176 | disk->fops->revalidate_disk(disk); | ||
1177 | check_disk_size_change(disk, bdev); | ||
1178 | @@ -665,6 +677,26 @@ rescan: | ||
1179 | return 0; | ||
1180 | } | ||
1181 | |||
1182 | +int invalidate_partitions(struct gendisk *disk, struct block_device *bdev) | ||
1183 | +{ | ||
1184 | + int res; | ||
1185 | + | ||
1186 | + if (!bdev->bd_invalidated) | ||
1187 | + return 0; | ||
1188 | + | ||
1189 | + res = drop_partitions(disk, bdev); | ||
1190 | + if (res) | ||
1191 | + return res; | ||
1192 | + | ||
1193 | + set_capacity(disk, 0); | ||
1194 | + check_disk_size_change(disk, bdev); | ||
1195 | + bdev->bd_invalidated = 0; | ||
1196 | + /* tell userspace that the media / partition table may have changed */ | ||
1197 | + kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE); | ||
1198 | + | ||
1199 | + return 0; | ||
1200 | +} | ||
1201 | + | ||
1202 | unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p) | ||
1203 | { | ||
1204 | struct address_space *mapping = bdev->bd_inode->i_mapping; | ||
1205 | diff --git a/include/linux/genhd.h b/include/linux/genhd.h | ||
1206 | index 6d18f35..c6f7f6a 100644 | ||
1207 | --- a/include/linux/genhd.h | ||
1208 | +++ b/include/linux/genhd.h | ||
1209 | @@ -596,6 +596,7 @@ extern char *disk_name (struct gendisk *hd, int partno, char *buf); | ||
1210 | |||
1211 | extern int disk_expand_part_tbl(struct gendisk *disk, int target); | ||
1212 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); | ||
1213 | +extern int invalidate_partitions(struct gendisk *disk, struct block_device *bdev); | ||
1214 | extern struct hd_struct * __must_check add_partition(struct gendisk *disk, | ||
1215 | int partno, sector_t start, | ||
1216 | sector_t len, int flags, | ||
1217 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
1218 | index fe86488..6cf8b53 100644 | ||
1219 | --- a/include/linux/skbuff.h | ||
1220 | +++ b/include/linux/skbuff.h | ||
1221 | @@ -1453,6 +1453,16 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset) | ||
1222 | } | ||
1223 | #endif /* NET_SKBUFF_DATA_USES_OFFSET */ | ||
1224 | |||
1225 | +static inline void skb_mac_header_rebuild(struct sk_buff *skb) | ||
1226 | +{ | ||
1227 | + if (skb_mac_header_was_set(skb)) { | ||
1228 | + const unsigned char *old_mac = skb_mac_header(skb); | ||
1229 | + | ||
1230 | + skb_set_mac_header(skb, -skb->mac_len); | ||
1231 | + memmove(skb_mac_header(skb), old_mac, skb->mac_len); | ||
1232 | + } | ||
1233 | +} | ||
1234 | + | ||
1235 | static inline int skb_checksum_start_offset(const struct sk_buff *skb) | ||
1236 | { | ||
1237 | return skb->csum_start - skb_headroom(skb); | ||
1238 | diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h | ||
1239 | index 0d556de..e228ca9 100644 | ||
1240 | --- a/include/linux/workqueue.h | ||
1241 | +++ b/include/linux/workqueue.h | ||
1242 | @@ -289,12 +289,16 @@ enum { | ||
1243 | * | ||
1244 | * system_freezable_wq is equivalent to system_wq except that it's | ||
1245 | * freezable. | ||
1246 | + * | ||
1247 | + * system_nrt_freezable_wq is equivalent to system_nrt_wq except that | ||
1248 | + * it's freezable. | ||
1249 | */ | ||
1250 | extern struct workqueue_struct *system_wq; | ||
1251 | extern struct workqueue_struct *system_long_wq; | ||
1252 | extern struct workqueue_struct *system_nrt_wq; | ||
1253 | extern struct workqueue_struct *system_unbound_wq; | ||
1254 | extern struct workqueue_struct *system_freezable_wq; | ||
1255 | +extern struct workqueue_struct *system_nrt_freezable_wq; | ||
1256 | |||
1257 | extern struct workqueue_struct * | ||
1258 | __alloc_workqueue_key(const char *name, unsigned int flags, int max_active, | ||
1259 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
1260 | index 42fa9ad..bb425b1 100644 | ||
1261 | --- a/kernel/workqueue.c | ||
1262 | +++ b/kernel/workqueue.c | ||
1263 | @@ -253,11 +253,13 @@ struct workqueue_struct *system_long_wq __read_mostly; | ||
1264 | struct workqueue_struct *system_nrt_wq __read_mostly; | ||
1265 | struct workqueue_struct *system_unbound_wq __read_mostly; | ||
1266 | struct workqueue_struct *system_freezable_wq __read_mostly; | ||
1267 | +struct workqueue_struct *system_nrt_freezable_wq __read_mostly; | ||
1268 | EXPORT_SYMBOL_GPL(system_wq); | ||
1269 | EXPORT_SYMBOL_GPL(system_long_wq); | ||
1270 | EXPORT_SYMBOL_GPL(system_nrt_wq); | ||
1271 | EXPORT_SYMBOL_GPL(system_unbound_wq); | ||
1272 | EXPORT_SYMBOL_GPL(system_freezable_wq); | ||
1273 | +EXPORT_SYMBOL_GPL(system_nrt_freezable_wq); | ||
1274 | |||
1275 | #define CREATE_TRACE_POINTS | ||
1276 | #include <trace/events/workqueue.h> | ||
1277 | @@ -3821,8 +3823,11 @@ static int __init init_workqueues(void) | ||
1278 | WQ_UNBOUND_MAX_ACTIVE); | ||
1279 | system_freezable_wq = alloc_workqueue("events_freezable", | ||
1280 | WQ_FREEZABLE, 0); | ||
1281 | + system_nrt_freezable_wq = alloc_workqueue("events_nrt_freezable", | ||
1282 | + WQ_NON_REENTRANT | WQ_FREEZABLE, 0); | ||
1283 | BUG_ON(!system_wq || !system_long_wq || !system_nrt_wq || | ||
1284 | - !system_unbound_wq || !system_freezable_wq); | ||
1285 | + !system_unbound_wq || !system_freezable_wq || | ||
1286 | + !system_nrt_freezable_wq); | ||
1287 | return 0; | ||
1288 | } | ||
1289 | early_initcall(init_workqueues); | ||
1290 | diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c | ||
1291 | index a5f4e57..8eb6b15 100644 | ||
1292 | --- a/net/bridge/br_multicast.c | ||
1293 | +++ b/net/bridge/br_multicast.c | ||
1294 | @@ -446,8 +446,11 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, | ||
1295 | ip6h->nexthdr = IPPROTO_HOPOPTS; | ||
1296 | ip6h->hop_limit = 1; | ||
1297 | ipv6_addr_set(&ip6h->daddr, htonl(0xff020000), 0, 0, htonl(1)); | ||
1298 | - ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, | ||
1299 | - &ip6h->saddr); | ||
1300 | + if (ipv6_dev_get_saddr(dev_net(br->dev), br->dev, &ip6h->daddr, 0, | ||
1301 | + &ip6h->saddr)) { | ||
1302 | + kfree_skb(skb); | ||
1303 | + return NULL; | ||
1304 | + } | ||
1305 | ipv6_eth_mc_map(&ip6h->daddr, eth->h_dest); | ||
1306 | |||
1307 | hopopt = (u8 *)(ip6h + 1); | ||
1308 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c | ||
1309 | index 5ac07d3..7aafaed 100644 | ||
1310 | --- a/net/core/neighbour.c | ||
1311 | +++ b/net/core/neighbour.c | ||
1312 | @@ -802,6 +802,8 @@ next_elt: | ||
1313 | write_unlock_bh(&tbl->lock); | ||
1314 | cond_resched(); | ||
1315 | write_lock_bh(&tbl->lock); | ||
1316 | + nht = rcu_dereference_protected(tbl->nht, | ||
1317 | + lockdep_is_held(&tbl->lock)); | ||
1318 | } | ||
1319 | /* Cycle through all hash buckets every base_reachable_time/2 ticks. | ||
1320 | * ARP entry timeouts range from 1/2 base_reachable_time to 3/2 | ||
1321 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
1322 | index 53113b9..e4d1e4a 100644 | ||
1323 | --- a/net/ipv4/tcp_input.c | ||
1324 | +++ b/net/ipv4/tcp_input.c | ||
1325 | @@ -1406,8 +1406,16 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | ||
1326 | |||
1327 | BUG_ON(!pcount); | ||
1328 | |||
1329 | - /* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */ | ||
1330 | - if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint)) | ||
1331 | + /* Adjust counters and hints for the newly sacked sequence | ||
1332 | + * range but discard the return value since prev is already | ||
1333 | + * marked. We must tag the range first because the seq | ||
1334 | + * advancement below implicitly advances | ||
1335 | + * tcp_highest_sack_seq() when skb is highest_sack. | ||
1336 | + */ | ||
1337 | + tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked, | ||
1338 | + start_seq, end_seq, dup_sack, pcount); | ||
1339 | + | ||
1340 | + if (skb == tp->lost_skb_hint) | ||
1341 | tp->lost_cnt_hint += pcount; | ||
1342 | |||
1343 | TCP_SKB_CB(prev)->end_seq += shifted; | ||
1344 | @@ -1433,12 +1441,6 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | ||
1345 | skb_shinfo(skb)->gso_type = 0; | ||
1346 | } | ||
1347 | |||
1348 | - /* Adjust counters and hints for the newly sacked sequence range but | ||
1349 | - * discard the return value since prev is already marked. | ||
1350 | - */ | ||
1351 | - tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked, | ||
1352 | - start_seq, end_seq, dup_sack, pcount); | ||
1353 | - | ||
1354 | /* Difference in this won't matter, both ACKed by the same cumul. ACK */ | ||
1355 | TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); | ||
1356 | |||
1357 | @@ -1586,6 +1588,10 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb, | ||
1358 | } | ||
1359 | } | ||
1360 | |||
1361 | + /* tcp_sacktag_one() won't SACK-tag ranges below snd_una */ | ||
1362 | + if (!after(TCP_SKB_CB(skb)->seq + len, tp->snd_una)) | ||
1363 | + goto fallback; | ||
1364 | + | ||
1365 | if (!skb_shift(prev, skb, len)) | ||
1366 | goto fallback; | ||
1367 | if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack)) | ||
1368 | @@ -2569,6 +2575,7 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | ||
1369 | |||
1370 | if (cnt > packets) { | ||
1371 | if ((tcp_is_sack(tp) && !tcp_is_fack(tp)) || | ||
1372 | + (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED) || | ||
1373 | (oldcnt >= packets)) | ||
1374 | break; | ||
1375 | |||
1376 | diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c | ||
1377 | index 6341818..e3db3f9 100644 | ||
1378 | --- a/net/ipv4/xfrm4_mode_beet.c | ||
1379 | +++ b/net/ipv4/xfrm4_mode_beet.c | ||
1380 | @@ -110,10 +110,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) | ||
1381 | |||
1382 | skb_push(skb, sizeof(*iph)); | ||
1383 | skb_reset_network_header(skb); | ||
1384 | - | ||
1385 | - memmove(skb->data - skb->mac_len, skb_mac_header(skb), | ||
1386 | - skb->mac_len); | ||
1387 | - skb_set_mac_header(skb, -skb->mac_len); | ||
1388 | + skb_mac_header_rebuild(skb); | ||
1389 | |||
1390 | xfrm4_beet_make_header(skb); | ||
1391 | |||
1392 | diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c | ||
1393 | index 534972e..ed4bf11 100644 | ||
1394 | --- a/net/ipv4/xfrm4_mode_tunnel.c | ||
1395 | +++ b/net/ipv4/xfrm4_mode_tunnel.c | ||
1396 | @@ -66,7 +66,6 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | ||
1397 | |||
1398 | static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) | ||
1399 | { | ||
1400 | - const unsigned char *old_mac; | ||
1401 | int err = -EINVAL; | ||
1402 | |||
1403 | if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPIP) | ||
1404 | @@ -84,10 +83,9 @@ static int xfrm4_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) | ||
1405 | if (!(x->props.flags & XFRM_STATE_NOECN)) | ||
1406 | ipip_ecn_decapsulate(skb); | ||
1407 | |||
1408 | - old_mac = skb_mac_header(skb); | ||
1409 | - skb_set_mac_header(skb, -skb->mac_len); | ||
1410 | - memmove(skb_mac_header(skb), old_mac, skb->mac_len); | ||
1411 | skb_reset_network_header(skb); | ||
1412 | + skb_mac_header_rebuild(skb); | ||
1413 | + | ||
1414 | err = 0; | ||
1415 | |||
1416 | out: | ||
1417 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c | ||
1418 | index 836c4ea..a5521c5 100644 | ||
1419 | --- a/net/ipv6/addrconf.c | ||
1420 | +++ b/net/ipv6/addrconf.c | ||
1421 | @@ -434,6 +434,10 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | ||
1422 | /* Join all-node multicast group */ | ||
1423 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); | ||
1424 | |||
1425 | + /* Join all-router multicast group if forwarding is set */ | ||
1426 | + if (ndev->cnf.forwarding && dev && (dev->flags & IFF_MULTICAST)) | ||
1427 | + ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters); | ||
1428 | + | ||
1429 | return ndev; | ||
1430 | } | ||
1431 | |||
1432 | diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c | ||
1433 | index 3437d7d..f37cba9 100644 | ||
1434 | --- a/net/ipv6/xfrm6_mode_beet.c | ||
1435 | +++ b/net/ipv6/xfrm6_mode_beet.c | ||
1436 | @@ -80,7 +80,6 @@ static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb) | ||
1437 | static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb) | ||
1438 | { | ||
1439 | struct ipv6hdr *ip6h; | ||
1440 | - const unsigned char *old_mac; | ||
1441 | int size = sizeof(struct ipv6hdr); | ||
1442 | int err; | ||
1443 | |||
1444 | @@ -90,10 +89,7 @@ static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb) | ||
1445 | |||
1446 | __skb_push(skb, size); | ||
1447 | skb_reset_network_header(skb); | ||
1448 | - | ||
1449 | - old_mac = skb_mac_header(skb); | ||
1450 | - skb_set_mac_header(skb, -skb->mac_len); | ||
1451 | - memmove(skb_mac_header(skb), old_mac, skb->mac_len); | ||
1452 | + skb_mac_header_rebuild(skb); | ||
1453 | |||
1454 | xfrm6_beet_make_header(skb); | ||
1455 | |||
1456 | diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c | ||
1457 | index 4d6edff..23ecd68 100644 | ||
1458 | --- a/net/ipv6/xfrm6_mode_tunnel.c | ||
1459 | +++ b/net/ipv6/xfrm6_mode_tunnel.c | ||
1460 | @@ -63,7 +63,6 @@ static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | ||
1461 | static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) | ||
1462 | { | ||
1463 | int err = -EINVAL; | ||
1464 | - const unsigned char *old_mac; | ||
1465 | |||
1466 | if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPV6) | ||
1467 | goto out; | ||
1468 | @@ -80,10 +79,9 @@ static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) | ||
1469 | if (!(x->props.flags & XFRM_STATE_NOECN)) | ||
1470 | ipip6_ecn_decapsulate(skb); | ||
1471 | |||
1472 | - old_mac = skb_mac_header(skb); | ||
1473 | - skb_set_mac_header(skb, -skb->mac_len); | ||
1474 | - memmove(skb_mac_header(skb), old_mac, skb->mac_len); | ||
1475 | skb_reset_network_header(skb); | ||
1476 | + skb_mac_header_rebuild(skb); | ||
1477 | + | ||
1478 | err = 0; | ||
1479 | |||
1480 | out: | ||
1481 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
1482 | index 3d8fbf4..dc8a6fc 100644 | ||
1483 | --- a/sound/pci/hda/patch_realtek.c | ||
1484 | +++ b/sound/pci/hda/patch_realtek.c | ||
1485 | @@ -2063,12 +2063,16 @@ static int alc_build_controls(struct hda_codec *codec) | ||
1486 | */ | ||
1487 | |||
1488 | static void alc_init_special_input_src(struct hda_codec *codec); | ||
1489 | +static int alc269_fill_coef(struct hda_codec *codec); | ||
1490 | |||
1491 | static int alc_init(struct hda_codec *codec) | ||
1492 | { | ||
1493 | struct alc_spec *spec = codec->spec; | ||
1494 | unsigned int i; | ||
1495 | |||
1496 | + if (codec->vendor_id == 0x10ec0269) | ||
1497 | + alc269_fill_coef(codec); | ||
1498 | + | ||
1499 | alc_fix_pll(codec); | ||
1500 | alc_auto_init_amp(codec, spec->init_amp); | ||
1501 | |||
1502 | @@ -5110,8 +5114,12 @@ static const struct alc_model_fixup alc269_fixup_models[] = { | ||
1503 | |||
1504 | static int alc269_fill_coef(struct hda_codec *codec) | ||
1505 | { | ||
1506 | + struct alc_spec *spec = codec->spec; | ||
1507 | int val; | ||
1508 | |||
1509 | + if (spec->codec_variant != ALC269_TYPE_ALC269VB) | ||
1510 | + return 0; | ||
1511 | + | ||
1512 | if ((alc_get_coef0(codec) & 0x00ff) < 0x015) { | ||
1513 | alc_write_coef_idx(codec, 0xf, 0x960b); | ||
1514 | alc_write_coef_idx(codec, 0xe, 0x8817); | ||
1515 | diff --git a/sound/soc/samsung/neo1973_wm8753.c b/sound/soc/samsung/neo1973_wm8753.c | ||
1516 | index 7207189..2fba3f7 100644 | ||
1517 | --- a/sound/soc/samsung/neo1973_wm8753.c | ||
1518 | +++ b/sound/soc/samsung/neo1973_wm8753.c | ||
1519 | @@ -421,7 +421,7 @@ static struct snd_soc_dai_link neo1973_dai[] = { | ||
1520 | .platform_name = "samsung-audio", | ||
1521 | .cpu_dai_name = "s3c24xx-iis", | ||
1522 | .codec_dai_name = "wm8753-hifi", | ||
1523 | - .codec_name = "wm8753-codec.0-001a", | ||
1524 | + .codec_name = "wm8753.0-001a", | ||
1525 | .init = neo1973_wm8753_init, | ||
1526 | .ops = &neo1973_hifi_ops, | ||
1527 | }, | ||
1528 | @@ -430,7 +430,7 @@ static struct snd_soc_dai_link neo1973_dai[] = { | ||
1529 | .stream_name = "Voice", | ||
1530 | .cpu_dai_name = "dfbmcs320-pcm", | ||
1531 | .codec_dai_name = "wm8753-voice", | ||
1532 | - .codec_name = "wm8753-codec.0-001a", | ||
1533 | + .codec_name = "wm8753.0-001a", | ||
1534 | .ops = &neo1973_voice_ops, | ||
1535 | }, | ||
1536 | }; |