Annotation of /trunk/kernel-alx-legacy/patches-4.9/0385-4.9.286-all-fixes.patch
Parent Directory | Revision Log
Revision 3687 -
(hide annotations)
(download)
Mon Oct 24 14:08:02 2022 UTC (20 months ago) by niro
File size: 11528 byte(s)
Mon Oct 24 14:08:02 2022 UTC (20 months ago) by niro
File size: 11528 byte(s)
-linux-4.9.286
1 | niro | 3687 | diff --git a/Makefile b/Makefile |
2 | index 2ed953d8e0f2a..68f2c6f3869e2 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 9 | ||
8 | -SUBLEVEL = 285 | ||
9 | +SUBLEVEL = 286 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Roaring Lionus | ||
12 | |||
13 | diff --git a/arch/sparc/lib/iomap.c b/arch/sparc/lib/iomap.c | ||
14 | index c4d42a50ebc06..fa4abbaf27de3 100644 | ||
15 | --- a/arch/sparc/lib/iomap.c | ||
16 | +++ b/arch/sparc/lib/iomap.c | ||
17 | @@ -18,8 +18,10 @@ void ioport_unmap(void __iomem *addr) | ||
18 | EXPORT_SYMBOL(ioport_map); | ||
19 | EXPORT_SYMBOL(ioport_unmap); | ||
20 | |||
21 | +#ifdef CONFIG_PCI | ||
22 | void pci_iounmap(struct pci_dev *dev, void __iomem * addr) | ||
23 | { | ||
24 | /* nothing to do */ | ||
25 | } | ||
26 | EXPORT_SYMBOL(pci_iounmap); | ||
27 | +#endif | ||
28 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
29 | index adbf0486422b8..d3804b215ffa6 100644 | ||
30 | --- a/drivers/ata/libata-core.c | ||
31 | +++ b/drivers/ata/libata-core.c | ||
32 | @@ -2157,6 +2157,25 @@ static void ata_dev_config_ncq_non_data(struct ata_device *dev) | ||
33 | } | ||
34 | } | ||
35 | |||
36 | +static bool ata_dev_check_adapter(struct ata_device *dev, | ||
37 | + unsigned short vendor_id) | ||
38 | +{ | ||
39 | + struct pci_dev *pcidev = NULL; | ||
40 | + struct device *parent_dev = NULL; | ||
41 | + | ||
42 | + for (parent_dev = dev->tdev.parent; parent_dev != NULL; | ||
43 | + parent_dev = parent_dev->parent) { | ||
44 | + if (dev_is_pci(parent_dev)) { | ||
45 | + pcidev = to_pci_dev(parent_dev); | ||
46 | + if (pcidev->vendor == vendor_id) | ||
47 | + return true; | ||
48 | + break; | ||
49 | + } | ||
50 | + } | ||
51 | + | ||
52 | + return false; | ||
53 | +} | ||
54 | + | ||
55 | static int ata_dev_config_ncq(struct ata_device *dev, | ||
56 | char *desc, size_t desc_sz) | ||
57 | { | ||
58 | @@ -2173,6 +2192,13 @@ static int ata_dev_config_ncq(struct ata_device *dev, | ||
59 | snprintf(desc, desc_sz, "NCQ (not used)"); | ||
60 | return 0; | ||
61 | } | ||
62 | + | ||
63 | + if (dev->horkage & ATA_HORKAGE_NO_NCQ_ON_ATI && | ||
64 | + ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI)) { | ||
65 | + snprintf(desc, desc_sz, "NCQ (not used)"); | ||
66 | + return 0; | ||
67 | + } | ||
68 | + | ||
69 | if (ap->flags & ATA_FLAG_NCQ) { | ||
70 | hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE - 1); | ||
71 | dev->flags |= ATA_DFLAG_NCQ; | ||
72 | @@ -4448,9 +4474,11 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
73 | { "Samsung SSD 850*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
74 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
75 | { "Samsung SSD 860*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
76 | - ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
77 | + ATA_HORKAGE_ZERO_AFTER_TRIM | | ||
78 | + ATA_HORKAGE_NO_NCQ_ON_ATI, }, | ||
79 | { "Samsung SSD 870*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
80 | - ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
81 | + ATA_HORKAGE_ZERO_AFTER_TRIM | | ||
82 | + ATA_HORKAGE_NO_NCQ_ON_ATI, }, | ||
83 | { "FCCT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | | ||
84 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, | ||
85 | |||
86 | @@ -6734,6 +6762,8 @@ static int __init ata_parse_force_one(char **cur, | ||
87 | { "ncq", .horkage_off = ATA_HORKAGE_NONCQ }, | ||
88 | { "noncqtrim", .horkage_on = ATA_HORKAGE_NO_NCQ_TRIM }, | ||
89 | { "ncqtrim", .horkage_off = ATA_HORKAGE_NO_NCQ_TRIM }, | ||
90 | + { "noncqati", .horkage_on = ATA_HORKAGE_NO_NCQ_ON_ATI }, | ||
91 | + { "ncqati", .horkage_off = ATA_HORKAGE_NO_NCQ_ON_ATI }, | ||
92 | { "dump_id", .horkage_on = ATA_HORKAGE_DUMP_ID }, | ||
93 | { "pio0", .xfer_mask = 1 << (ATA_SHIFT_PIO + 0) }, | ||
94 | { "pio1", .xfer_mask = 1 << (ATA_SHIFT_PIO + 1) }, | ||
95 | diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c | ||
96 | index 9c88e6749b9a4..34600b0061bb7 100644 | ||
97 | --- a/drivers/net/phy/mdio_device.c | ||
98 | +++ b/drivers/net/phy/mdio_device.c | ||
99 | @@ -135,6 +135,16 @@ static int mdio_remove(struct device *dev) | ||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | +static void mdio_shutdown(struct device *dev) | ||
104 | +{ | ||
105 | + struct mdio_device *mdiodev = to_mdio_device(dev); | ||
106 | + struct device_driver *drv = mdiodev->dev.driver; | ||
107 | + struct mdio_driver *mdiodrv = to_mdio_driver(drv); | ||
108 | + | ||
109 | + if (mdiodrv->shutdown) | ||
110 | + mdiodrv->shutdown(mdiodev); | ||
111 | +} | ||
112 | + | ||
113 | /** | ||
114 | * mdio_driver_register - register an mdio_driver with the MDIO layer | ||
115 | * @new_driver: new mdio_driver to register | ||
116 | @@ -149,6 +159,7 @@ int mdio_driver_register(struct mdio_driver *drv) | ||
117 | mdiodrv->driver.bus = &mdio_bus_type; | ||
118 | mdiodrv->driver.probe = mdio_probe; | ||
119 | mdiodrv->driver.remove = mdio_remove; | ||
120 | + mdiodrv->driver.shutdown = mdio_shutdown; | ||
121 | |||
122 | retval = driver_register(&mdiodrv->driver); | ||
123 | if (retval) { | ||
124 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c | ||
125 | index f7fd8b5a6a8cf..3016869b4afdc 100644 | ||
126 | --- a/drivers/net/xen-netback/netback.c | ||
127 | +++ b/drivers/net/xen-netback/netback.c | ||
128 | @@ -492,7 +492,7 @@ check_frags: | ||
129 | * the header's copy failed, and they are | ||
130 | * sharing a slot, send an error | ||
131 | */ | ||
132 | - if (i == 0 && sharedslot) | ||
133 | + if (i == 0 && !first_shinfo && sharedslot) | ||
134 | xenvif_idx_release(queue, pending_idx, | ||
135 | XEN_NETIF_RSP_ERROR); | ||
136 | else | ||
137 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
138 | index 671bf1e03ee1f..426f1b3aa15e2 100644 | ||
139 | --- a/drivers/scsi/sd.c | ||
140 | +++ b/drivers/scsi/sd.c | ||
141 | @@ -3179,15 +3179,16 @@ static int sd_probe(struct device *dev) | ||
142 | } | ||
143 | |||
144 | device_initialize(&sdkp->dev); | ||
145 | - sdkp->dev.parent = dev; | ||
146 | + sdkp->dev.parent = get_device(dev); | ||
147 | sdkp->dev.class = &sd_disk_class; | ||
148 | dev_set_name(&sdkp->dev, "%s", dev_name(dev)); | ||
149 | |||
150 | error = device_add(&sdkp->dev); | ||
151 | - if (error) | ||
152 | - goto out_free_index; | ||
153 | + if (error) { | ||
154 | + put_device(&sdkp->dev); | ||
155 | + goto out; | ||
156 | + } | ||
157 | |||
158 | - get_device(dev); | ||
159 | dev_set_drvdata(dev, sdkp); | ||
160 | |||
161 | get_device(&sdkp->dev); /* prevent release before async_schedule */ | ||
162 | diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c | ||
163 | index 4c40c0786e168..bd32140bdfee5 100644 | ||
164 | --- a/fs/ext2/balloc.c | ||
165 | +++ b/fs/ext2/balloc.c | ||
166 | @@ -46,10 +46,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, | ||
167 | struct ext2_sb_info *sbi = EXT2_SB(sb); | ||
168 | |||
169 | if (block_group >= sbi->s_groups_count) { | ||
170 | - ext2_error (sb, "ext2_get_group_desc", | ||
171 | - "block_group >= groups_count - " | ||
172 | - "block_group = %d, groups_count = %lu", | ||
173 | - block_group, sbi->s_groups_count); | ||
174 | + WARN(1, "block_group >= groups_count - " | ||
175 | + "block_group = %d, groups_count = %lu", | ||
176 | + block_group, sbi->s_groups_count); | ||
177 | |||
178 | return NULL; | ||
179 | } | ||
180 | @@ -57,10 +56,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, | ||
181 | group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb); | ||
182 | offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1); | ||
183 | if (!sbi->s_group_desc[group_desc]) { | ||
184 | - ext2_error (sb, "ext2_get_group_desc", | ||
185 | - "Group descriptor not loaded - " | ||
186 | - "block_group = %d, group_desc = %lu, desc = %lu", | ||
187 | - block_group, group_desc, offset); | ||
188 | + WARN(1, "Group descriptor not loaded - " | ||
189 | + "block_group = %d, group_desc = %lu, desc = %lu", | ||
190 | + block_group, group_desc, offset); | ||
191 | return NULL; | ||
192 | } | ||
193 | |||
194 | diff --git a/include/linux/libata.h b/include/linux/libata.h | ||
195 | index 3fabf57fd6e0d..de770d11a5c18 100644 | ||
196 | --- a/include/linux/libata.h | ||
197 | +++ b/include/linux/libata.h | ||
198 | @@ -436,6 +436,7 @@ enum { | ||
199 | ATA_HORKAGE_NOTRIM = (1 << 24), /* don't use TRIM */ | ||
200 | ATA_HORKAGE_MAX_SEC_1024 = (1 << 25), /* Limit max sects to 1024 */ | ||
201 | ATA_HORKAGE_MAX_TRIM_128M = (1 << 26), /* Limit max trim size to 128M */ | ||
202 | + ATA_HORKAGE_NO_NCQ_ON_ATI = (1 << 27), /* Disable NCQ on ATI chipset */ | ||
203 | |||
204 | /* DMA mask for user DMA control: User visible values; DO NOT | ||
205 | renumber */ | ||
206 | diff --git a/include/linux/mdio.h b/include/linux/mdio.h | ||
207 | index bf9d1d7506935..78b3cf50566f5 100644 | ||
208 | --- a/include/linux/mdio.h | ||
209 | +++ b/include/linux/mdio.h | ||
210 | @@ -61,6 +61,9 @@ struct mdio_driver { | ||
211 | |||
212 | /* Clears up any memory if needed */ | ||
213 | void (*remove)(struct mdio_device *mdiodev); | ||
214 | + | ||
215 | + /* Quiesces the device on system shutdown, turns off interrupts etc */ | ||
216 | + void (*shutdown)(struct mdio_device *mdiodev); | ||
217 | }; | ||
218 | #define to_mdio_driver(d) \ | ||
219 | container_of(to_mdio_common_driver(d), struct mdio_driver, mdiodrv) | ||
220 | diff --git a/include/net/sock.h b/include/net/sock.h | ||
221 | index cf27f3688c39c..78c292f15ffc1 100644 | ||
222 | --- a/include/net/sock.h | ||
223 | +++ b/include/net/sock.h | ||
224 | @@ -420,8 +420,10 @@ struct sock { | ||
225 | u32 sk_max_ack_backlog; | ||
226 | __u32 sk_priority; | ||
227 | __u32 sk_mark; | ||
228 | + spinlock_t sk_peer_lock; | ||
229 | struct pid *sk_peer_pid; | ||
230 | const struct cred *sk_peer_cred; | ||
231 | + | ||
232 | long sk_rcvtimeo; | ||
233 | long sk_sndtimeo; | ||
234 | struct timer_list sk_timer; | ||
235 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
236 | index d468ffb5a31c6..1845a37d9f7e1 100644 | ||
237 | --- a/net/core/sock.c | ||
238 | +++ b/net/core/sock.c | ||
239 | @@ -1011,7 +1011,6 @@ set_rcvbuf: | ||
240 | } | ||
241 | EXPORT_SYMBOL(sock_setsockopt); | ||
242 | |||
243 | - | ||
244 | static void cred_to_ucred(struct pid *pid, const struct cred *cred, | ||
245 | struct ucred *ucred) | ||
246 | { | ||
247 | @@ -1171,7 +1170,11 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | ||
248 | struct ucred peercred; | ||
249 | if (len > sizeof(peercred)) | ||
250 | len = sizeof(peercred); | ||
251 | + | ||
252 | + spin_lock(&sk->sk_peer_lock); | ||
253 | cred_to_ucred(sk->sk_peer_pid, sk->sk_peer_cred, &peercred); | ||
254 | + spin_unlock(&sk->sk_peer_lock); | ||
255 | + | ||
256 | if (copy_to_user(optval, &peercred, len)) | ||
257 | return -EFAULT; | ||
258 | goto lenout; | ||
259 | @@ -1439,9 +1442,10 @@ static void __sk_destruct(struct rcu_head *head) | ||
260 | sk->sk_frag.page = NULL; | ||
261 | } | ||
262 | |||
263 | - if (sk->sk_peer_cred) | ||
264 | - put_cred(sk->sk_peer_cred); | ||
265 | + /* We do not need to acquire sk->sk_peer_lock, we are the last user. */ | ||
266 | + put_cred(sk->sk_peer_cred); | ||
267 | put_pid(sk->sk_peer_pid); | ||
268 | + | ||
269 | if (likely(sk->sk_net_refcnt)) | ||
270 | put_net(sock_net(sk)); | ||
271 | sk_prot_free(sk->sk_prot_creator, sk); | ||
272 | @@ -2490,6 +2494,8 @@ void sock_init_data(struct socket *sock, struct sock *sk) | ||
273 | |||
274 | sk->sk_peer_pid = NULL; | ||
275 | sk->sk_peer_cred = NULL; | ||
276 | + spin_lock_init(&sk->sk_peer_lock); | ||
277 | + | ||
278 | sk->sk_write_pending = 0; | ||
279 | sk->sk_rcvlowat = 1; | ||
280 | sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; | ||
281 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c | ||
282 | index 2c643e1919aab..e7e012933714f 100644 | ||
283 | --- a/net/unix/af_unix.c | ||
284 | +++ b/net/unix/af_unix.c | ||
285 | @@ -594,20 +594,42 @@ static void unix_release_sock(struct sock *sk, int embrion) | ||
286 | |||
287 | static void init_peercred(struct sock *sk) | ||
288 | { | ||
289 | - put_pid(sk->sk_peer_pid); | ||
290 | - if (sk->sk_peer_cred) | ||
291 | - put_cred(sk->sk_peer_cred); | ||
292 | + const struct cred *old_cred; | ||
293 | + struct pid *old_pid; | ||
294 | + | ||
295 | + spin_lock(&sk->sk_peer_lock); | ||
296 | + old_pid = sk->sk_peer_pid; | ||
297 | + old_cred = sk->sk_peer_cred; | ||
298 | sk->sk_peer_pid = get_pid(task_tgid(current)); | ||
299 | sk->sk_peer_cred = get_current_cred(); | ||
300 | + spin_unlock(&sk->sk_peer_lock); | ||
301 | + | ||
302 | + put_pid(old_pid); | ||
303 | + put_cred(old_cred); | ||
304 | } | ||
305 | |||
306 | static void copy_peercred(struct sock *sk, struct sock *peersk) | ||
307 | { | ||
308 | - put_pid(sk->sk_peer_pid); | ||
309 | - if (sk->sk_peer_cred) | ||
310 | - put_cred(sk->sk_peer_cred); | ||
311 | + const struct cred *old_cred; | ||
312 | + struct pid *old_pid; | ||
313 | + | ||
314 | + if (sk < peersk) { | ||
315 | + spin_lock(&sk->sk_peer_lock); | ||
316 | + spin_lock_nested(&peersk->sk_peer_lock, SINGLE_DEPTH_NESTING); | ||
317 | + } else { | ||
318 | + spin_lock(&peersk->sk_peer_lock); | ||
319 | + spin_lock_nested(&sk->sk_peer_lock, SINGLE_DEPTH_NESTING); | ||
320 | + } | ||
321 | + old_pid = sk->sk_peer_pid; | ||
322 | + old_cred = sk->sk_peer_cred; | ||
323 | sk->sk_peer_pid = get_pid(peersk->sk_peer_pid); | ||
324 | sk->sk_peer_cred = get_cred(peersk->sk_peer_cred); | ||
325 | + | ||
326 | + spin_unlock(&sk->sk_peer_lock); | ||
327 | + spin_unlock(&peersk->sk_peer_lock); | ||
328 | + | ||
329 | + put_pid(old_pid); | ||
330 | + put_cred(old_cred); | ||
331 | } | ||
332 | |||
333 | static int unix_listen(struct socket *sock, int backlog) | ||
334 | diff --git a/tools/usb/testusb.c b/tools/usb/testusb.c | ||
335 | index 0692d99b6d8f3..18c895654e767 100644 | ||
336 | --- a/tools/usb/testusb.c | ||
337 | +++ b/tools/usb/testusb.c | ||
338 | @@ -278,12 +278,6 @@ nomem: | ||
339 | } | ||
340 | |||
341 | entry->ifnum = ifnum; | ||
342 | - | ||
343 | - /* FIXME update USBDEVFS_CONNECTINFO so it tells about high speed etc */ | ||
344 | - | ||
345 | - fprintf(stderr, "%s speed\t%s\t%u\n", | ||
346 | - speed(entry->speed), entry->name, entry->ifnum); | ||
347 | - | ||
348 | entry->next = testdevs; | ||
349 | testdevs = entry; | ||
350 | return 0; | ||
351 | @@ -312,6 +306,14 @@ static void *handle_testdev (void *arg) | ||
352 | return 0; | ||
353 | } | ||
354 | |||
355 | + status = ioctl(fd, USBDEVFS_GET_SPEED, NULL); | ||
356 | + if (status < 0) | ||
357 | + fprintf(stderr, "USBDEVFS_GET_SPEED failed %d\n", status); | ||
358 | + else | ||
359 | + dev->speed = status; | ||
360 | + fprintf(stderr, "%s speed\t%s\t%u\n", | ||
361 | + speed(dev->speed), dev->name, dev->ifnum); | ||
362 | + | ||
363 | restart: | ||
364 | for (i = 0; i < TEST_CASES; i++) { | ||
365 | if (dev->test != -1 && dev->test != i) |