Magellan Linux

Contents of /trunk/kernel-alx/patches-3.10/0119-3.10.20-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2347 - (show annotations) (download)
Mon Dec 16 10:05:01 2013 UTC (10 years, 4 months ago) by niro
File size: 39409 byte(s)
-linux-3.10.20
1 diff --git a/Makefile b/Makefile
2 index 83a02f5b2c00..ba784b7b0f51 100644
3 --- a/Makefile
4 +++ b/Makefile
5 @@ -1,6 +1,6 @@
6 VERSION = 3
7 PATCHLEVEL = 10
8 -SUBLEVEL = 19
9 +SUBLEVEL = 20
10 EXTRAVERSION =
11 NAME = TOSSUG Baby Fish
12
13 diff --git a/drivers/media/platform/sh_vou.c b/drivers/media/platform/sh_vou.c
14 index 7d0235069c87..5d538e7cd1bb 100644
15 --- a/drivers/media/platform/sh_vou.c
16 +++ b/drivers/media/platform/sh_vou.c
17 @@ -776,7 +776,7 @@ static int sh_vou_try_fmt_vid_out(struct file *file, void *priv,
18 v4l_bound_align_image(&pix->width, 0, VOU_MAX_IMAGE_WIDTH, 1,
19 &pix->height, 0, VOU_MAX_IMAGE_HEIGHT, 1, 0);
20
21 - for (i = 0; ARRAY_SIZE(vou_fmt); i++)
22 + for (i = 0; i < ARRAY_SIZE(vou_fmt); i++)
23 if (vou_fmt[i].pfmt == pix->pixelformat)
24 return 0;
25
26 diff --git a/drivers/misc/atmel_pwm.c b/drivers/misc/atmel_pwm.c
27 index 494d0500bda6..a6dc56e1bc58 100644
28 --- a/drivers/misc/atmel_pwm.c
29 +++ b/drivers/misc/atmel_pwm.c
30 @@ -90,8 +90,10 @@ int pwm_channel_alloc(int index, struct pwm_channel *ch)
31 unsigned long flags;
32 int status = 0;
33
34 - /* insist on PWM init, with this signal pinned out */
35 - if (!pwm || !(pwm->mask & 1 << index))
36 + if (!pwm)
37 + return -EPROBE_DEFER;
38 +
39 + if (!(pwm->mask & 1 << index))
40 return -ENODEV;
41
42 if (index < 0 || index >= PWM_NCHAN || !ch)
43 diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
44 index f12e6b85a653..f057a189d975 100644
45 --- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
46 +++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
47 @@ -1600,7 +1600,8 @@ static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
48 flits = skb_transport_offset(skb) / 8;
49 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
50 sgl_flits = make_sgl(skb, sgp, skb_transport_header(skb),
51 - skb->tail - skb->transport_header,
52 + skb_tail_pointer(skb) -
53 + skb_transport_header(skb),
54 adap->pdev);
55 if (need_skb_unmap()) {
56 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits);
57 diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
58 index 0e572a527154..28d706bd12eb 100644
59 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
60 +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
61 @@ -1544,7 +1544,7 @@ static void mlx4_master_deactivate_admin_state(struct mlx4_priv *priv, int slave
62 vp_oper->vlan_idx = NO_INDX;
63 }
64 if (NO_INDX != vp_oper->mac_idx) {
65 - __mlx4_unregister_mac(&priv->dev, port, vp_oper->mac_idx);
66 + __mlx4_unregister_mac(&priv->dev, port, vp_oper->state.mac);
67 vp_oper->mac_idx = NO_INDX;
68 }
69 }
70 diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
71 index 1d01534c2020..64cf70247048 100644
72 --- a/drivers/net/virtio_net.c
73 +++ b/drivers/net/virtio_net.c
74 @@ -1096,11 +1096,6 @@ static int virtnet_cpu_callback(struct notifier_block *nfb,
75 {
76 struct virtnet_info *vi = container_of(nfb, struct virtnet_info, nb);
77
78 - mutex_lock(&vi->config_lock);
79 -
80 - if (!vi->config_enable)
81 - goto done;
82 -
83 switch(action & ~CPU_TASKS_FROZEN) {
84 case CPU_ONLINE:
85 case CPU_DOWN_FAILED:
86 @@ -1114,8 +1109,6 @@ static int virtnet_cpu_callback(struct notifier_block *nfb,
87 break;
88 }
89
90 -done:
91 - mutex_unlock(&vi->config_lock);
92 return NOTIFY_OK;
93 }
94
95 @@ -1672,6 +1665,8 @@ static int virtnet_freeze(struct virtio_device *vdev)
96 struct virtnet_info *vi = vdev->priv;
97 int i;
98
99 + unregister_hotcpu_notifier(&vi->nb);
100 +
101 /* Prevent config work handler from accessing the device */
102 mutex_lock(&vi->config_lock);
103 vi->config_enable = false;
104 @@ -1720,6 +1715,10 @@ static int virtnet_restore(struct virtio_device *vdev)
105 virtnet_set_queues(vi, vi->curr_queue_pairs);
106 rtnl_unlock();
107
108 + err = register_hotcpu_notifier(&vi->nb);
109 + if (err)
110 + return err;
111 +
112 return 0;
113 }
114 #endif
115 diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c
116 index dc94d44d95cd..822443c5a3b5 100644
117 --- a/drivers/net/wireless/iwlwifi/iwl-7000.c
118 +++ b/drivers/net/wireless/iwlwifi/iwl-7000.c
119 @@ -125,7 +125,7 @@ static const struct iwl_ht_params iwl7000_ht_params = {
120
121
122 const struct iwl_cfg iwl7260_2ac_cfg = {
123 - .name = "Intel(R) Dual Band Wireless AC7260",
124 + .name = "Intel(R) Dual Band Wireless AC 7260",
125 .fw_name_pre = IWL7260_FW_PRE,
126 IWL_DEVICE_7000,
127 .ht_params = &iwl7000_ht_params,
128 @@ -133,8 +133,44 @@ const struct iwl_cfg iwl7260_2ac_cfg = {
129 .nvm_calib_ver = IWL7260_TX_POWER_VERSION,
130 };
131
132 -const struct iwl_cfg iwl3160_ac_cfg = {
133 - .name = "Intel(R) Dual Band Wireless AC3160",
134 +const struct iwl_cfg iwl7260_2n_cfg = {
135 + .name = "Intel(R) Dual Band Wireless N 7260",
136 + .fw_name_pre = IWL7260_FW_PRE,
137 + IWL_DEVICE_7000,
138 + .ht_params = &iwl7000_ht_params,
139 + .nvm_ver = IWL7260_NVM_VERSION,
140 + .nvm_calib_ver = IWL7260_TX_POWER_VERSION,
141 +};
142 +
143 +const struct iwl_cfg iwl7260_n_cfg = {
144 + .name = "Intel(R) Wireless N 7260",
145 + .fw_name_pre = IWL7260_FW_PRE,
146 + IWL_DEVICE_7000,
147 + .ht_params = &iwl7000_ht_params,
148 + .nvm_ver = IWL7260_NVM_VERSION,
149 + .nvm_calib_ver = IWL7260_TX_POWER_VERSION,
150 +};
151 +
152 +const struct iwl_cfg iwl3160_2ac_cfg = {
153 + .name = "Intel(R) Dual Band Wireless AC 3160",
154 + .fw_name_pre = IWL3160_FW_PRE,
155 + IWL_DEVICE_7000,
156 + .ht_params = &iwl7000_ht_params,
157 + .nvm_ver = IWL3160_NVM_VERSION,
158 + .nvm_calib_ver = IWL3160_TX_POWER_VERSION,
159 +};
160 +
161 +const struct iwl_cfg iwl3160_2n_cfg = {
162 + .name = "Intel(R) Dual Band Wireless N 3160",
163 + .fw_name_pre = IWL3160_FW_PRE,
164 + IWL_DEVICE_7000,
165 + .ht_params = &iwl7000_ht_params,
166 + .nvm_ver = IWL3160_NVM_VERSION,
167 + .nvm_calib_ver = IWL3160_TX_POWER_VERSION,
168 +};
169 +
170 +const struct iwl_cfg iwl3160_n_cfg = {
171 + .name = "Intel(R) Wireless N 3160",
172 .fw_name_pre = IWL3160_FW_PRE,
173 IWL_DEVICE_7000,
174 .ht_params = &iwl7000_ht_params,
175 diff --git a/drivers/net/wireless/iwlwifi/iwl-config.h b/drivers/net/wireless/iwlwifi/iwl-config.h
176 index c67e29655b2d..44e3370ce343 100644
177 --- a/drivers/net/wireless/iwlwifi/iwl-config.h
178 +++ b/drivers/net/wireless/iwlwifi/iwl-config.h
179 @@ -321,6 +321,10 @@ extern const struct iwl_cfg iwl105_bgn_cfg;
180 extern const struct iwl_cfg iwl105_bgn_d_cfg;
181 extern const struct iwl_cfg iwl135_bgn_cfg;
182 extern const struct iwl_cfg iwl7260_2ac_cfg;
183 -extern const struct iwl_cfg iwl3160_ac_cfg;
184 +extern const struct iwl_cfg iwl7260_2n_cfg;
185 +extern const struct iwl_cfg iwl7260_n_cfg;
186 +extern const struct iwl_cfg iwl3160_2ac_cfg;
187 +extern const struct iwl_cfg iwl3160_2n_cfg;
188 +extern const struct iwl_cfg iwl3160_n_cfg;
189
190 #endif /* __IWL_CONFIG_H__ */
191 diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c
192 index b7858a595973..b53e5c3f403b 100644
193 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c
194 +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c
195 @@ -267,10 +267,83 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
196
197 /* 7000 Series */
198 {IWL_PCI_DEVICE(0x08B1, 0x4070, iwl7260_2ac_cfg)},
199 - {IWL_PCI_DEVICE(0x08B1, 0x4062, iwl7260_2ac_cfg)},
200 + {IWL_PCI_DEVICE(0x08B1, 0x4072, iwl7260_2ac_cfg)},
201 + {IWL_PCI_DEVICE(0x08B1, 0x4170, iwl7260_2ac_cfg)},
202 + {IWL_PCI_DEVICE(0x08B1, 0x4060, iwl7260_2n_cfg)},
203 + {IWL_PCI_DEVICE(0x08B1, 0x406A, iwl7260_2n_cfg)},
204 + {IWL_PCI_DEVICE(0x08B1, 0x4160, iwl7260_2n_cfg)},
205 + {IWL_PCI_DEVICE(0x08B1, 0x4062, iwl7260_n_cfg)},
206 + {IWL_PCI_DEVICE(0x08B1, 0x4162, iwl7260_n_cfg)},
207 + {IWL_PCI_DEVICE(0x08B2, 0x4270, iwl7260_2ac_cfg)},
208 + {IWL_PCI_DEVICE(0x08B2, 0x4272, iwl7260_2ac_cfg)},
209 + {IWL_PCI_DEVICE(0x08B2, 0x4260, iwl7260_2n_cfg)},
210 + {IWL_PCI_DEVICE(0x08B2, 0x426A, iwl7260_2n_cfg)},
211 + {IWL_PCI_DEVICE(0x08B2, 0x4262, iwl7260_n_cfg)},
212 + {IWL_PCI_DEVICE(0x08B1, 0x4470, iwl7260_2ac_cfg)},
213 + {IWL_PCI_DEVICE(0x08B1, 0x4472, iwl7260_2ac_cfg)},
214 + {IWL_PCI_DEVICE(0x08B1, 0x4460, iwl7260_2n_cfg)},
215 + {IWL_PCI_DEVICE(0x08B1, 0x446A, iwl7260_2n_cfg)},
216 + {IWL_PCI_DEVICE(0x08B1, 0x4462, iwl7260_n_cfg)},
217 + {IWL_PCI_DEVICE(0x08B1, 0x4870, iwl7260_2ac_cfg)},
218 + {IWL_PCI_DEVICE(0x08B1, 0x486E, iwl7260_2ac_cfg)},
219 + {IWL_PCI_DEVICE(0x08B1, 0x4570, iwl7260_2ac_cfg)},
220 + {IWL_PCI_DEVICE(0x08B1, 0x4560, iwl7260_2n_cfg)},
221 + {IWL_PCI_DEVICE(0x08B2, 0x4370, iwl7260_2ac_cfg)},
222 + {IWL_PCI_DEVICE(0x08B2, 0x4360, iwl7260_2n_cfg)},
223 + {IWL_PCI_DEVICE(0x08B1, 0x5070, iwl7260_2ac_cfg)},
224 + {IWL_PCI_DEVICE(0x08B1, 0x4020, iwl7260_2n_cfg)},
225 + {IWL_PCI_DEVICE(0x08B1, 0x402A, iwl7260_2n_cfg)},
226 + {IWL_PCI_DEVICE(0x08B2, 0x4220, iwl7260_2n_cfg)},
227 + {IWL_PCI_DEVICE(0x08B1, 0x4420, iwl7260_2n_cfg)},
228 {IWL_PCI_DEVICE(0x08B1, 0xC070, iwl7260_2ac_cfg)},
229 - {IWL_PCI_DEVICE(0x08B3, 0x0070, iwl3160_ac_cfg)},
230 - {IWL_PCI_DEVICE(0x08B3, 0x8070, iwl3160_ac_cfg)},
231 + {IWL_PCI_DEVICE(0x08B1, 0xC072, iwl7260_2ac_cfg)},
232 + {IWL_PCI_DEVICE(0x08B1, 0xC170, iwl7260_2ac_cfg)},
233 + {IWL_PCI_DEVICE(0x08B1, 0xC060, iwl7260_2n_cfg)},
234 + {IWL_PCI_DEVICE(0x08B1, 0xC06A, iwl7260_2n_cfg)},
235 + {IWL_PCI_DEVICE(0x08B1, 0xC160, iwl7260_2n_cfg)},
236 + {IWL_PCI_DEVICE(0x08B1, 0xC062, iwl7260_n_cfg)},
237 + {IWL_PCI_DEVICE(0x08B1, 0xC162, iwl7260_n_cfg)},
238 + {IWL_PCI_DEVICE(0x08B1, 0xC770, iwl7260_2ac_cfg)},
239 + {IWL_PCI_DEVICE(0x08B1, 0xC760, iwl7260_2n_cfg)},
240 + {IWL_PCI_DEVICE(0x08B2, 0xC270, iwl7260_2ac_cfg)},
241 + {IWL_PCI_DEVICE(0x08B2, 0xC272, iwl7260_2ac_cfg)},
242 + {IWL_PCI_DEVICE(0x08B2, 0xC260, iwl7260_2n_cfg)},
243 + {IWL_PCI_DEVICE(0x08B2, 0xC26A, iwl7260_n_cfg)},
244 + {IWL_PCI_DEVICE(0x08B2, 0xC262, iwl7260_n_cfg)},
245 + {IWL_PCI_DEVICE(0x08B1, 0xC470, iwl7260_2ac_cfg)},
246 + {IWL_PCI_DEVICE(0x08B1, 0xC472, iwl7260_2ac_cfg)},
247 + {IWL_PCI_DEVICE(0x08B1, 0xC460, iwl7260_2n_cfg)},
248 + {IWL_PCI_DEVICE(0x08B1, 0xC462, iwl7260_n_cfg)},
249 + {IWL_PCI_DEVICE(0x08B1, 0xC570, iwl7260_2ac_cfg)},
250 + {IWL_PCI_DEVICE(0x08B1, 0xC560, iwl7260_2n_cfg)},
251 + {IWL_PCI_DEVICE(0x08B2, 0xC370, iwl7260_2ac_cfg)},
252 + {IWL_PCI_DEVICE(0x08B1, 0xC360, iwl7260_2n_cfg)},
253 + {IWL_PCI_DEVICE(0x08B1, 0xC020, iwl7260_2n_cfg)},
254 + {IWL_PCI_DEVICE(0x08B1, 0xC02A, iwl7260_2n_cfg)},
255 + {IWL_PCI_DEVICE(0x08B2, 0xC220, iwl7260_2n_cfg)},
256 + {IWL_PCI_DEVICE(0x08B1, 0xC420, iwl7260_2n_cfg)},
257 +
258 +/* 3160 Series */
259 + {IWL_PCI_DEVICE(0x08B3, 0x0070, iwl3160_2ac_cfg)},
260 + {IWL_PCI_DEVICE(0x08B3, 0x0072, iwl3160_2ac_cfg)},
261 + {IWL_PCI_DEVICE(0x08B3, 0x0170, iwl3160_2ac_cfg)},
262 + {IWL_PCI_DEVICE(0x08B3, 0x0172, iwl3160_2ac_cfg)},
263 + {IWL_PCI_DEVICE(0x08B3, 0x0060, iwl3160_2n_cfg)},
264 + {IWL_PCI_DEVICE(0x08B3, 0x0062, iwl3160_n_cfg)},
265 + {IWL_PCI_DEVICE(0x08B4, 0x0270, iwl3160_2ac_cfg)},
266 + {IWL_PCI_DEVICE(0x08B4, 0x0272, iwl3160_2ac_cfg)},
267 + {IWL_PCI_DEVICE(0x08B3, 0x0470, iwl3160_2ac_cfg)},
268 + {IWL_PCI_DEVICE(0x08B3, 0x0472, iwl3160_2ac_cfg)},
269 + {IWL_PCI_DEVICE(0x08B4, 0x0370, iwl3160_2ac_cfg)},
270 + {IWL_PCI_DEVICE(0x08B3, 0x8070, iwl3160_2ac_cfg)},
271 + {IWL_PCI_DEVICE(0x08B3, 0x8072, iwl3160_2ac_cfg)},
272 + {IWL_PCI_DEVICE(0x08B3, 0x8170, iwl3160_2ac_cfg)},
273 + {IWL_PCI_DEVICE(0x08B3, 0x8172, iwl3160_2ac_cfg)},
274 + {IWL_PCI_DEVICE(0x08B3, 0x8060, iwl3160_2n_cfg)},
275 + {IWL_PCI_DEVICE(0x08B3, 0x8062, iwl3160_n_cfg)},
276 + {IWL_PCI_DEVICE(0x08B4, 0x8270, iwl3160_2ac_cfg)},
277 + {IWL_PCI_DEVICE(0x08B3, 0x8470, iwl3160_2ac_cfg)},
278 + {IWL_PCI_DEVICE(0x08B3, 0x8570, iwl3160_2ac_cfg)},
279
280 {0}
281 };
282 diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
283 index 1a285083d24a..f2faa779e3fe 100644
284 --- a/drivers/net/xen-netback/common.h
285 +++ b/drivers/net/xen-netback/common.h
286 @@ -88,6 +88,7 @@ struct xenvif {
287 unsigned long credit_usec;
288 unsigned long remaining_credit;
289 struct timer_list credit_timeout;
290 + u64 credit_window_start;
291
292 /* Statistics */
293 unsigned long rx_gso_checksum_fixup;
294 diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
295 index 3a294c2528d5..c4a2eb2cd8a0 100644
296 --- a/drivers/net/xen-netback/interface.c
297 +++ b/drivers/net/xen-netback/interface.c
298 @@ -275,8 +275,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
299 vif->credit_bytes = vif->remaining_credit = ~0UL;
300 vif->credit_usec = 0UL;
301 init_timer(&vif->credit_timeout);
302 - /* Initialize 'expires' now: it's used to track the credit window. */
303 - vif->credit_timeout.expires = jiffies;
304 + vif->credit_window_start = get_jiffies_64();
305
306 dev->netdev_ops = &xenvif_netdev_ops;
307 dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
308 diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
309 index 0071f211a08a..36efb418c26f 100644
310 --- a/drivers/net/xen-netback/netback.c
311 +++ b/drivers/net/xen-netback/netback.c
312 @@ -1423,9 +1423,8 @@ out:
313
314 static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
315 {
316 - unsigned long now = jiffies;
317 - unsigned long next_credit =
318 - vif->credit_timeout.expires +
319 + u64 now = get_jiffies_64();
320 + u64 next_credit = vif->credit_window_start +
321 msecs_to_jiffies(vif->credit_usec / 1000);
322
323 /* Timer could already be pending in rare cases. */
324 @@ -1433,8 +1432,8 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
325 return true;
326
327 /* Passed the point where we can replenish credit? */
328 - if (time_after_eq(now, next_credit)) {
329 - vif->credit_timeout.expires = now;
330 + if (time_after_eq64(now, next_credit)) {
331 + vif->credit_window_start = now;
332 tx_add_credit(vif);
333 }
334
335 @@ -1446,6 +1445,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
336 tx_credit_callback;
337 mod_timer(&vif->credit_timeout,
338 next_credit);
339 + vif->credit_window_start = next_credit;
340
341 return true;
342 }
343 diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
344 index abe24ff000f0..8a9e8750703f 100644
345 --- a/drivers/net/xen-netback/xenbus.c
346 +++ b/drivers/net/xen-netback/xenbus.c
347 @@ -24,6 +24,12 @@
348 struct backend_info {
349 struct xenbus_device *dev;
350 struct xenvif *vif;
351 +
352 + /* This is the state that will be reflected in xenstore when any
353 + * active hotplug script completes.
354 + */
355 + enum xenbus_state state;
356 +
357 enum xenbus_state frontend_state;
358 struct xenbus_watch hotplug_status_watch;
359 u8 have_hotplug_status_watch:1;
360 @@ -33,11 +39,15 @@ static int connect_rings(struct backend_info *);
361 static void connect(struct backend_info *);
362 static void backend_create_xenvif(struct backend_info *be);
363 static void unregister_hotplug_status_watch(struct backend_info *be);
364 +static void set_backend_state(struct backend_info *be,
365 + enum xenbus_state state);
366
367 static int netback_remove(struct xenbus_device *dev)
368 {
369 struct backend_info *be = dev_get_drvdata(&dev->dev);
370
371 + set_backend_state(be, XenbusStateClosed);
372 +
373 unregister_hotplug_status_watch(be);
374 if (be->vif) {
375 kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
376 @@ -126,6 +136,8 @@ static int netback_probe(struct xenbus_device *dev,
377 if (err)
378 goto fail;
379
380 + be->state = XenbusStateInitWait;
381 +
382 /* This kicks hotplug scripts, so do it immediately. */
383 backend_create_xenvif(be);
384
385 @@ -198,24 +210,113 @@ static void backend_create_xenvif(struct backend_info *be)
386 kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
387 }
388
389 -
390 -static void disconnect_backend(struct xenbus_device *dev)
391 +static void backend_disconnect(struct backend_info *be)
392 {
393 - struct backend_info *be = dev_get_drvdata(&dev->dev);
394 -
395 if (be->vif)
396 xenvif_disconnect(be->vif);
397 }
398
399 -static void destroy_backend(struct xenbus_device *dev)
400 +static void backend_connect(struct backend_info *be)
401 {
402 - struct backend_info *be = dev_get_drvdata(&dev->dev);
403 + if (be->vif)
404 + connect(be);
405 +}
406
407 - if (be->vif) {
408 - kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
409 - xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
410 - xenvif_free(be->vif);
411 - be->vif = NULL;
412 +static inline void backend_switch_state(struct backend_info *be,
413 + enum xenbus_state state)
414 +{
415 + struct xenbus_device *dev = be->dev;
416 +
417 + pr_debug("%s -> %s\n", dev->nodename, xenbus_strstate(state));
418 + be->state = state;
419 +
420 + /* If we are waiting for a hotplug script then defer the
421 + * actual xenbus state change.
422 + */
423 + if (!be->have_hotplug_status_watch)
424 + xenbus_switch_state(dev, state);
425 +}
426 +
427 +/* Handle backend state transitions:
428 + *
429 + * The backend state starts in InitWait and the following transitions are
430 + * allowed.
431 + *
432 + * InitWait -> Connected
433 + *
434 + * ^ \ |
435 + * | \ |
436 + * | \ |
437 + * | \ |
438 + * | \ |
439 + * | \ |
440 + * | V V
441 + *
442 + * Closed <-> Closing
443 + *
444 + * The state argument specifies the eventual state of the backend and the
445 + * function transitions to that state via the shortest path.
446 + */
447 +static void set_backend_state(struct backend_info *be,
448 + enum xenbus_state state)
449 +{
450 + while (be->state != state) {
451 + switch (be->state) {
452 + case XenbusStateClosed:
453 + switch (state) {
454 + case XenbusStateInitWait:
455 + case XenbusStateConnected:
456 + pr_info("%s: prepare for reconnect\n",
457 + be->dev->nodename);
458 + backend_switch_state(be, XenbusStateInitWait);
459 + break;
460 + case XenbusStateClosing:
461 + backend_switch_state(be, XenbusStateClosing);
462 + break;
463 + default:
464 + BUG();
465 + }
466 + break;
467 + case XenbusStateInitWait:
468 + switch (state) {
469 + case XenbusStateConnected:
470 + backend_connect(be);
471 + backend_switch_state(be, XenbusStateConnected);
472 + break;
473 + case XenbusStateClosing:
474 + case XenbusStateClosed:
475 + backend_switch_state(be, XenbusStateClosing);
476 + break;
477 + default:
478 + BUG();
479 + }
480 + break;
481 + case XenbusStateConnected:
482 + switch (state) {
483 + case XenbusStateInitWait:
484 + case XenbusStateClosing:
485 + case XenbusStateClosed:
486 + backend_disconnect(be);
487 + backend_switch_state(be, XenbusStateClosing);
488 + break;
489 + default:
490 + BUG();
491 + }
492 + break;
493 + case XenbusStateClosing:
494 + switch (state) {
495 + case XenbusStateInitWait:
496 + case XenbusStateConnected:
497 + case XenbusStateClosed:
498 + backend_switch_state(be, XenbusStateClosed);
499 + break;
500 + default:
501 + BUG();
502 + }
503 + break;
504 + default:
505 + BUG();
506 + }
507 }
508 }
509
510 @@ -227,41 +328,33 @@ static void frontend_changed(struct xenbus_device *dev,
511 {
512 struct backend_info *be = dev_get_drvdata(&dev->dev);
513
514 - pr_debug("frontend state %s", xenbus_strstate(frontend_state));
515 + pr_debug("%s -> %s\n", dev->otherend, xenbus_strstate(frontend_state));
516
517 be->frontend_state = frontend_state;
518
519 switch (frontend_state) {
520 case XenbusStateInitialising:
521 - if (dev->state == XenbusStateClosed) {
522 - printk(KERN_INFO "%s: %s: prepare for reconnect\n",
523 - __func__, dev->nodename);
524 - xenbus_switch_state(dev, XenbusStateInitWait);
525 - }
526 + set_backend_state(be, XenbusStateInitWait);
527 break;
528
529 case XenbusStateInitialised:
530 break;
531
532 case XenbusStateConnected:
533 - if (dev->state == XenbusStateConnected)
534 - break;
535 - if (be->vif)
536 - connect(be);
537 + set_backend_state(be, XenbusStateConnected);
538 break;
539
540 case XenbusStateClosing:
541 - disconnect_backend(dev);
542 - xenbus_switch_state(dev, XenbusStateClosing);
543 + set_backend_state(be, XenbusStateClosing);
544 break;
545
546 case XenbusStateClosed:
547 - xenbus_switch_state(dev, XenbusStateClosed);
548 + set_backend_state(be, XenbusStateClosed);
549 if (xenbus_dev_is_online(dev))
550 break;
551 - destroy_backend(dev);
552 /* fall through if not online */
553 case XenbusStateUnknown:
554 + set_backend_state(be, XenbusStateClosed);
555 device_unregister(&dev->dev);
556 break;
557
558 @@ -354,7 +447,9 @@ static void hotplug_status_changed(struct xenbus_watch *watch,
559 if (IS_ERR(str))
560 return;
561 if (len == sizeof("connected")-1 && !memcmp(str, "connected", len)) {
562 - xenbus_switch_state(be->dev, XenbusStateConnected);
563 + /* Complete any pending state change */
564 + xenbus_switch_state(be->dev, be->state);
565 +
566 /* Not interested in this watch anymore. */
567 unregister_hotplug_status_watch(be);
568 }
569 @@ -384,12 +479,8 @@ static void connect(struct backend_info *be)
570 err = xenbus_watch_pathfmt(dev, &be->hotplug_status_watch,
571 hotplug_status_changed,
572 "%s/%s", dev->nodename, "hotplug-status");
573 - if (err) {
574 - /* Switch now, since we can't do a watch. */
575 - xenbus_switch_state(dev, XenbusStateConnected);
576 - } else {
577 + if (!err)
578 be->have_hotplug_status_watch = 1;
579 - }
580
581 netif_wake_queue(be->vif->dev);
582 }
583 diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
584 index d53547d2e4c7..d3aa353908aa 100644
585 --- a/drivers/usb/core/hcd.c
586 +++ b/drivers/usb/core/hcd.c
587 @@ -1010,6 +1010,7 @@ static int register_root_hub(struct usb_hcd *hcd)
588 dev_name(&usb_dev->dev), retval);
589 return retval;
590 }
591 + usb_dev->lpm_capable = usb_device_supports_lpm(usb_dev);
592 }
593
594 retval = usb_new_device (usb_dev);
595 diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
596 index 6cf2ae0aa1f7..c8b9fa0e9275 100644
597 --- a/drivers/usb/core/hub.c
598 +++ b/drivers/usb/core/hub.c
599 @@ -135,7 +135,7 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev)
600 return usb_get_intfdata(hdev->actconfig->interface[0]);
601 }
602
603 -static int usb_device_supports_lpm(struct usb_device *udev)
604 +int usb_device_supports_lpm(struct usb_device *udev)
605 {
606 /* USB 2.1 (and greater) devices indicate LPM support through
607 * their USB 2.0 Extended Capabilities BOS descriptor.
608 @@ -156,6 +156,11 @@ static int usb_device_supports_lpm(struct usb_device *udev)
609 "Power management will be impacted.\n");
610 return 0;
611 }
612 +
613 + /* udev is root hub */
614 + if (!udev->parent)
615 + return 1;
616 +
617 if (udev->parent->lpm_capable)
618 return 1;
619
620 @@ -1557,10 +1562,15 @@ static int hub_configure(struct usb_hub *hub,
621 if (hub->has_indicators && blinkenlights)
622 hub->indicator [0] = INDICATOR_CYCLE;
623
624 - for (i = 0; i < hdev->maxchild; i++)
625 - if (usb_hub_create_port_device(hub, i + 1) < 0)
626 + for (i = 0; i < hdev->maxchild; i++) {
627 + ret = usb_hub_create_port_device(hub, i + 1);
628 + if (ret < 0) {
629 dev_err(hub->intfdev,
630 "couldn't create port%d device.\n", i + 1);
631 + hdev->maxchild = i;
632 + goto fail_keep_maxchild;
633 + }
634 + }
635
636 usb_hub_adjust_deviceremovable(hdev, hub->descriptor);
637
638 @@ -1568,6 +1578,8 @@ static int hub_configure(struct usb_hub *hub,
639 return 0;
640
641 fail:
642 + hdev->maxchild = 0;
643 +fail_keep_maxchild:
644 dev_err (hub_dev, "config failed, %s (err %d)\n",
645 message, ret);
646 /* hub_disconnect() frees urb and descriptor */
647 diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
648 index 823857767a16..c49383669cd8 100644
649 --- a/drivers/usb/core/usb.h
650 +++ b/drivers/usb/core/usb.h
651 @@ -35,6 +35,7 @@ extern int usb_get_device_descriptor(struct usb_device *dev,
652 unsigned int size);
653 extern int usb_get_bos_descriptor(struct usb_device *dev);
654 extern void usb_release_bos_descriptor(struct usb_device *dev);
655 +extern int usb_device_supports_lpm(struct usb_device *udev);
656 extern char *usb_cache_string(struct usb_device *udev, int index);
657 extern int usb_set_configuration(struct usb_device *dev, int configuration);
658 extern int usb_choose_configuration(struct usb_device *udev);
659 diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
660 index acaee066b99a..c3d94853b4ab 100644
661 --- a/drivers/usb/serial/option.c
662 +++ b/drivers/usb/serial/option.c
663 @@ -1376,6 +1376,23 @@ static const struct usb_device_id option_ids[] = {
664 .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
665 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */
666 .driver_info = (kernel_ulong_t)&net_intf2_blacklist },
667 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) },
668 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) },
669 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) },
670 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1545, 0xff, 0xff, 0xff) },
671 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1546, 0xff, 0xff, 0xff) },
672 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1547, 0xff, 0xff, 0xff) },
673 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1565, 0xff, 0xff, 0xff) },
674 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1566, 0xff, 0xff, 0xff) },
675 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1567, 0xff, 0xff, 0xff) },
676 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1589, 0xff, 0xff, 0xff) },
677 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1590, 0xff, 0xff, 0xff) },
678 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1591, 0xff, 0xff, 0xff) },
679 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1592, 0xff, 0xff, 0xff) },
680 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1594, 0xff, 0xff, 0xff) },
681 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1596, 0xff, 0xff, 0xff) },
682 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1598, 0xff, 0xff, 0xff) },
683 + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1600, 0xff, 0xff, 0xff) },
684 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff,
685 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist },
686 { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) },
687 diff --git a/drivers/video/backlight/atmel-pwm-bl.c b/drivers/video/backlight/atmel-pwm-bl.c
688 index a60d6afca97c..30e4ed52d701 100644
689 --- a/drivers/video/backlight/atmel-pwm-bl.c
690 +++ b/drivers/video/backlight/atmel-pwm-bl.c
691 @@ -118,7 +118,7 @@ static const struct backlight_ops atmel_pwm_bl_ops = {
692 .update_status = atmel_pwm_bl_set_intensity,
693 };
694
695 -static int __init atmel_pwm_bl_probe(struct platform_device *pdev)
696 +static int atmel_pwm_bl_probe(struct platform_device *pdev)
697 {
698 struct backlight_properties props;
699 const struct atmel_pwm_bl_platform_data *pdata;
700 @@ -203,7 +203,7 @@ err_free_mem:
701 return retval;
702 }
703
704 -static int __exit atmel_pwm_bl_remove(struct platform_device *pdev)
705 +static int atmel_pwm_bl_remove(struct platform_device *pdev)
706 {
707 struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev);
708
709 @@ -222,10 +222,11 @@ static struct platform_driver atmel_pwm_bl_driver = {
710 .name = "atmel-pwm-bl",
711 },
712 /* REVISIT add suspend() and resume() */
713 - .remove = __exit_p(atmel_pwm_bl_remove),
714 + .probe = atmel_pwm_bl_probe,
715 + .remove = atmel_pwm_bl_remove,
716 };
717
718 -module_platform_driver_probe(atmel_pwm_bl_driver, atmel_pwm_bl_probe);
719 +module_platform_driver(atmel_pwm_bl_driver);
720
721 MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>");
722 MODULE_DESCRIPTION("Atmel PWM backlight driver");
723 diff --git a/drivers/video/hyperv_fb.c b/drivers/video/hyperv_fb.c
724 index d4d2c5fe2488..0f3b33cf13ef 100644
725 --- a/drivers/video/hyperv_fb.c
726 +++ b/drivers/video/hyperv_fb.c
727 @@ -795,12 +795,21 @@ static int hvfb_remove(struct hv_device *hdev)
728 }
729
730
731 +static DEFINE_PCI_DEVICE_TABLE(pci_stub_id_table) = {
732 + {
733 + .vendor = PCI_VENDOR_ID_MICROSOFT,
734 + .device = PCI_DEVICE_ID_HYPERV_VIDEO,
735 + },
736 + { /* end of list */ }
737 +};
738 +
739 static const struct hv_vmbus_device_id id_table[] = {
740 /* Synthetic Video Device GUID */
741 {HV_SYNTHVID_GUID},
742 {}
743 };
744
745 +MODULE_DEVICE_TABLE(pci, pci_stub_id_table);
746 MODULE_DEVICE_TABLE(vmbus, id_table);
747
748 static struct hv_driver hvfb_drv = {
749 @@ -810,14 +819,43 @@ static struct hv_driver hvfb_drv = {
750 .remove = hvfb_remove,
751 };
752
753 +static int hvfb_pci_stub_probe(struct pci_dev *pdev,
754 + const struct pci_device_id *ent)
755 +{
756 + return 0;
757 +}
758 +
759 +static void hvfb_pci_stub_remove(struct pci_dev *pdev)
760 +{
761 +}
762 +
763 +static struct pci_driver hvfb_pci_stub_driver = {
764 + .name = KBUILD_MODNAME,
765 + .id_table = pci_stub_id_table,
766 + .probe = hvfb_pci_stub_probe,
767 + .remove = hvfb_pci_stub_remove,
768 +};
769
770 static int __init hvfb_drv_init(void)
771 {
772 - return vmbus_driver_register(&hvfb_drv);
773 + int ret;
774 +
775 + ret = vmbus_driver_register(&hvfb_drv);
776 + if (ret != 0)
777 + return ret;
778 +
779 + ret = pci_register_driver(&hvfb_pci_stub_driver);
780 + if (ret != 0) {
781 + vmbus_driver_unregister(&hvfb_drv);
782 + return ret;
783 + }
784 +
785 + return 0;
786 }
787
788 static void __exit hvfb_drv_exit(void)
789 {
790 + pci_unregister_driver(&hvfb_pci_stub_driver);
791 vmbus_driver_unregister(&hvfb_drv);
792 }
793
794 diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
795 index 2a601e7da1bf..665e0cee59bd 100644
796 --- a/include/net/ip6_fib.h
797 +++ b/include/net/ip6_fib.h
798 @@ -165,6 +165,7 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
799 static inline void rt6_clean_expires(struct rt6_info *rt)
800 {
801 rt->rt6i_flags &= ~RTF_EXPIRES;
802 + rt->dst.expires = 0;
803 }
804
805 static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires)
806 diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
807 index a9942e1faefb..7ac7f91f0242 100644
808 --- a/include/net/ip_tunnels.h
809 +++ b/include/net/ip_tunnels.h
810 @@ -113,7 +113,7 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
811 __be32 key);
812
813 int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
814 - const struct tnl_ptk_info *tpi, bool log_ecn_error);
815 + const struct tnl_ptk_info *tpi, int hdr_len, bool log_ecn_error);
816 int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
817 struct ip_tunnel_parm *p);
818 int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
819 diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
820 index fb104e51496e..9e59950f55cf 100644
821 --- a/include/uapi/linux/perf_event.h
822 +++ b/include/uapi/linux/perf_event.h
823 @@ -425,13 +425,15 @@ struct perf_event_mmap_page {
824 /*
825 * Control data for the mmap() data buffer.
826 *
827 - * User-space reading the @data_head value should issue an rmb(), on
828 - * SMP capable platforms, after reading this value -- see
829 - * perf_event_wakeup().
830 + * User-space reading the @data_head value should issue an smp_rmb(),
831 + * after reading this value.
832 *
833 * When the mapping is PROT_WRITE the @data_tail value should be
834 - * written by userspace to reflect the last read data. In this case
835 - * the kernel will not over-write unread data.
836 + * written by userspace to reflect the last read data, after issueing
837 + * an smp_mb() to separate the data read from the ->data_tail store.
838 + * In this case the kernel will not over-write unread data.
839 + *
840 + * See perf_output_put_handle() for the data ordering.
841 */
842 __u64 data_head; /* head in the data section */
843 __u64 data_tail; /* user-space written tail */
844 diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
845 index cd55144270b5..9c2ddfbf4525 100644
846 --- a/kernel/events/ring_buffer.c
847 +++ b/kernel/events/ring_buffer.c
848 @@ -87,10 +87,31 @@ again:
849 goto out;
850
851 /*
852 - * Publish the known good head. Rely on the full barrier implied
853 - * by atomic_dec_and_test() order the rb->head read and this
854 - * write.
855 + * Since the mmap() consumer (userspace) can run on a different CPU:
856 + *
857 + * kernel user
858 + *
859 + * READ ->data_tail READ ->data_head
860 + * smp_mb() (A) smp_rmb() (C)
861 + * WRITE $data READ $data
862 + * smp_wmb() (B) smp_mb() (D)
863 + * STORE ->data_head WRITE ->data_tail
864 + *
865 + * Where A pairs with D, and B pairs with C.
866 + *
867 + * I don't think A needs to be a full barrier because we won't in fact
868 + * write data until we see the store from userspace. So we simply don't
869 + * issue the data WRITE until we observe it. Be conservative for now.
870 + *
871 + * OTOH, D needs to be a full barrier since it separates the data READ
872 + * from the tail WRITE.
873 + *
874 + * For B a WMB is sufficient since it separates two WRITEs, and for C
875 + * an RMB is sufficient since it separates two READs.
876 + *
877 + * See perf_output_begin().
878 */
879 + smp_wmb();
880 rb->user_page->data_head = head;
881
882 /*
883 @@ -154,9 +175,11 @@ int perf_output_begin(struct perf_output_handle *handle,
884 * Userspace could choose to issue a mb() before updating the
885 * tail pointer. So that all reads will be completed before the
886 * write is issued.
887 + *
888 + * See perf_output_put_handle().
889 */
890 tail = ACCESS_ONCE(rb->user_page->data_tail);
891 - smp_rmb();
892 + smp_mb();
893 offset = head = local_read(&rb->head);
894 head += size;
895 if (unlikely(!perf_output_space(rb, tail, offset, head)))
896 diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
897 index 0582a01a81e3..5546ae9c84f9 100644
898 --- a/kernel/trace/trace.c
899 +++ b/kernel/trace/trace.c
900 @@ -826,9 +826,12 @@ int trace_get_user(struct trace_parser *parser, const char __user *ubuf,
901 if (isspace(ch)) {
902 parser->buffer[parser->idx] = 0;
903 parser->cont = false;
904 - } else {
905 + } else if (parser->idx < parser->size - 1) {
906 parser->cont = true;
907 parser->buffer[parser->idx++] = ch;
908 + } else {
909 + ret = -EINVAL;
910 + goto out;
911 }
912
913 *ppos += read;
914 diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c
915 index 51aafd669cbb..f1cb1f56cda9 100644
916 --- a/net/batman-adv/main.c
917 +++ b/net/batman-adv/main.c
918 @@ -61,6 +61,7 @@ static int __init batadv_init(void)
919 batadv_recv_handler_init();
920
921 batadv_iv_init();
922 + batadv_nc_init();
923
924 batadv_event_workqueue = create_singlethread_workqueue("bat_events");
925
926 @@ -138,7 +139,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
927 if (ret < 0)
928 goto err;
929
930 - ret = batadv_nc_init(bat_priv);
931 + ret = batadv_nc_mesh_init(bat_priv);
932 if (ret < 0)
933 goto err;
934
935 @@ -163,7 +164,7 @@ void batadv_mesh_free(struct net_device *soft_iface)
936 batadv_vis_quit(bat_priv);
937
938 batadv_gw_node_purge(bat_priv);
939 - batadv_nc_free(bat_priv);
940 + batadv_nc_mesh_free(bat_priv);
941 batadv_dat_free(bat_priv);
942 batadv_bla_free(bat_priv);
943
944 diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c
945 index e84629ece9b7..f97aeee2201c 100644
946 --- a/net/batman-adv/network-coding.c
947 +++ b/net/batman-adv/network-coding.c
948 @@ -35,6 +35,20 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb,
949 struct batadv_hard_iface *recv_if);
950
951 /**
952 + * batadv_nc_init - one-time initialization for network coding
953 + */
954 +int __init batadv_nc_init(void)
955 +{
956 + int ret;
957 +
958 + /* Register our packet type */
959 + ret = batadv_recv_handler_register(BATADV_CODED,
960 + batadv_nc_recv_coded_packet);
961 +
962 + return ret;
963 +}
964 +
965 +/**
966 * batadv_nc_start_timer - initialise the nc periodic worker
967 * @bat_priv: the bat priv with all the soft interface information
968 */
969 @@ -45,10 +59,10 @@ static void batadv_nc_start_timer(struct batadv_priv *bat_priv)
970 }
971
972 /**
973 - * batadv_nc_init - initialise coding hash table and start house keeping
974 + * batadv_nc_mesh_init - initialise coding hash table and start house keeping
975 * @bat_priv: the bat priv with all the soft interface information
976 */
977 -int batadv_nc_init(struct batadv_priv *bat_priv)
978 +int batadv_nc_mesh_init(struct batadv_priv *bat_priv)
979 {
980 bat_priv->nc.timestamp_fwd_flush = jiffies;
981 bat_priv->nc.timestamp_sniffed_purge = jiffies;
982 @@ -70,11 +84,6 @@ int batadv_nc_init(struct batadv_priv *bat_priv)
983 batadv_hash_set_lock_class(bat_priv->nc.coding_hash,
984 &batadv_nc_decoding_hash_lock_class_key);
985
986 - /* Register our packet type */
987 - if (batadv_recv_handler_register(BATADV_CODED,
988 - batadv_nc_recv_coded_packet) < 0)
989 - goto err;
990 -
991 INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker);
992 batadv_nc_start_timer(bat_priv);
993
994 @@ -1722,12 +1731,11 @@ free_nc_packet:
995 }
996
997 /**
998 - * batadv_nc_free - clean up network coding memory
999 + * batadv_nc_mesh_free - clean up network coding memory
1000 * @bat_priv: the bat priv with all the soft interface information
1001 */
1002 -void batadv_nc_free(struct batadv_priv *bat_priv)
1003 +void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
1004 {
1005 - batadv_recv_handler_unregister(BATADV_CODED);
1006 cancel_delayed_work_sync(&bat_priv->nc.work);
1007
1008 batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL);
1009 diff --git a/net/batman-adv/network-coding.h b/net/batman-adv/network-coding.h
1010 index 4fa6d0caddbd..bd4295fb960f 100644
1011 --- a/net/batman-adv/network-coding.h
1012 +++ b/net/batman-adv/network-coding.h
1013 @@ -22,8 +22,9 @@
1014
1015 #ifdef CONFIG_BATMAN_ADV_NC
1016
1017 -int batadv_nc_init(struct batadv_priv *bat_priv);
1018 -void batadv_nc_free(struct batadv_priv *bat_priv);
1019 +int batadv_nc_init(void);
1020 +int batadv_nc_mesh_init(struct batadv_priv *bat_priv);
1021 +void batadv_nc_mesh_free(struct batadv_priv *bat_priv);
1022 void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
1023 struct batadv_orig_node *orig_node,
1024 struct batadv_orig_node *orig_neigh_node,
1025 @@ -47,12 +48,17 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv);
1026
1027 #else /* ifdef CONFIG_BATMAN_ADV_NC */
1028
1029 -static inline int batadv_nc_init(struct batadv_priv *bat_priv)
1030 +static inline int batadv_nc_init(void)
1031 {
1032 return 0;
1033 }
1034
1035 -static inline void batadv_nc_free(struct batadv_priv *bat_priv)
1036 +static inline int batadv_nc_mesh_init(struct batadv_priv *bat_priv)
1037 +{
1038 + return 0;
1039 +}
1040 +
1041 +static inline void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
1042 {
1043 return;
1044 }
1045 diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
1046 index 44db78ae6a65..f97101b4d373 100644
1047 --- a/net/core/flow_dissector.c
1048 +++ b/net/core/flow_dissector.c
1049 @@ -40,7 +40,7 @@ again:
1050 struct iphdr _iph;
1051 ip:
1052 iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph);
1053 - if (!iph)
1054 + if (!iph || iph->ihl < 5)
1055 return false;
1056
1057 if (ip_is_fragment(iph))
1058 diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
1059 index c52fee0976da..64e4e98c8786 100644
1060 --- a/net/ipv4/ip_gre.c
1061 +++ b/net/ipv4/ip_gre.c
1062 @@ -335,7 +335,7 @@ static int ipgre_rcv(struct sk_buff *skb)
1063 iph->saddr, iph->daddr, tpi.key);
1064
1065 if (tunnel) {
1066 - ip_tunnel_rcv(tunnel, skb, &tpi, log_ecn_error);
1067 + ip_tunnel_rcv(tunnel, skb, &tpi, hdr_len, log_ecn_error);
1068 return 0;
1069 }
1070 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
1071 diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
1072 index 92d2f0f5d7bf..46dcf32c012e 100644
1073 --- a/net/ipv4/ip_tunnel.c
1074 +++ b/net/ipv4/ip_tunnel.c
1075 @@ -402,7 +402,7 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net,
1076 }
1077
1078 int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
1079 - const struct tnl_ptk_info *tpi, bool log_ecn_error)
1080 + const struct tnl_ptk_info *tpi, int hdr_len, bool log_ecn_error)
1081 {
1082 struct pcpu_tstats *tstats;
1083 const struct iphdr *iph = ip_hdr(skb);
1084 @@ -413,7 +413,7 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
1085 skb->protocol = tpi->proto;
1086
1087 skb->mac_header = skb->network_header;
1088 - __pskb_pull(skb, tunnel->hlen);
1089 + __pskb_pull(skb, hdr_len);
1090 skb_postpull_rcsum(skb, skb_transport_header(skb), tunnel->hlen);
1091 #ifdef CONFIG_NET_IPGRE_BROADCAST
1092 if (ipv4_is_multicast(iph->daddr)) {
1093 diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
1094 index 7cfc45624b6d..f5cc7b331511 100644
1095 --- a/net/ipv4/ipip.c
1096 +++ b/net/ipv4/ipip.c
1097 @@ -195,7 +195,7 @@ static int ipip_rcv(struct sk_buff *skb)
1098 if (tunnel) {
1099 if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
1100 goto drop;
1101 - return ip_tunnel_rcv(tunnel, skb, &tpi, log_ecn_error);
1102 + return ip_tunnel_rcv(tunnel, skb, &tpi, 0, log_ecn_error);
1103 }
1104
1105 return -1;
1106 diff --git a/net/ipv6/route.c b/net/ipv6/route.c
1107 index 3c1f493ccc63..548a1f7c1a29 100644
1108 --- a/net/ipv6/route.c
1109 +++ b/net/ipv6/route.c
1110 @@ -1084,10 +1084,13 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
1111 if (rt->rt6i_genid != rt_genid(dev_net(rt->dst.dev)))
1112 return NULL;
1113
1114 - if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie))
1115 - return dst;
1116 + if (!rt->rt6i_node || (rt->rt6i_node->fn_sernum != cookie))
1117 + return NULL;
1118
1119 - return NULL;
1120 + if (rt6_check_expired(rt))
1121 + return NULL;
1122 +
1123 + return dst;
1124 }
1125
1126 static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
1127 diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
1128 index aecf088f40af..b93799201578 100644
1129 --- a/sound/pci/hda/patch_hdmi.c
1130 +++ b/sound/pci/hda/patch_hdmi.c
1131 @@ -738,9 +738,10 @@ static int hdmi_manual_setup_channel_mapping(struct hda_codec *codec,
1132 static void hdmi_setup_fake_chmap(unsigned char *map, int ca)
1133 {
1134 int i;
1135 + int ordered_ca = get_channel_allocation_order(ca);
1136 for (i = 0; i < 8; i++) {
1137 - if (i < channel_allocations[ca].channels)
1138 - map[i] = from_cea_slot((hdmi_channel_mapping[ca][i] >> 4) & 0x0f);
1139 + if (i < channel_allocations[ordered_ca].channels)
1140 + map[i] = from_cea_slot(hdmi_channel_mapping[ca][i] & 0x0f);
1141 else
1142 map[i] = 0;
1143 }