Annotation of /trunk/kernel-alx/patches-4.9/0263-4.9.164-all-fixes.patch
Parent Directory | Revision Log
Revision 3340 -
(hide annotations)
(download)
Tue Jun 18 09:41:54 2019 UTC (5 years, 3 months ago) by niro
File size: 28153 byte(s)
Tue Jun 18 09:41:54 2019 UTC (5 years, 3 months ago) by niro
File size: 28153 byte(s)
-linux-4.9.164
1 | niro | 3340 | diff --git a/Makefile b/Makefile |
2 | index 8a5330e279ad..e1bcc76388dc 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 9 | ||
8 | -SUBLEVEL = 163 | ||
9 | +SUBLEVEL = 164 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Roaring Lionus | ||
12 | |||
13 | diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h | ||
14 | index 1ce6ae35f6a2..c42c9d50c8ee 100644 | ||
15 | --- a/arch/x86/events/perf_event.h | ||
16 | +++ b/arch/x86/events/perf_event.h | ||
17 | @@ -996,12 +996,12 @@ static inline int intel_pmu_init(void) | ||
18 | return 0; | ||
19 | } | ||
20 | |||
21 | -static inline int intel_cpuc_prepare(struct cpu_hw_event *cpuc, int cpu) | ||
22 | +static inline int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu) | ||
23 | { | ||
24 | return 0; | ||
25 | } | ||
26 | |||
27 | -static inline void intel_cpuc_finish(struct cpu_hw_event *cpuc) | ||
28 | +static inline void intel_cpuc_finish(struct cpu_hw_events *cpuc) | ||
29 | { | ||
30 | } | ||
31 | |||
32 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
33 | index b62e6ab66b31..67414616eb35 100644 | ||
34 | --- a/drivers/md/raid10.c | ||
35 | +++ b/drivers/md/raid10.c | ||
36 | @@ -4489,7 +4489,6 @@ bio_full: | ||
37 | atomic_inc(&r10_bio->remaining); | ||
38 | read_bio->bi_next = NULL; | ||
39 | generic_make_request(read_bio); | ||
40 | - sector_nr += nr_sectors; | ||
41 | sectors_done += nr_sectors; | ||
42 | if (sector_nr <= last) | ||
43 | goto read_more; | ||
44 | diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c | ||
45 | index 700567603107..0fc1f73b0d23 100644 | ||
46 | --- a/drivers/mmc/host/tmio_mmc_pio.c | ||
47 | +++ b/drivers/mmc/host/tmio_mmc_pio.c | ||
48 | @@ -675,7 +675,7 @@ static bool __tmio_mmc_sdcard_irq(struct tmio_mmc_host *host, | ||
49 | return false; | ||
50 | } | ||
51 | |||
52 | -static void tmio_mmc_sdio_irq(int irq, void *devid) | ||
53 | +static bool tmio_mmc_sdio_irq(int irq, void *devid) | ||
54 | { | ||
55 | struct tmio_mmc_host *host = devid; | ||
56 | struct mmc_host *mmc = host->mmc; | ||
57 | @@ -684,7 +684,7 @@ static void tmio_mmc_sdio_irq(int irq, void *devid) | ||
58 | unsigned int sdio_status; | ||
59 | |||
60 | if (!(pdata->flags & TMIO_MMC_SDIO_IRQ)) | ||
61 | - return; | ||
62 | + return false; | ||
63 | |||
64 | status = sd_ctrl_read16(host, CTL_SDIO_STATUS); | ||
65 | ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdcard_irq_mask; | ||
66 | @@ -697,6 +697,8 @@ static void tmio_mmc_sdio_irq(int irq, void *devid) | ||
67 | |||
68 | if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ) | ||
69 | mmc_signal_sdio_irq(mmc); | ||
70 | + | ||
71 | + return ireg; | ||
72 | } | ||
73 | |||
74 | irqreturn_t tmio_mmc_irq(int irq, void *devid) | ||
75 | @@ -718,9 +720,10 @@ irqreturn_t tmio_mmc_irq(int irq, void *devid) | ||
76 | if (__tmio_mmc_sdcard_irq(host, ireg, status)) | ||
77 | return IRQ_HANDLED; | ||
78 | |||
79 | - tmio_mmc_sdio_irq(irq, devid); | ||
80 | + if (tmio_mmc_sdio_irq(irq, devid)) | ||
81 | + return IRQ_HANDLED; | ||
82 | |||
83 | - return IRQ_HANDLED; | ||
84 | + return IRQ_NONE; | ||
85 | } | ||
86 | EXPORT_SYMBOL(tmio_mmc_irq); | ||
87 | |||
88 | diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
89 | index dae9dcfa8f36..e5283387097f 100644 | ||
90 | --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
91 | +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
92 | @@ -2633,6 +2633,8 @@ int mlx4_cmd_use_events(struct mlx4_dev *dev) | ||
93 | if (!priv->cmd.context) | ||
94 | return -ENOMEM; | ||
95 | |||
96 | + if (mlx4_is_mfunc(dev)) | ||
97 | + mutex_lock(&priv->cmd.slave_cmd_mutex); | ||
98 | down_write(&priv->cmd.switch_sem); | ||
99 | for (i = 0; i < priv->cmd.max_cmds; ++i) { | ||
100 | priv->cmd.context[i].token = i; | ||
101 | @@ -2658,6 +2660,8 @@ int mlx4_cmd_use_events(struct mlx4_dev *dev) | ||
102 | down(&priv->cmd.poll_sem); | ||
103 | priv->cmd.use_events = 1; | ||
104 | up_write(&priv->cmd.switch_sem); | ||
105 | + if (mlx4_is_mfunc(dev)) | ||
106 | + mutex_unlock(&priv->cmd.slave_cmd_mutex); | ||
107 | |||
108 | return err; | ||
109 | } | ||
110 | @@ -2670,6 +2674,8 @@ void mlx4_cmd_use_polling(struct mlx4_dev *dev) | ||
111 | struct mlx4_priv *priv = mlx4_priv(dev); | ||
112 | int i; | ||
113 | |||
114 | + if (mlx4_is_mfunc(dev)) | ||
115 | + mutex_lock(&priv->cmd.slave_cmd_mutex); | ||
116 | down_write(&priv->cmd.switch_sem); | ||
117 | priv->cmd.use_events = 0; | ||
118 | |||
119 | @@ -2677,9 +2683,12 @@ void mlx4_cmd_use_polling(struct mlx4_dev *dev) | ||
120 | down(&priv->cmd.event_sem); | ||
121 | |||
122 | kfree(priv->cmd.context); | ||
123 | + priv->cmd.context = NULL; | ||
124 | |||
125 | up(&priv->cmd.poll_sem); | ||
126 | up_write(&priv->cmd.switch_sem); | ||
127 | + if (mlx4_is_mfunc(dev)) | ||
128 | + mutex_unlock(&priv->cmd.slave_cmd_mutex); | ||
129 | } | ||
130 | |||
131 | struct mlx4_cmd_mailbox *mlx4_alloc_cmd_mailbox(struct mlx4_dev *dev) | ||
132 | diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | ||
133 | index 9d1a7d5ae835..79944302dd46 100644 | ||
134 | --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | ||
135 | +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | ||
136 | @@ -2677,13 +2677,13 @@ static int qp_get_mtt_size(struct mlx4_qp_context *qpc) | ||
137 | int total_pages; | ||
138 | int total_mem; | ||
139 | int page_offset = (be32_to_cpu(qpc->params2) >> 6) & 0x3f; | ||
140 | + int tot; | ||
141 | |||
142 | sq_size = 1 << (log_sq_size + log_sq_sride + 4); | ||
143 | rq_size = (srq|rss|xrc) ? 0 : (1 << (log_rq_size + log_rq_stride + 4)); | ||
144 | total_mem = sq_size + rq_size; | ||
145 | - total_pages = | ||
146 | - roundup_pow_of_two((total_mem + (page_offset << 6)) >> | ||
147 | - page_shift); | ||
148 | + tot = (total_mem + (page_offset << 6)) >> page_shift; | ||
149 | + total_pages = !tot ? 1 : roundup_pow_of_two(tot); | ||
150 | |||
151 | return total_pages; | ||
152 | } | ||
153 | diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c | ||
154 | index 71836a7f56b0..480883a7a3e5 100644 | ||
155 | --- a/drivers/net/ethernet/renesas/ravb_main.c | ||
156 | +++ b/drivers/net/ethernet/renesas/ravb_main.c | ||
157 | @@ -457,7 +457,7 @@ static int ravb_dmac_init(struct net_device *ndev) | ||
158 | RCR_EFFS | RCR_ENCF | RCR_ETS0 | RCR_ESF | 0x18000000, RCR); | ||
159 | |||
160 | /* Set FIFO size */ | ||
161 | - ravb_write(ndev, TGC_TQP_AVBMODE1 | 0x00222200, TGC); | ||
162 | + ravb_write(ndev, TGC_TQP_AVBMODE1 | 0x00112200, TGC); | ||
163 | |||
164 | /* Timestamp enable */ | ||
165 | ravb_write(ndev, TCCR_TFEN, TCCR); | ||
166 | diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c | ||
167 | index 4a2609c4dd6e..72fb55ca27f3 100644 | ||
168 | --- a/drivers/net/ipvlan/ipvlan_main.c | ||
169 | +++ b/drivers/net/ipvlan/ipvlan_main.c | ||
170 | @@ -463,7 +463,12 @@ static int ipvlan_nl_changelink(struct net_device *dev, | ||
171 | struct ipvl_port *port = ipvlan_port_get_rtnl(ipvlan->phy_dev); | ||
172 | int err = 0; | ||
173 | |||
174 | - if (data && data[IFLA_IPVLAN_MODE]) { | ||
175 | + if (!data) | ||
176 | + return 0; | ||
177 | + if (!ns_capable(dev_net(ipvlan->phy_dev)->user_ns, CAP_NET_ADMIN)) | ||
178 | + return -EPERM; | ||
179 | + | ||
180 | + if (data[IFLA_IPVLAN_MODE]) { | ||
181 | u16 nmode = nla_get_u16(data[IFLA_IPVLAN_MODE]); | ||
182 | |||
183 | err = ipvlan_set_port_mode(port, nmode); | ||
184 | @@ -530,6 +535,8 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev, | ||
185 | struct ipvl_dev *tmp = netdev_priv(phy_dev); | ||
186 | |||
187 | phy_dev = tmp->phy_dev; | ||
188 | + if (!ns_capable(dev_net(phy_dev)->user_ns, CAP_NET_ADMIN)) | ||
189 | + return -EPERM; | ||
190 | } else if (!netif_is_ipvlan_port(phy_dev)) { | ||
191 | err = ipvlan_port_create(phy_dev); | ||
192 | if (err < 0) | ||
193 | diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c | ||
194 | index 09deef4bed09..a9bbdcec0bad 100644 | ||
195 | --- a/drivers/net/phy/mdio_bus.c | ||
196 | +++ b/drivers/net/phy/mdio_bus.c | ||
197 | @@ -319,7 +319,6 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner) | ||
198 | err = device_register(&bus->dev); | ||
199 | if (err) { | ||
200 | pr_err("mii_bus %s failed to register\n", bus->id); | ||
201 | - put_device(&bus->dev); | ||
202 | return -EINVAL; | ||
203 | } | ||
204 | |||
205 | diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c | ||
206 | index 3045c9662ed6..5a8befdfa5e4 100644 | ||
207 | --- a/drivers/net/ppp/pptp.c | ||
208 | +++ b/drivers/net/ppp/pptp.c | ||
209 | @@ -541,6 +541,7 @@ static void pptp_sock_destruct(struct sock *sk) | ||
210 | pppox_unbind_sock(sk); | ||
211 | } | ||
212 | skb_queue_purge(&sk->sk_receive_queue); | ||
213 | + dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1)); | ||
214 | } | ||
215 | |||
216 | static int pptp_create(struct net *net, struct socket *sock, int kern) | ||
217 | diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c | ||
218 | index 373713faa1f5..016f5da425ab 100644 | ||
219 | --- a/drivers/net/vxlan.c | ||
220 | +++ b/drivers/net/vxlan.c | ||
221 | @@ -1380,6 +1380,14 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb) | ||
222 | goto drop; | ||
223 | } | ||
224 | |||
225 | + rcu_read_lock(); | ||
226 | + | ||
227 | + if (unlikely(!(vxlan->dev->flags & IFF_UP))) { | ||
228 | + rcu_read_unlock(); | ||
229 | + atomic_long_inc(&vxlan->dev->rx_dropped); | ||
230 | + goto drop; | ||
231 | + } | ||
232 | + | ||
233 | stats = this_cpu_ptr(vxlan->dev->tstats); | ||
234 | u64_stats_update_begin(&stats->syncp); | ||
235 | stats->rx_packets++; | ||
236 | @@ -1387,6 +1395,9 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb) | ||
237 | u64_stats_update_end(&stats->syncp); | ||
238 | |||
239 | gro_cells_receive(&vxlan->gro_cells, skb); | ||
240 | + | ||
241 | + rcu_read_unlock(); | ||
242 | + | ||
243 | return 0; | ||
244 | |||
245 | drop: | ||
246 | @@ -2362,6 +2373,8 @@ static void vxlan_uninit(struct net_device *dev) | ||
247 | { | ||
248 | struct vxlan_dev *vxlan = netdev_priv(dev); | ||
249 | |||
250 | + gro_cells_destroy(&vxlan->gro_cells); | ||
251 | + | ||
252 | vxlan_fdb_delete_default(vxlan); | ||
253 | |||
254 | free_percpu(dev->tstats); | ||
255 | @@ -3112,7 +3125,6 @@ static void vxlan_dellink(struct net_device *dev, struct list_head *head) | ||
256 | { | ||
257 | struct vxlan_dev *vxlan = netdev_priv(dev); | ||
258 | |||
259 | - gro_cells_destroy(&vxlan->gro_cells); | ||
260 | list_del(&vxlan->next); | ||
261 | unregister_netdevice_queue(dev, head); | ||
262 | } | ||
263 | diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c | ||
264 | index 72e914de473e..3cefd602b5b1 100644 | ||
265 | --- a/drivers/vhost/vsock.c | ||
266 | +++ b/drivers/vhost/vsock.c | ||
267 | @@ -640,7 +640,7 @@ static int vhost_vsock_set_cid(struct vhost_vsock *vsock, u64 guest_cid) | ||
268 | hash_del_rcu(&vsock->hash); | ||
269 | |||
270 | vsock->guest_cid = guest_cid; | ||
271 | - hash_add_rcu(vhost_vsock_hash, &vsock->hash, guest_cid); | ||
272 | + hash_add_rcu(vhost_vsock_hash, &vsock->hash, vsock->guest_cid); | ||
273 | spin_unlock_bh(&vhost_vsock_lock); | ||
274 | |||
275 | return 0; | ||
276 | diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h | ||
277 | index 12c2882bf647..eef069616a2f 100644 | ||
278 | --- a/include/acpi/acconfig.h | ||
279 | +++ b/include/acpi/acconfig.h | ||
280 | @@ -122,7 +122,7 @@ | ||
281 | |||
282 | /* Maximum object reference count (detects object deletion issues) */ | ||
283 | |||
284 | -#define ACPI_MAX_REFERENCE_COUNT 0x1000 | ||
285 | +#define ACPI_MAX_REFERENCE_COUNT 0x4000 | ||
286 | |||
287 | /* Default page size for use in mapping memory for operation regions */ | ||
288 | |||
289 | diff --git a/include/linux/of.h b/include/linux/of.h | ||
290 | index a19cc85b9373..aac3f09c5d90 100644 | ||
291 | --- a/include/linux/of.h | ||
292 | +++ b/include/linux/of.h | ||
293 | @@ -148,16 +148,20 @@ extern raw_spinlock_t devtree_lock; | ||
294 | #ifdef CONFIG_OF | ||
295 | void of_core_init(void); | ||
296 | |||
297 | -static inline bool is_of_node(struct fwnode_handle *fwnode) | ||
298 | +static inline bool is_of_node(const struct fwnode_handle *fwnode) | ||
299 | { | ||
300 | return !IS_ERR_OR_NULL(fwnode) && fwnode->type == FWNODE_OF; | ||
301 | } | ||
302 | |||
303 | -static inline struct device_node *to_of_node(struct fwnode_handle *fwnode) | ||
304 | -{ | ||
305 | - return is_of_node(fwnode) ? | ||
306 | - container_of(fwnode, struct device_node, fwnode) : NULL; | ||
307 | -} | ||
308 | +#define to_of_node(__fwnode) \ | ||
309 | + ({ \ | ||
310 | + typeof(__fwnode) __to_of_node_fwnode = (__fwnode); \ | ||
311 | + \ | ||
312 | + is_of_node(__to_of_node_fwnode) ? \ | ||
313 | + container_of(__to_of_node_fwnode, \ | ||
314 | + struct device_node, fwnode) : \ | ||
315 | + NULL; \ | ||
316 | + }) | ||
317 | |||
318 | static inline bool of_have_populated_dt(void) | ||
319 | { | ||
320 | @@ -529,12 +533,12 @@ static inline void of_core_init(void) | ||
321 | { | ||
322 | } | ||
323 | |||
324 | -static inline bool is_of_node(struct fwnode_handle *fwnode) | ||
325 | +static inline bool is_of_node(const struct fwnode_handle *fwnode) | ||
326 | { | ||
327 | return false; | ||
328 | } | ||
329 | |||
330 | -static inline struct device_node *to_of_node(struct fwnode_handle *fwnode) | ||
331 | +static inline struct device_node *to_of_node(const struct fwnode_handle *fwnode) | ||
332 | { | ||
333 | return NULL; | ||
334 | } | ||
335 | diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h | ||
336 | index 95f33eeee984..6db0e8534127 100644 | ||
337 | --- a/include/net/gro_cells.h | ||
338 | +++ b/include/net/gro_cells.h | ||
339 | @@ -18,22 +18,36 @@ static inline int gro_cells_receive(struct gro_cells *gcells, struct sk_buff *sk | ||
340 | { | ||
341 | struct gro_cell *cell; | ||
342 | struct net_device *dev = skb->dev; | ||
343 | + int res; | ||
344 | |||
345 | - if (!gcells->cells || skb_cloned(skb) || !(dev->features & NETIF_F_GRO)) | ||
346 | - return netif_rx(skb); | ||
347 | + rcu_read_lock(); | ||
348 | + if (unlikely(!(dev->flags & IFF_UP))) | ||
349 | + goto drop; | ||
350 | + | ||
351 | + if (!gcells->cells || skb_cloned(skb) || !(dev->features & NETIF_F_GRO)) { | ||
352 | + res = netif_rx(skb); | ||
353 | + goto unlock; | ||
354 | + } | ||
355 | |||
356 | cell = this_cpu_ptr(gcells->cells); | ||
357 | |||
358 | if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) { | ||
359 | +drop: | ||
360 | atomic_long_inc(&dev->rx_dropped); | ||
361 | kfree_skb(skb); | ||
362 | - return NET_RX_DROP; | ||
363 | + res = NET_RX_DROP; | ||
364 | + goto unlock; | ||
365 | } | ||
366 | |||
367 | __skb_queue_tail(&cell->napi_skbs, skb); | ||
368 | if (skb_queue_len(&cell->napi_skbs) == 1) | ||
369 | napi_schedule(&cell->napi); | ||
370 | - return NET_RX_SUCCESS; | ||
371 | + | ||
372 | + res = NET_RX_SUCCESS; | ||
373 | + | ||
374 | +unlock: | ||
375 | + rcu_read_unlock(); | ||
376 | + return res; | ||
377 | } | ||
378 | |||
379 | /* called under BH context */ | ||
380 | diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c | ||
381 | index 16737cd8dae8..52694cb759b0 100644 | ||
382 | --- a/net/hsr/hsr_device.c | ||
383 | +++ b/net/hsr/hsr_device.c | ||
384 | @@ -94,9 +94,8 @@ static void hsr_check_announce(struct net_device *hsr_dev, | ||
385 | && (old_operstate != IF_OPER_UP)) { | ||
386 | /* Went up */ | ||
387 | hsr->announce_count = 0; | ||
388 | - hsr->announce_timer.expires = jiffies + | ||
389 | - msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL); | ||
390 | - add_timer(&hsr->announce_timer); | ||
391 | + mod_timer(&hsr->announce_timer, | ||
392 | + jiffies + msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL)); | ||
393 | } | ||
394 | |||
395 | if ((hsr_dev->operstate != IF_OPER_UP) && (old_operstate == IF_OPER_UP)) | ||
396 | @@ -331,6 +330,7 @@ static void hsr_announce(unsigned long data) | ||
397 | { | ||
398 | struct hsr_priv *hsr; | ||
399 | struct hsr_port *master; | ||
400 | + unsigned long interval; | ||
401 | |||
402 | hsr = (struct hsr_priv *) data; | ||
403 | |||
404 | @@ -342,18 +342,16 @@ static void hsr_announce(unsigned long data) | ||
405 | hsr->protVersion); | ||
406 | hsr->announce_count++; | ||
407 | |||
408 | - hsr->announce_timer.expires = jiffies + | ||
409 | - msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL); | ||
410 | + interval = msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL); | ||
411 | } else { | ||
412 | send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK, | ||
413 | hsr->protVersion); | ||
414 | |||
415 | - hsr->announce_timer.expires = jiffies + | ||
416 | - msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL); | ||
417 | + interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL); | ||
418 | } | ||
419 | |||
420 | if (is_admin_up(master->dev)) | ||
421 | - add_timer(&hsr->announce_timer); | ||
422 | + mod_timer(&hsr->announce_timer, jiffies + interval); | ||
423 | |||
424 | rcu_read_unlock(); | ||
425 | } | ||
426 | @@ -485,7 +483,7 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], | ||
427 | |||
428 | res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER); | ||
429 | if (res) | ||
430 | - return res; | ||
431 | + goto err_add_port; | ||
432 | |||
433 | res = register_netdevice(hsr_dev); | ||
434 | if (res) | ||
435 | @@ -505,6 +503,8 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2], | ||
436 | fail: | ||
437 | hsr_for_each_port(hsr, port) | ||
438 | hsr_del_port(port); | ||
439 | +err_add_port: | ||
440 | + hsr_del_node(&hsr->self_node_db); | ||
441 | |||
442 | return res; | ||
443 | } | ||
444 | diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c | ||
445 | index 284a9b820df8..6705420b3111 100644 | ||
446 | --- a/net/hsr/hsr_framereg.c | ||
447 | +++ b/net/hsr/hsr_framereg.c | ||
448 | @@ -124,6 +124,18 @@ int hsr_create_self_node(struct list_head *self_node_db, | ||
449 | return 0; | ||
450 | } | ||
451 | |||
452 | +void hsr_del_node(struct list_head *self_node_db) | ||
453 | +{ | ||
454 | + struct hsr_node *node; | ||
455 | + | ||
456 | + rcu_read_lock(); | ||
457 | + node = list_first_or_null_rcu(self_node_db, struct hsr_node, mac_list); | ||
458 | + rcu_read_unlock(); | ||
459 | + if (node) { | ||
460 | + list_del_rcu(&node->mac_list); | ||
461 | + kfree(node); | ||
462 | + } | ||
463 | +} | ||
464 | |||
465 | /* Allocate an hsr_node and add it to node_db. 'addr' is the node's AddressA; | ||
466 | * seq_out is used to initialize filtering of outgoing duplicate frames | ||
467 | diff --git a/net/hsr/hsr_framereg.h b/net/hsr/hsr_framereg.h | ||
468 | index 4e04f0e868e9..43958a338095 100644 | ||
469 | --- a/net/hsr/hsr_framereg.h | ||
470 | +++ b/net/hsr/hsr_framereg.h | ||
471 | @@ -16,6 +16,7 @@ | ||
472 | |||
473 | struct hsr_node; | ||
474 | |||
475 | +void hsr_del_node(struct list_head *self_node_db); | ||
476 | struct hsr_node *hsr_add_node(struct list_head *node_db, unsigned char addr[], | ||
477 | u16 seq_out); | ||
478 | struct hsr_node *hsr_get_node(struct hsr_port *port, struct sk_buff *skb, | ||
479 | diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c | ||
480 | index 528a6777cda0..1bcbb7399fe6 100644 | ||
481 | --- a/net/ipv4/inet_connection_sock.c | ||
482 | +++ b/net/ipv4/inet_connection_sock.c | ||
483 | @@ -790,7 +790,6 @@ static void inet_child_forget(struct sock *sk, struct request_sock *req, | ||
484 | tcp_sk(child)->fastopen_rsk = NULL; | ||
485 | } | ||
486 | inet_csk_destroy_sock(child); | ||
487 | - reqsk_put(req); | ||
488 | } | ||
489 | |||
490 | struct sock *inet_csk_reqsk_queue_add(struct sock *sk, | ||
491 | @@ -861,6 +860,7 @@ void inet_csk_listen_stop(struct sock *sk) | ||
492 | sock_hold(child); | ||
493 | |||
494 | inet_child_forget(sk, req, child); | ||
495 | + reqsk_put(req); | ||
496 | bh_unlock_sock(child); | ||
497 | local_bh_enable(); | ||
498 | sock_put(child); | ||
499 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c | ||
500 | index d606de65e2d0..c42fb2330b45 100644 | ||
501 | --- a/net/ipv4/route.c | ||
502 | +++ b/net/ipv4/route.c | ||
503 | @@ -1613,6 +1613,10 @@ static void ip_del_fnhe(struct fib_nh *nh, __be32 daddr) | ||
504 | if (fnhe->fnhe_daddr == daddr) { | ||
505 | rcu_assign_pointer(*fnhe_p, rcu_dereference_protected( | ||
506 | fnhe->fnhe_next, lockdep_is_held(&fnhe_lock))); | ||
507 | + /* set fnhe_daddr to 0 to ensure it won't bind with | ||
508 | + * new dsts in rt_bind_exception(). | ||
509 | + */ | ||
510 | + fnhe->fnhe_daddr = 0; | ||
511 | fnhe_flush_routes(fnhe); | ||
512 | kfree_rcu(fnhe, rcu); | ||
513 | break; | ||
514 | diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c | ||
515 | index 0597ad73a1fa..b596c413d297 100644 | ||
516 | --- a/net/ipv4/syncookies.c | ||
517 | +++ b/net/ipv4/syncookies.c | ||
518 | @@ -225,7 +225,12 @@ struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb, | ||
519 | if (child) { | ||
520 | atomic_set(&req->rsk_refcnt, 1); | ||
521 | sock_rps_save_rxhash(child, skb); | ||
522 | - inet_csk_reqsk_queue_add(sk, req, child); | ||
523 | + if (!inet_csk_reqsk_queue_add(sk, req, child)) { | ||
524 | + bh_unlock_sock(child); | ||
525 | + sock_put(child); | ||
526 | + child = NULL; | ||
527 | + reqsk_put(req); | ||
528 | + } | ||
529 | } else { | ||
530 | reqsk_free(req); | ||
531 | } | ||
532 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
533 | index dbb153c6b21a..48fe63c4fe24 100644 | ||
534 | --- a/net/ipv4/tcp_input.c | ||
535 | +++ b/net/ipv4/tcp_input.c | ||
536 | @@ -6479,7 +6479,13 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, | ||
537 | af_ops->send_synack(fastopen_sk, dst, &fl, req, | ||
538 | &foc, TCP_SYNACK_FASTOPEN); | ||
539 | /* Add the child socket directly into the accept queue */ | ||
540 | - inet_csk_reqsk_queue_add(sk, req, fastopen_sk); | ||
541 | + if (!inet_csk_reqsk_queue_add(sk, req, fastopen_sk)) { | ||
542 | + reqsk_fastopen_remove(fastopen_sk, req, false); | ||
543 | + bh_unlock_sock(fastopen_sk); | ||
544 | + sock_put(fastopen_sk); | ||
545 | + reqsk_put(req); | ||
546 | + goto drop; | ||
547 | + } | ||
548 | sk->sk_data_ready(sk); | ||
549 | bh_unlock_sock(fastopen_sk); | ||
550 | sock_put(fastopen_sk); | ||
551 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
552 | index b0a72677b7e5..27c93baed708 100644 | ||
553 | --- a/net/ipv6/route.c | ||
554 | +++ b/net/ipv6/route.c | ||
555 | @@ -3211,7 +3211,7 @@ static int rt6_fill_node(struct net *net, | ||
556 | table = rt->rt6i_table->tb6_id; | ||
557 | else | ||
558 | table = RT6_TABLE_UNSPEC; | ||
559 | - rtm->rtm_table = table; | ||
560 | + rtm->rtm_table = table < 256 ? table : RT_TABLE_COMPAT; | ||
561 | if (nla_put_u32(skb, RTA_TABLE, table)) | ||
562 | goto nla_put_failure; | ||
563 | if (rt->rt6i_flags & RTF_REJECT) { | ||
564 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
565 | index 75de3dd8b862..c9c6a5e829ab 100644 | ||
566 | --- a/net/ipv6/sit.c | ||
567 | +++ b/net/ipv6/sit.c | ||
568 | @@ -767,8 +767,9 @@ static bool check_6rd(struct ip_tunnel *tunnel, const struct in6_addr *v6dst, | ||
569 | pbw0 = tunnel->ip6rd.prefixlen >> 5; | ||
570 | pbi0 = tunnel->ip6rd.prefixlen & 0x1f; | ||
571 | |||
572 | - d = (ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >> | ||
573 | - tunnel->ip6rd.relay_prefixlen; | ||
574 | + d = tunnel->ip6rd.relay_prefixlen < 32 ? | ||
575 | + (ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >> | ||
576 | + tunnel->ip6rd.relay_prefixlen : 0; | ||
577 | |||
578 | pbi1 = pbi0 - tunnel->ip6rd.relay_prefixlen; | ||
579 | if (pbi1 > 0) | ||
580 | diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c | ||
581 | index 5e6d09863480..8d412b9b0214 100644 | ||
582 | --- a/net/l2tp/l2tp_ip6.c | ||
583 | +++ b/net/l2tp/l2tp_ip6.c | ||
584 | @@ -680,9 +680,6 @@ static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, | ||
585 | if (flags & MSG_OOB) | ||
586 | goto out; | ||
587 | |||
588 | - if (addr_len) | ||
589 | - *addr_len = sizeof(*lsa); | ||
590 | - | ||
591 | if (flags & MSG_ERRQUEUE) | ||
592 | return ipv6_recv_error(sk, msg, len, addr_len); | ||
593 | |||
594 | @@ -712,6 +709,7 @@ static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, | ||
595 | lsa->l2tp_conn_id = 0; | ||
596 | if (ipv6_addr_type(&lsa->l2tp_addr) & IPV6_ADDR_LINKLOCAL) | ||
597 | lsa->l2tp_scope_id = inet6_iif(skb); | ||
598 | + *addr_len = sizeof(*lsa); | ||
599 | } | ||
600 | |||
601 | if (np->rxopt.all) | ||
602 | diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c | ||
603 | index 60ef9605167e..0fce919bf47d 100644 | ||
604 | --- a/net/rxrpc/conn_client.c | ||
605 | +++ b/net/rxrpc/conn_client.c | ||
606 | @@ -355,7 +355,7 @@ static int rxrpc_get_client_conn(struct rxrpc_call *call, | ||
607 | * normally have to take channel_lock but we do this before anyone else | ||
608 | * can see the connection. | ||
609 | */ | ||
610 | - list_add_tail(&call->chan_wait_link, &candidate->waiting_calls); | ||
611 | + list_add(&call->chan_wait_link, &candidate->waiting_calls); | ||
612 | |||
613 | if (cp->exclusive) { | ||
614 | call->conn = candidate; | ||
615 | @@ -430,7 +430,7 @@ found_extant_conn: | ||
616 | spin_lock(&conn->channel_lock); | ||
617 | call->conn = conn; | ||
618 | call->security_ix = conn->security_ix; | ||
619 | - list_add(&call->chan_wait_link, &conn->waiting_calls); | ||
620 | + list_add_tail(&call->chan_wait_link, &conn->waiting_calls); | ||
621 | spin_unlock(&conn->channel_lock); | ||
622 | _leave(" = 0 [extant %d]", conn->debug_id); | ||
623 | return 0; | ||
624 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c | ||
625 | index 915abe98174e..cecf51a5aec4 100644 | ||
626 | --- a/net/unix/af_unix.c | ||
627 | +++ b/net/unix/af_unix.c | ||
628 | @@ -891,7 +891,7 @@ retry: | ||
629 | addr->hash ^= sk->sk_type; | ||
630 | |||
631 | __unix_remove_socket(sk); | ||
632 | - u->addr = addr; | ||
633 | + smp_store_release(&u->addr, addr); | ||
634 | __unix_insert_socket(&unix_socket_table[addr->hash], sk); | ||
635 | spin_unlock(&unix_table_lock); | ||
636 | err = 0; | ||
637 | @@ -1061,7 +1061,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
638 | |||
639 | err = 0; | ||
640 | __unix_remove_socket(sk); | ||
641 | - u->addr = addr; | ||
642 | + smp_store_release(&u->addr, addr); | ||
643 | __unix_insert_socket(list, sk); | ||
644 | |||
645 | out_unlock: | ||
646 | @@ -1332,15 +1332,29 @@ restart: | ||
647 | RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq); | ||
648 | otheru = unix_sk(other); | ||
649 | |||
650 | - /* copy address information from listening to new sock*/ | ||
651 | - if (otheru->addr) { | ||
652 | - atomic_inc(&otheru->addr->refcnt); | ||
653 | - newu->addr = otheru->addr; | ||
654 | - } | ||
655 | + /* copy address information from listening to new sock | ||
656 | + * | ||
657 | + * The contents of *(otheru->addr) and otheru->path | ||
658 | + * are seen fully set up here, since we have found | ||
659 | + * otheru in hash under unix_table_lock. Insertion | ||
660 | + * into the hash chain we'd found it in had been done | ||
661 | + * in an earlier critical area protected by unix_table_lock, | ||
662 | + * the same one where we'd set *(otheru->addr) contents, | ||
663 | + * as well as otheru->path and otheru->addr itself. | ||
664 | + * | ||
665 | + * Using smp_store_release() here to set newu->addr | ||
666 | + * is enough to make those stores, as well as stores | ||
667 | + * to newu->path visible to anyone who gets newu->addr | ||
668 | + * by smp_load_acquire(). IOW, the same warranties | ||
669 | + * as for unix_sock instances bound in unix_bind() or | ||
670 | + * in unix_autobind(). | ||
671 | + */ | ||
672 | if (otheru->path.dentry) { | ||
673 | path_get(&otheru->path); | ||
674 | newu->path = otheru->path; | ||
675 | } | ||
676 | + atomic_inc(&otheru->addr->refcnt); | ||
677 | + smp_store_release(&newu->addr, otheru->addr); | ||
678 | |||
679 | /* Set credentials */ | ||
680 | copy_peercred(sk, other); | ||
681 | @@ -1453,7 +1467,7 @@ out: | ||
682 | static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer) | ||
683 | { | ||
684 | struct sock *sk = sock->sk; | ||
685 | - struct unix_sock *u; | ||
686 | + struct unix_address *addr; | ||
687 | DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, uaddr); | ||
688 | int err = 0; | ||
689 | |||
690 | @@ -1468,19 +1482,15 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_ | ||
691 | sock_hold(sk); | ||
692 | } | ||
693 | |||
694 | - u = unix_sk(sk); | ||
695 | - unix_state_lock(sk); | ||
696 | - if (!u->addr) { | ||
697 | + addr = smp_load_acquire(&unix_sk(sk)->addr); | ||
698 | + if (!addr) { | ||
699 | sunaddr->sun_family = AF_UNIX; | ||
700 | sunaddr->sun_path[0] = 0; | ||
701 | *uaddr_len = sizeof(short); | ||
702 | } else { | ||
703 | - struct unix_address *addr = u->addr; | ||
704 | - | ||
705 | *uaddr_len = addr->len; | ||
706 | memcpy(sunaddr, addr->name, *uaddr_len); | ||
707 | } | ||
708 | - unix_state_unlock(sk); | ||
709 | sock_put(sk); | ||
710 | out: | ||
711 | return err; | ||
712 | @@ -2094,11 +2104,11 @@ static int unix_seqpacket_recvmsg(struct socket *sock, struct msghdr *msg, | ||
713 | |||
714 | static void unix_copy_addr(struct msghdr *msg, struct sock *sk) | ||
715 | { | ||
716 | - struct unix_sock *u = unix_sk(sk); | ||
717 | + struct unix_address *addr = smp_load_acquire(&unix_sk(sk)->addr); | ||
718 | |||
719 | - if (u->addr) { | ||
720 | - msg->msg_namelen = u->addr->len; | ||
721 | - memcpy(msg->msg_name, u->addr->name, u->addr->len); | ||
722 | + if (addr) { | ||
723 | + msg->msg_namelen = addr->len; | ||
724 | + memcpy(msg->msg_name, addr->name, addr->len); | ||
725 | } | ||
726 | } | ||
727 | |||
728 | @@ -2814,7 +2824,7 @@ static int unix_seq_show(struct seq_file *seq, void *v) | ||
729 | (s->sk_state == TCP_ESTABLISHED ? SS_CONNECTING : SS_DISCONNECTING), | ||
730 | sock_i_ino(s)); | ||
731 | |||
732 | - if (u->addr) { | ||
733 | + if (u->addr) { // under unix_table_lock here | ||
734 | int i, len; | ||
735 | seq_putc(seq, ' '); | ||
736 | |||
737 | diff --git a/net/unix/diag.c b/net/unix/diag.c | ||
738 | index 384c84e83462..3183d9b8ab33 100644 | ||
739 | --- a/net/unix/diag.c | ||
740 | +++ b/net/unix/diag.c | ||
741 | @@ -10,7 +10,8 @@ | ||
742 | |||
743 | static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb) | ||
744 | { | ||
745 | - struct unix_address *addr = unix_sk(sk)->addr; | ||
746 | + /* might or might not have unix_table_lock */ | ||
747 | + struct unix_address *addr = smp_load_acquire(&unix_sk(sk)->addr); | ||
748 | |||
749 | if (!addr) | ||
750 | return 0; | ||
751 | diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c | ||
752 | index 0a7e5d992bba..770ababb8f92 100644 | ||
753 | --- a/net/x25/af_x25.c | ||
754 | +++ b/net/x25/af_x25.c | ||
755 | @@ -678,8 +678,7 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
756 | struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr; | ||
757 | int len, i, rc = 0; | ||
758 | |||
759 | - if (!sock_flag(sk, SOCK_ZAPPED) || | ||
760 | - addr_len != sizeof(struct sockaddr_x25) || | ||
761 | + if (addr_len != sizeof(struct sockaddr_x25) || | ||
762 | addr->sx25_family != AF_X25) { | ||
763 | rc = -EINVAL; | ||
764 | goto out; | ||
765 | @@ -694,9 +693,13 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | ||
766 | } | ||
767 | |||
768 | lock_sock(sk); | ||
769 | - x25_sk(sk)->source_addr = addr->sx25_addr; | ||
770 | - x25_insert_socket(sk); | ||
771 | - sock_reset_flag(sk, SOCK_ZAPPED); | ||
772 | + if (sock_flag(sk, SOCK_ZAPPED)) { | ||
773 | + x25_sk(sk)->source_addr = addr->sx25_addr; | ||
774 | + x25_insert_socket(sk); | ||
775 | + sock_reset_flag(sk, SOCK_ZAPPED); | ||
776 | + } else { | ||
777 | + rc = -EINVAL; | ||
778 | + } | ||
779 | release_sock(sk); | ||
780 | SOCK_DEBUG(sk, "x25_bind: socket is bound\n"); | ||
781 | out: | ||
782 | @@ -812,8 +815,13 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, | ||
783 | sock->state = SS_CONNECTED; | ||
784 | rc = 0; | ||
785 | out_put_neigh: | ||
786 | - if (rc) | ||
787 | + if (rc) { | ||
788 | + read_lock_bh(&x25_list_lock); | ||
789 | x25_neigh_put(x25->neighbour); | ||
790 | + x25->neighbour = NULL; | ||
791 | + read_unlock_bh(&x25_list_lock); | ||
792 | + x25->state = X25_STATE_0; | ||
793 | + } | ||
794 | out_put_route: | ||
795 | x25_route_put(rt); | ||
796 | out: | ||
797 | diff --git a/security/keys/proc.c b/security/keys/proc.c | ||
798 | index ec493ddadd11..f2c7e090a66d 100644 | ||
799 | --- a/security/keys/proc.c | ||
800 | +++ b/security/keys/proc.c | ||
801 | @@ -187,7 +187,7 @@ static int proc_keys_show(struct seq_file *m, void *v) | ||
802 | |||
803 | struct keyring_search_context ctx = { | ||
804 | .index_key = key->index_key, | ||
805 | - .cred = current_cred(), | ||
806 | + .cred = m->file->f_cred, | ||
807 | .match_data.cmp = lookup_user_key_possessed, | ||
808 | .match_data.raw_data = key, | ||
809 | .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT, | ||
810 | @@ -207,11 +207,7 @@ static int proc_keys_show(struct seq_file *m, void *v) | ||
811 | } | ||
812 | } | ||
813 | |||
814 | - /* check whether the current task is allowed to view the key (assuming | ||
815 | - * non-possession) | ||
816 | - * - the caller holds a spinlock, and thus the RCU read lock, making our | ||
817 | - * access to __current_cred() safe | ||
818 | - */ | ||
819 | + /* check whether the current task is allowed to view the key */ | ||
820 | rc = key_task_permission(key_ref, ctx.cred, KEY_NEED_VIEW); | ||
821 | if (rc < 0) | ||
822 | return 0; | ||
823 | diff --git a/security/lsm_audit.c b/security/lsm_audit.c | ||
824 | index 37f04dadc8d6..44a20c218409 100644 | ||
825 | --- a/security/lsm_audit.c | ||
826 | +++ b/security/lsm_audit.c | ||
827 | @@ -321,6 +321,7 @@ static void dump_common_audit_data(struct audit_buffer *ab, | ||
828 | if (a->u.net->sk) { | ||
829 | struct sock *sk = a->u.net->sk; | ||
830 | struct unix_sock *u; | ||
831 | + struct unix_address *addr; | ||
832 | int len = 0; | ||
833 | char *p = NULL; | ||
834 | |||
835 | @@ -351,14 +352,15 @@ static void dump_common_audit_data(struct audit_buffer *ab, | ||
836 | #endif | ||
837 | case AF_UNIX: | ||
838 | u = unix_sk(sk); | ||
839 | + addr = smp_load_acquire(&u->addr); | ||
840 | + if (!addr) | ||
841 | + break; | ||
842 | if (u->path.dentry) { | ||
843 | audit_log_d_path(ab, " path=", &u->path); | ||
844 | break; | ||
845 | } | ||
846 | - if (!u->addr) | ||
847 | - break; | ||
848 | - len = u->addr->len-sizeof(short); | ||
849 | - p = &u->addr->name->sun_path[0]; | ||
850 | + len = addr->len-sizeof(short); | ||
851 | + p = &addr->name->sun_path[0]; | ||
852 | audit_log_format(ab, " path="); | ||
853 | if (*p) | ||
854 | audit_log_untrustedstring(ab, p); | ||
855 | diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c | ||
856 | index 3b4eaffe4a7f..a205b93fd9ac 100644 | ||
857 | --- a/sound/firewire/bebob/bebob.c | ||
858 | +++ b/sound/firewire/bebob/bebob.c | ||
859 | @@ -474,7 +474,19 @@ static const struct ieee1394_device_id bebob_id_table[] = { | ||
860 | /* Focusrite, SaffirePro 26 I/O */ | ||
861 | SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000003, &saffirepro_26_spec), | ||
862 | /* Focusrite, SaffirePro 10 I/O */ | ||
863 | - SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, 0x00000006, &saffirepro_10_spec), | ||
864 | + { | ||
865 | + // The combination of vendor_id and model_id is the same as the | ||
866 | + // same as the one of Liquid Saffire 56. | ||
867 | + .match_flags = IEEE1394_MATCH_VENDOR_ID | | ||
868 | + IEEE1394_MATCH_MODEL_ID | | ||
869 | + IEEE1394_MATCH_SPECIFIER_ID | | ||
870 | + IEEE1394_MATCH_VERSION, | ||
871 | + .vendor_id = VEN_FOCUSRITE, | ||
872 | + .model_id = 0x000006, | ||
873 | + .specifier_id = 0x00a02d, | ||
874 | + .version = 0x010001, | ||
875 | + .driver_data = (kernel_ulong_t)&saffirepro_10_spec, | ||
876 | + }, | ||
877 | /* Focusrite, Saffire(no label and LE) */ | ||
878 | SND_BEBOB_DEV_ENTRY(VEN_FOCUSRITE, MODEL_FOCUSRITE_SAFFIRE_BOTH, | ||
879 | &saffire_spec), |