1 |
commit: cd46743bf50ca75b829e770d3418dc387a5e6350 |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Wed Feb 23 12:40:29 2022 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed Feb 23 12:40:29 2022 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=cd46743b |
7 |
|
8 |
Linux 4.9.303 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1302_linux-4.9.303.patch | 1157 ++++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 1161 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index 236e8802..40c5fe88 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -1251,6 +1251,10 @@ Patch: 1301_linux-4.9.302.patch |
21 |
From: http://www.kernel.org |
22 |
Desc: Linux 4.9.302 |
23 |
|
24 |
+Patch: 1302_linux-4.9.303.patch |
25 |
+From: http://www.kernel.org |
26 |
+Desc: Linux 4.9.303 |
27 |
+ |
28 |
Patch: 1500_XATTR_USER_PREFIX.patch |
29 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
30 |
Desc: Support for namespace user.pax.* on tmpfs. |
31 |
|
32 |
diff --git a/1302_linux-4.9.303.patch b/1302_linux-4.9.303.patch |
33 |
new file mode 100644 |
34 |
index 00000000..0fcd5782 |
35 |
--- /dev/null |
36 |
+++ b/1302_linux-4.9.303.patch |
37 |
@@ -0,0 +1,1157 @@ |
38 |
+diff --git a/Makefile b/Makefile |
39 |
+index d2a09d4a37082..27d5e129444e3 100644 |
40 |
+--- a/Makefile |
41 |
++++ b/Makefile |
42 |
+@@ -1,6 +1,6 @@ |
43 |
+ VERSION = 4 |
44 |
+ PATCHLEVEL = 9 |
45 |
+-SUBLEVEL = 302 |
46 |
++SUBLEVEL = 303 |
47 |
+ EXTRAVERSION = |
48 |
+ NAME = Roaring Lionus |
49 |
+ |
50 |
+diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c |
51 |
+index 0827ee7d0e9b6..f1aa0b932c547 100644 |
52 |
+--- a/arch/x86/kvm/pmu.c |
53 |
++++ b/arch/x86/kvm/pmu.c |
54 |
+@@ -164,7 +164,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) |
55 |
+ } |
56 |
+ |
57 |
+ if (type == PERF_TYPE_RAW) |
58 |
+- config = eventsel & X86_RAW_EVENT_MASK; |
59 |
++ config = eventsel & AMD64_RAW_EVENT_MASK; |
60 |
+ |
61 |
+ pmc_reprogram_counter(pmc, type, config, |
62 |
+ !(eventsel & ARCH_PERFMON_EVENTSEL_USR), |
63 |
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
64 |
+index a92cbe1aa72a2..35db918a1de56 100644 |
65 |
+--- a/drivers/ata/libata-core.c |
66 |
++++ b/drivers/ata/libata-core.c |
67 |
+@@ -4486,6 +4486,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
68 |
+ |
69 |
+ /* devices that don't properly handle TRIM commands */ |
70 |
+ { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, |
71 |
++ { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, }, |
72 |
+ |
73 |
+ /* |
74 |
+ * As defined, the DRAT (Deterministic Read After Trim) and RZAT |
75 |
+diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c |
76 |
+index c3ee3ad98a638..4fb313f6612ce 100644 |
77 |
+--- a/drivers/edac/edac_mc.c |
78 |
++++ b/drivers/edac/edac_mc.c |
79 |
+@@ -199,7 +199,7 @@ void *edac_align_ptr(void **p, unsigned size, int n_elems) |
80 |
+ else |
81 |
+ return (char *)ptr; |
82 |
+ |
83 |
+- r = (unsigned long)p % align; |
84 |
++ r = (unsigned long)ptr % align; |
85 |
+ |
86 |
+ if (r == 0) |
87 |
+ return (char *)ptr; |
88 |
+diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
89 |
+index 7bb1e531325be..1b8652cf02187 100644 |
90 |
+--- a/drivers/gpu/drm/radeon/atombios_encoders.c |
91 |
++++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
92 |
+@@ -192,7 +192,8 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, |
93 |
+ * so don't register a backlight device |
94 |
+ */ |
95 |
+ if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) && |
96 |
+- (rdev->pdev->device == 0x6741)) |
97 |
++ (rdev->pdev->device == 0x6741) && |
98 |
++ !dmi_match(DMI_PRODUCT_NAME, "iMac12,1")) |
99 |
+ return; |
100 |
+ |
101 |
+ if (!radeon_encoder->enc_priv) |
102 |
+diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c |
103 |
+index a658f975605a7..fe51d3fb5c6b1 100644 |
104 |
+--- a/drivers/i2c/busses/i2c-brcmstb.c |
105 |
++++ b/drivers/i2c/busses/i2c-brcmstb.c |
106 |
+@@ -645,7 +645,7 @@ static int brcmstb_i2c_probe(struct platform_device *pdev) |
107 |
+ |
108 |
+ /* set the data in/out register size for compatible SoCs */ |
109 |
+ if (of_device_is_compatible(dev->device->of_node, |
110 |
+- "brcmstb,brcmper-i2c")) |
111 |
++ "brcm,brcmper-i2c")) |
112 |
+ dev->data_regsz = sizeof(u8); |
113 |
+ else |
114 |
+ dev->data_regsz = sizeof(u32); |
115 |
+diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c |
116 |
+index ce3b7fb7eda09..80c8e9abb402e 100644 |
117 |
+--- a/drivers/net/ieee802154/at86rf230.c |
118 |
++++ b/drivers/net/ieee802154/at86rf230.c |
119 |
+@@ -108,6 +108,7 @@ struct at86rf230_local { |
120 |
+ unsigned long cal_timeout; |
121 |
+ bool is_tx; |
122 |
+ bool is_tx_from_off; |
123 |
++ bool was_tx; |
124 |
+ u8 tx_retry; |
125 |
+ struct sk_buff *tx_skb; |
126 |
+ struct at86rf230_state_change tx; |
127 |
+@@ -351,7 +352,11 @@ at86rf230_async_error_recover_complete(void *context) |
128 |
+ if (ctx->free) |
129 |
+ kfree(ctx); |
130 |
+ |
131 |
+- ieee802154_wake_queue(lp->hw); |
132 |
++ if (lp->was_tx) { |
133 |
++ lp->was_tx = 0; |
134 |
++ dev_kfree_skb_any(lp->tx_skb); |
135 |
++ ieee802154_wake_queue(lp->hw); |
136 |
++ } |
137 |
+ } |
138 |
+ |
139 |
+ static void |
140 |
+@@ -360,7 +365,11 @@ at86rf230_async_error_recover(void *context) |
141 |
+ struct at86rf230_state_change *ctx = context; |
142 |
+ struct at86rf230_local *lp = ctx->lp; |
143 |
+ |
144 |
+- lp->is_tx = 0; |
145 |
++ if (lp->is_tx) { |
146 |
++ lp->was_tx = 1; |
147 |
++ lp->is_tx = 0; |
148 |
++ } |
149 |
++ |
150 |
+ at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, |
151 |
+ at86rf230_async_error_recover_complete); |
152 |
+ } |
153 |
+diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c |
154 |
+index 412a36f27de6d..738d10fc595c0 100644 |
155 |
+--- a/drivers/net/usb/ax88179_178a.c |
156 |
++++ b/drivers/net/usb/ax88179_178a.c |
157 |
+@@ -1369,59 +1369,69 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
158 |
+ u16 hdr_off; |
159 |
+ u32 *pkt_hdr; |
160 |
+ |
161 |
+- /* This check is no longer done by usbnet */ |
162 |
+- if (skb->len < dev->net->hard_header_len) |
163 |
++ /* At the end of the SKB, there's a header telling us how many packets |
164 |
++ * are bundled into this buffer and where we can find an array of |
165 |
++ * per-packet metadata (which contains elements encoded into u16). |
166 |
++ */ |
167 |
++ if (skb->len < 4) |
168 |
+ return 0; |
169 |
+- |
170 |
+ skb_trim(skb, skb->len - 4); |
171 |
+ memcpy(&rx_hdr, skb_tail_pointer(skb), 4); |
172 |
+ le32_to_cpus(&rx_hdr); |
173 |
+- |
174 |
+ pkt_cnt = (u16)rx_hdr; |
175 |
+ hdr_off = (u16)(rx_hdr >> 16); |
176 |
++ |
177 |
++ if (pkt_cnt == 0) |
178 |
++ return 0; |
179 |
++ |
180 |
++ /* Make sure that the bounds of the metadata array are inside the SKB |
181 |
++ * (and in front of the counter at the end). |
182 |
++ */ |
183 |
++ if (pkt_cnt * 2 + hdr_off > skb->len) |
184 |
++ return 0; |
185 |
+ pkt_hdr = (u32 *)(skb->data + hdr_off); |
186 |
+ |
187 |
+- while (pkt_cnt--) { |
188 |
++ /* Packets must not overlap the metadata array */ |
189 |
++ skb_trim(skb, hdr_off); |
190 |
++ |
191 |
++ for (; ; pkt_cnt--, pkt_hdr++) { |
192 |
+ u16 pkt_len; |
193 |
+ |
194 |
+ le32_to_cpus(pkt_hdr); |
195 |
+ pkt_len = (*pkt_hdr >> 16) & 0x1fff; |
196 |
+ |
197 |
+- /* Check CRC or runt packet */ |
198 |
+- if ((*pkt_hdr & AX_RXHDR_CRC_ERR) || |
199 |
+- (*pkt_hdr & AX_RXHDR_DROP_ERR)) { |
200 |
+- skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
201 |
+- pkt_hdr++; |
202 |
+- continue; |
203 |
+- } |
204 |
+- |
205 |
+- if (pkt_cnt == 0) { |
206 |
+- skb->len = pkt_len; |
207 |
+- /* Skip IP alignment pseudo header */ |
208 |
+- skb_pull(skb, 2); |
209 |
+- skb_set_tail_pointer(skb, skb->len); |
210 |
+- skb->truesize = pkt_len + sizeof(struct sk_buff); |
211 |
+- ax88179_rx_checksum(skb, pkt_hdr); |
212 |
+- return 1; |
213 |
+- } |
214 |
++ if (pkt_len > skb->len) |
215 |
++ return 0; |
216 |
+ |
217 |
+- ax_skb = skb_clone(skb, GFP_ATOMIC); |
218 |
+- if (ax_skb) { |
219 |
++ /* Check CRC or runt packet */ |
220 |
++ if (((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) == 0) && |
221 |
++ pkt_len >= 2 + ETH_HLEN) { |
222 |
++ bool last = (pkt_cnt == 0); |
223 |
++ |
224 |
++ if (last) { |
225 |
++ ax_skb = skb; |
226 |
++ } else { |
227 |
++ ax_skb = skb_clone(skb, GFP_ATOMIC); |
228 |
++ if (!ax_skb) |
229 |
++ return 0; |
230 |
++ } |
231 |
+ ax_skb->len = pkt_len; |
232 |
+ /* Skip IP alignment pseudo header */ |
233 |
+ skb_pull(ax_skb, 2); |
234 |
+ skb_set_tail_pointer(ax_skb, ax_skb->len); |
235 |
+ ax_skb->truesize = pkt_len + sizeof(struct sk_buff); |
236 |
+ ax88179_rx_checksum(ax_skb, pkt_hdr); |
237 |
++ |
238 |
++ if (last) |
239 |
++ return 1; |
240 |
++ |
241 |
+ usbnet_skb_return(dev, ax_skb); |
242 |
+- } else { |
243 |
+- return 0; |
244 |
+ } |
245 |
+ |
246 |
+- skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
247 |
+- pkt_hdr++; |
248 |
++ /* Trim this packet away from the SKB */ |
249 |
++ if (!skb_pull(skb, (pkt_len + 7) & 0xFFF8)) |
250 |
++ return 0; |
251 |
+ } |
252 |
+- return 1; |
253 |
+ } |
254 |
+ |
255 |
+ static struct sk_buff * |
256 |
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
257 |
+index a8c960152a357..003c53a5bb336 100644 |
258 |
+--- a/drivers/net/usb/qmi_wwan.c |
259 |
++++ b/drivers/net/usb/qmi_wwan.c |
260 |
+@@ -964,6 +964,8 @@ static const struct usb_device_id products[] = { |
261 |
+ {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ |
262 |
+ {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ |
263 |
+ {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ |
264 |
++ {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ |
265 |
++ {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ |
266 |
+ {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ |
267 |
+ {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ |
268 |
+ {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ |
269 |
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
270 |
+index 71edbf7a42ed4..1acffca3d75d7 100644 |
271 |
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
272 |
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
273 |
+@@ -1183,8 +1183,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, |
274 |
+ /* This may fail if AMT took ownership of the device */ |
275 |
+ if (iwl_pcie_prepare_card_hw(trans)) { |
276 |
+ IWL_WARN(trans, "Exit HW not ready\n"); |
277 |
+- ret = -EIO; |
278 |
+- goto out; |
279 |
++ return -EIO; |
280 |
+ } |
281 |
+ |
282 |
+ iwl_enable_rfkill_int(trans); |
283 |
+diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c |
284 |
+index 7a5306bf56c85..f6ef5952e94b3 100644 |
285 |
+--- a/drivers/parisc/ccio-dma.c |
286 |
++++ b/drivers/parisc/ccio-dma.c |
287 |
+@@ -1008,7 +1008,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
288 |
+ ioc->usg_calls++; |
289 |
+ #endif |
290 |
+ |
291 |
+- while(sg_dma_len(sglist) && nents--) { |
292 |
++ while (nents && sg_dma_len(sglist)) { |
293 |
+ |
294 |
+ #ifdef CCIO_COLLECT_STATS |
295 |
+ ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT; |
296 |
+@@ -1016,6 +1016,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
297 |
+ ccio_unmap_page(dev, sg_dma_address(sglist), |
298 |
+ sg_dma_len(sglist), direction, 0); |
299 |
+ ++sglist; |
300 |
++ nents--; |
301 |
+ } |
302 |
+ |
303 |
+ DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
304 |
+diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c |
305 |
+index a7f542e784dd0..c715af1b6c3c0 100644 |
306 |
+--- a/drivers/parisc/sba_iommu.c |
307 |
++++ b/drivers/parisc/sba_iommu.c |
308 |
+@@ -1061,7 +1061,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
309 |
+ spin_unlock_irqrestore(&ioc->res_lock, flags); |
310 |
+ #endif |
311 |
+ |
312 |
+- while (sg_dma_len(sglist) && nents--) { |
313 |
++ while (nents && sg_dma_len(sglist)) { |
314 |
+ |
315 |
+ sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist), |
316 |
+ direction, 0); |
317 |
+@@ -1070,6 +1070,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
318 |
+ ioc->usingle_calls--; /* kluge since call is unmap_sg() */ |
319 |
+ #endif |
320 |
+ ++sglist; |
321 |
++ nents--; |
322 |
+ } |
323 |
+ |
324 |
+ DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
325 |
+diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c |
326 |
+index b1e6ae9f1ff95..642271c2c48f4 100644 |
327 |
+--- a/drivers/tty/serial/8250/8250_gsc.c |
328 |
++++ b/drivers/tty/serial/8250/8250_gsc.c |
329 |
+@@ -30,7 +30,7 @@ static int __init serial_init_chip(struct parisc_device *dev) |
330 |
+ unsigned long address; |
331 |
+ int err; |
332 |
+ |
333 |
+-#ifdef CONFIG_64BIT |
334 |
++#if defined(CONFIG_64BIT) && defined(CONFIG_IOSAPIC) |
335 |
+ if (!dev->irq && (dev->id.sversion == 0xad)) |
336 |
+ dev->irq = iosapic_serial_irq(dev); |
337 |
+ #endif |
338 |
+diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
339 |
+index 080b12d65b0cb..35dea3f86fdfa 100644 |
340 |
+--- a/fs/btrfs/send.c |
341 |
++++ b/fs/btrfs/send.c |
342 |
+@@ -4675,6 +4675,10 @@ static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len) |
343 |
+ lock_page(page); |
344 |
+ if (!PageUptodate(page)) { |
345 |
+ unlock_page(page); |
346 |
++ btrfs_err(fs_info, |
347 |
++ "send: IO error at offset %llu for inode %llu root %llu", |
348 |
++ page_offset(page), sctx->cur_ino, |
349 |
++ sctx->send_root->root_key.objectid); |
350 |
+ put_page(page); |
351 |
+ ret = -EIO; |
352 |
+ break; |
353 |
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
354 |
+index 24e854dfb3c25..7e94c46d77d7a 100644 |
355 |
+--- a/fs/nfs/dir.c |
356 |
++++ b/fs/nfs/dir.c |
357 |
+@@ -1605,14 +1605,14 @@ no_open: |
358 |
+ if (!res) { |
359 |
+ inode = d_inode(dentry); |
360 |
+ if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
361 |
+- !S_ISDIR(inode->i_mode)) |
362 |
++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) |
363 |
+ res = ERR_PTR(-ENOTDIR); |
364 |
+ else if (inode && S_ISREG(inode->i_mode)) |
365 |
+ res = ERR_PTR(-EOPENSTALE); |
366 |
+ } else if (!IS_ERR(res)) { |
367 |
+ inode = d_inode(res); |
368 |
+ if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
369 |
+- !S_ISDIR(inode->i_mode)) { |
370 |
++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) { |
371 |
+ dput(res); |
372 |
+ res = ERR_PTR(-ENOTDIR); |
373 |
+ } else if (inode && S_ISREG(inode->i_mode)) { |
374 |
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c |
375 |
+index 7a94f5a5f8c8c..99a67d132ec30 100644 |
376 |
+--- a/fs/nfs/inode.c |
377 |
++++ b/fs/nfs/inode.c |
378 |
+@@ -661,11 +661,8 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) |
379 |
+ |
380 |
+ trace_nfs_getattr_enter(inode); |
381 |
+ /* Flush out writes to the server in order to update c/mtime. */ |
382 |
+- if (S_ISREG(inode->i_mode)) { |
383 |
+- err = filemap_write_and_wait(inode->i_mapping); |
384 |
+- if (err) |
385 |
+- goto out; |
386 |
+- } |
387 |
++ if (S_ISREG(inode->i_mode)) |
388 |
++ filemap_write_and_wait(inode->i_mapping); |
389 |
+ |
390 |
+ /* |
391 |
+ * We may force a getattr if the user cares about atime. |
392 |
+@@ -693,7 +690,7 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) |
393 |
+ if (S_ISDIR(inode->i_mode)) |
394 |
+ stat->blksize = NFS_SERVER(inode)->dtsize; |
395 |
+ } |
396 |
+-out: |
397 |
++ |
398 |
+ trace_nfs_getattr_exit(inode, err); |
399 |
+ return err; |
400 |
+ } |
401 |
+diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c |
402 |
+index 82a5ecbe2da96..022b237c6a134 100644 |
403 |
+--- a/fs/quota/dquot.c |
404 |
++++ b/fs/quota/dquot.c |
405 |
+@@ -676,9 +676,14 @@ int dquot_quota_sync(struct super_block *sb, int type) |
406 |
+ /* This is not very clever (and fast) but currently I don't know about |
407 |
+ * any other simple way of getting quota data to disk and we must get |
408 |
+ * them there for userspace to be visible... */ |
409 |
+- if (sb->s_op->sync_fs) |
410 |
+- sb->s_op->sync_fs(sb, 1); |
411 |
+- sync_blockdev(sb->s_bdev); |
412 |
++ if (sb->s_op->sync_fs) { |
413 |
++ ret = sb->s_op->sync_fs(sb, 1); |
414 |
++ if (ret) |
415 |
++ return ret; |
416 |
++ } |
417 |
++ ret = sync_blockdev(sb->s_bdev); |
418 |
++ if (ret) |
419 |
++ return ret; |
420 |
+ |
421 |
+ /* |
422 |
+ * Now when everything is written we can discard the pagecache so |
423 |
+diff --git a/fs/super.c b/fs/super.c |
424 |
+index 377c439477b74..20e9cd2b6488d 100644 |
425 |
+--- a/fs/super.c |
426 |
++++ b/fs/super.c |
427 |
+@@ -1298,11 +1298,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb) |
428 |
+ percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); |
429 |
+ } |
430 |
+ |
431 |
+-static void sb_freeze_unlock(struct super_block *sb) |
432 |
++static void sb_freeze_unlock(struct super_block *sb, int level) |
433 |
+ { |
434 |
+- int level; |
435 |
+- |
436 |
+- for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--) |
437 |
++ for (level--; level >= 0; level--) |
438 |
+ percpu_up_write(sb->s_writers.rw_sem + level); |
439 |
+ } |
440 |
+ |
441 |
+@@ -1373,7 +1371,14 @@ int freeze_super(struct super_block *sb) |
442 |
+ sb_wait_write(sb, SB_FREEZE_PAGEFAULT); |
443 |
+ |
444 |
+ /* All writers are done so after syncing there won't be dirty data */ |
445 |
+- sync_filesystem(sb); |
446 |
++ ret = sync_filesystem(sb); |
447 |
++ if (ret) { |
448 |
++ sb->s_writers.frozen = SB_UNFROZEN; |
449 |
++ sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT); |
450 |
++ wake_up(&sb->s_writers.wait_unfrozen); |
451 |
++ deactivate_locked_super(sb); |
452 |
++ return ret; |
453 |
++ } |
454 |
+ |
455 |
+ /* Now wait for internal filesystem counter */ |
456 |
+ sb->s_writers.frozen = SB_FREEZE_FS; |
457 |
+@@ -1385,7 +1390,7 @@ int freeze_super(struct super_block *sb) |
458 |
+ printk(KERN_ERR |
459 |
+ "VFS:Filesystem freeze failed\n"); |
460 |
+ sb->s_writers.frozen = SB_UNFROZEN; |
461 |
+- sb_freeze_unlock(sb); |
462 |
++ sb_freeze_unlock(sb, SB_FREEZE_FS); |
463 |
+ wake_up(&sb->s_writers.wait_unfrozen); |
464 |
+ deactivate_locked_super(sb); |
465 |
+ return ret; |
466 |
+@@ -1437,7 +1442,7 @@ int thaw_super(struct super_block *sb) |
467 |
+ } |
468 |
+ |
469 |
+ sb->s_writers.frozen = SB_UNFROZEN; |
470 |
+- sb_freeze_unlock(sb); |
471 |
++ sb_freeze_unlock(sb, SB_FREEZE_FS); |
472 |
+ out: |
473 |
+ wake_up(&sb->s_writers.wait_unfrozen); |
474 |
+ deactivate_locked_super(sb); |
475 |
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
476 |
+index 01c646a1d9e76..12bee7043be6f 100644 |
477 |
+--- a/kernel/trace/trace.c |
478 |
++++ b/kernel/trace/trace.c |
479 |
+@@ -228,6 +228,10 @@ __setup("trace_clock=", set_trace_boot_clock); |
480 |
+ |
481 |
+ static int __init set_tracepoint_printk(char *str) |
482 |
+ { |
483 |
++ /* Ignore the "tp_printk_stop_on_boot" param */ |
484 |
++ if (*str == '_') |
485 |
++ return 0; |
486 |
++ |
487 |
+ if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0)) |
488 |
+ tracepoint_printk = 1; |
489 |
+ return 1; |
490 |
+diff --git a/kernel/tsacct.c b/kernel/tsacct.c |
491 |
+index f8e26ab963ed2..06406633d7cdb 100644 |
492 |
+--- a/kernel/tsacct.c |
493 |
++++ b/kernel/tsacct.c |
494 |
+@@ -44,11 +44,10 @@ void bacct_add_tsk(struct user_namespace *user_ns, |
495 |
+ /* Convert to seconds for btime */ |
496 |
+ do_div(delta, USEC_PER_SEC); |
497 |
+ stats->ac_btime = get_seconds() - delta; |
498 |
+- if (thread_group_leader(tsk)) { |
499 |
++ if (tsk->flags & PF_EXITING) |
500 |
+ stats->ac_exitcode = tsk->exit_code; |
501 |
+- if (tsk->flags & PF_FORKNOEXEC) |
502 |
+- stats->ac_flag |= AFORK; |
503 |
+- } |
504 |
++ if (thread_group_leader(tsk) && (tsk->flags & PF_FORKNOEXEC)) |
505 |
++ stats->ac_flag |= AFORK; |
506 |
+ if (tsk->flags & PF_SUPERPRIV) |
507 |
+ stats->ac_flag |= ASU; |
508 |
+ if (tsk->flags & PF_DUMPCORE) |
509 |
+diff --git a/lib/iov_iter.c b/lib/iov_iter.c |
510 |
+index 07d735b2eccf7..e01bb1c51d87b 100644 |
511 |
+--- a/lib/iov_iter.c |
512 |
++++ b/lib/iov_iter.c |
513 |
+@@ -370,6 +370,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by |
514 |
+ return 0; |
515 |
+ pipe->nrbufs++; |
516 |
+ buf->ops = &page_cache_pipe_buf_ops; |
517 |
++ buf->flags = 0; |
518 |
+ get_page(buf->page = page); |
519 |
+ buf->offset = offset; |
520 |
+ buf->len = bytes; |
521 |
+@@ -494,6 +495,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size, |
522 |
+ break; |
523 |
+ pipe->nrbufs++; |
524 |
+ pipe->bufs[idx].ops = &default_pipe_buf_ops; |
525 |
++ pipe->bufs[idx].flags = 0; |
526 |
+ pipe->bufs[idx].page = page; |
527 |
+ pipe->bufs[idx].offset = 0; |
528 |
+ if (left <= PAGE_SIZE) { |
529 |
+diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c |
530 |
+index f4c8567e91b38..c4ef1be59cb19 100644 |
531 |
+--- a/net/ax25/af_ax25.c |
532 |
++++ b/net/ax25/af_ax25.c |
533 |
+@@ -80,6 +80,7 @@ static void ax25_kill_by_device(struct net_device *dev) |
534 |
+ { |
535 |
+ ax25_dev *ax25_dev; |
536 |
+ ax25_cb *s; |
537 |
++ struct sock *sk; |
538 |
+ |
539 |
+ if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) |
540 |
+ return; |
541 |
+@@ -88,13 +89,15 @@ static void ax25_kill_by_device(struct net_device *dev) |
542 |
+ again: |
543 |
+ ax25_for_each(s, &ax25_list) { |
544 |
+ if (s->ax25_dev == ax25_dev) { |
545 |
++ sk = s->sk; |
546 |
++ sock_hold(sk); |
547 |
+ spin_unlock_bh(&ax25_list_lock); |
548 |
+- lock_sock(s->sk); |
549 |
++ lock_sock(sk); |
550 |
+ s->ax25_dev = NULL; |
551 |
+- release_sock(s->sk); |
552 |
++ release_sock(sk); |
553 |
+ ax25_disconnect(s, ENETUNREACH); |
554 |
+ spin_lock_bh(&ax25_list_lock); |
555 |
+- |
556 |
++ sock_put(sk); |
557 |
+ /* The entry could have been deleted from the |
558 |
+ * list meanwhile and thus the next pointer is |
559 |
+ * no longer valid. Play it safe and restart |
560 |
+diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c |
561 |
+index 6d7ff117f3792..6655c06a325cf 100644 |
562 |
+--- a/net/core/drop_monitor.c |
563 |
++++ b/net/core/drop_monitor.c |
564 |
+@@ -224,13 +224,17 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi, |
565 |
+ |
566 |
+ rcu_read_lock(); |
567 |
+ list_for_each_entry_rcu(new_stat, &hw_stats_list, list) { |
568 |
++ struct net_device *dev; |
569 |
++ |
570 |
+ /* |
571 |
+ * only add a note to our monitor buffer if: |
572 |
+ * 1) this is the dev we received on |
573 |
+ * 2) its after the last_rx delta |
574 |
+ * 3) our rx_dropped count has gone up |
575 |
+ */ |
576 |
+- if ((new_stat->dev == napi->dev) && |
577 |
++ /* Paired with WRITE_ONCE() in dropmon_net_event() */ |
578 |
++ dev = READ_ONCE(new_stat->dev); |
579 |
++ if ((dev == napi->dev) && |
580 |
+ (time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) && |
581 |
+ (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) { |
582 |
+ trace_drop_common(NULL, NULL); |
583 |
+@@ -345,7 +349,10 @@ static int dropmon_net_event(struct notifier_block *ev_block, |
584 |
+ mutex_lock(&trace_state_mutex); |
585 |
+ list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) { |
586 |
+ if (new_stat->dev == dev) { |
587 |
+- new_stat->dev = NULL; |
588 |
++ |
589 |
++ /* Paired with READ_ONCE() in trace_napi_poll_hit() */ |
590 |
++ WRITE_ONCE(new_stat->dev, NULL); |
591 |
++ |
592 |
+ if (trace_state == TRACE_OFF) { |
593 |
+ list_del_rcu(&new_stat->list); |
594 |
+ kfree_rcu(new_stat, rcu); |
595 |
+diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c |
596 |
+index 1805413cd2251..0f405045dcd81 100644 |
597 |
+--- a/net/ipv4/xfrm4_policy.c |
598 |
++++ b/net/ipv4/xfrm4_policy.c |
599 |
+@@ -16,6 +16,7 @@ |
600 |
+ #include <net/xfrm.h> |
601 |
+ #include <net/ip.h> |
602 |
+ #include <net/l3mdev.h> |
603 |
++#include <net/inet_ecn.h> |
604 |
+ |
605 |
+ static struct xfrm_policy_afinfo xfrm4_policy_afinfo; |
606 |
+ |
607 |
+@@ -123,7 +124,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
608 |
+ fl4->flowi4_proto = iph->protocol; |
609 |
+ fl4->daddr = reverse ? iph->saddr : iph->daddr; |
610 |
+ fl4->saddr = reverse ? iph->daddr : iph->saddr; |
611 |
+- fl4->flowi4_tos = iph->tos; |
612 |
++ fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK; |
613 |
+ |
614 |
+ if (!ip_is_fragment(iph)) { |
615 |
+ switch (iph->protocol) { |
616 |
+diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
617 |
+index 95470d628d34b..46ff984da6f44 100644 |
618 |
+--- a/net/vmw_vsock/af_vsock.c |
619 |
++++ b/net/vmw_vsock/af_vsock.c |
620 |
+@@ -279,7 +279,8 @@ EXPORT_SYMBOL_GPL(vsock_insert_connected); |
621 |
+ void vsock_remove_bound(struct vsock_sock *vsk) |
622 |
+ { |
623 |
+ spin_lock_bh(&vsock_table_lock); |
624 |
+- __vsock_remove_bound(vsk); |
625 |
++ if (__vsock_in_bound_table(vsk)) |
626 |
++ __vsock_remove_bound(vsk); |
627 |
+ spin_unlock_bh(&vsock_table_lock); |
628 |
+ } |
629 |
+ EXPORT_SYMBOL_GPL(vsock_remove_bound); |
630 |
+@@ -287,7 +288,8 @@ EXPORT_SYMBOL_GPL(vsock_remove_bound); |
631 |
+ void vsock_remove_connected(struct vsock_sock *vsk) |
632 |
+ { |
633 |
+ spin_lock_bh(&vsock_table_lock); |
634 |
+- __vsock_remove_connected(vsk); |
635 |
++ if (__vsock_in_connected_table(vsk)) |
636 |
++ __vsock_remove_connected(vsk); |
637 |
+ spin_unlock_bh(&vsock_table_lock); |
638 |
+ } |
639 |
+ EXPORT_SYMBOL_GPL(vsock_remove_connected); |
640 |
+@@ -323,35 +325,10 @@ struct sock *vsock_find_connected_socket(struct sockaddr_vm *src, |
641 |
+ } |
642 |
+ EXPORT_SYMBOL_GPL(vsock_find_connected_socket); |
643 |
+ |
644 |
+-static bool vsock_in_bound_table(struct vsock_sock *vsk) |
645 |
+-{ |
646 |
+- bool ret; |
647 |
+- |
648 |
+- spin_lock_bh(&vsock_table_lock); |
649 |
+- ret = __vsock_in_bound_table(vsk); |
650 |
+- spin_unlock_bh(&vsock_table_lock); |
651 |
+- |
652 |
+- return ret; |
653 |
+-} |
654 |
+- |
655 |
+-static bool vsock_in_connected_table(struct vsock_sock *vsk) |
656 |
+-{ |
657 |
+- bool ret; |
658 |
+- |
659 |
+- spin_lock_bh(&vsock_table_lock); |
660 |
+- ret = __vsock_in_connected_table(vsk); |
661 |
+- spin_unlock_bh(&vsock_table_lock); |
662 |
+- |
663 |
+- return ret; |
664 |
+-} |
665 |
+- |
666 |
+ void vsock_remove_sock(struct vsock_sock *vsk) |
667 |
+ { |
668 |
+- if (vsock_in_bound_table(vsk)) |
669 |
+- vsock_remove_bound(vsk); |
670 |
+- |
671 |
+- if (vsock_in_connected_table(vsk)) |
672 |
+- vsock_remove_connected(vsk); |
673 |
++ vsock_remove_bound(vsk); |
674 |
++ vsock_remove_connected(vsk); |
675 |
+ } |
676 |
+ EXPORT_SYMBOL_GPL(vsock_remove_sock); |
677 |
+ |
678 |
+@@ -482,8 +459,7 @@ static void vsock_pending_work(struct work_struct *work) |
679 |
+ * incoming packets can't find this socket, and to reduce the reference |
680 |
+ * count. |
681 |
+ */ |
682 |
+- if (vsock_in_connected_table(vsk)) |
683 |
+- vsock_remove_connected(vsk); |
684 |
++ vsock_remove_connected(vsk); |
685 |
+ |
686 |
+ sk->sk_state = SS_FREE; |
687 |
+ |
688 |
+@@ -1244,6 +1220,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, |
689 |
+ sk->sk_state = SS_UNCONNECTED; |
690 |
+ sock->state = SS_UNCONNECTED; |
691 |
+ vsock_transport_cancel_pkt(vsk); |
692 |
++ vsock_remove_connected(vsk); |
693 |
+ goto out_wait; |
694 |
+ } else if (timeout == 0) { |
695 |
+ err = -ETIMEDOUT; |
696 |
+diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn |
697 |
+index 1532038f60055..e823bf6a413cb 100644 |
698 |
+--- a/scripts/Makefile.extrawarn |
699 |
++++ b/scripts/Makefile.extrawarn |
700 |
+@@ -71,5 +71,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare) |
701 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length) |
702 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized) |
703 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) |
704 |
++KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) |
705 |
+ endif |
706 |
+ endif |
707 |
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
708 |
+index 16a692fc7f649..74ce577de7dfe 100644 |
709 |
+--- a/sound/pci/hda/hda_intel.c |
710 |
++++ b/sound/pci/hda/hda_intel.c |
711 |
+@@ -1424,6 +1424,7 @@ static struct snd_pci_quirk probe_mask_list[] = { |
712 |
+ /* forced codec slots */ |
713 |
+ SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103), |
714 |
+ SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), |
715 |
++ SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105), |
716 |
+ /* WinFast VP200 H (Teradici) user reported broken communication */ |
717 |
+ SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101), |
718 |
+ {} |
719 |
+@@ -1609,8 +1610,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
720 |
+ |
721 |
+ assign_position_fix(chip, check_position_fix(chip, position_fix[dev])); |
722 |
+ |
723 |
+- check_probe_mask(chip, dev); |
724 |
+- |
725 |
+ chip->single_cmd = single_cmd; |
726 |
+ azx_check_snoop_available(chip); |
727 |
+ |
728 |
+@@ -1631,6 +1630,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
729 |
+ chip->bus.needs_damn_long_delay = 1; |
730 |
+ } |
731 |
+ |
732 |
++ check_probe_mask(chip, dev); |
733 |
++ |
734 |
+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); |
735 |
+ if (err < 0) { |
736 |
+ dev_err(card->dev, "Error creating device [card]!\n"); |
737 |
+diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c |
738 |
+index 4da6f66ea3a21..e2c200c3c1353 100644 |
739 |
+--- a/sound/soc/soc-ops.c |
740 |
++++ b/sound/soc/soc-ops.c |
741 |
+@@ -319,7 +319,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
742 |
+ unsigned int sign_bit = mc->sign_bit; |
743 |
+ unsigned int mask = (1 << fls(max)) - 1; |
744 |
+ unsigned int invert = mc->invert; |
745 |
+- int err; |
746 |
++ int err, ret; |
747 |
+ bool type_2r = false; |
748 |
+ unsigned int val2 = 0; |
749 |
+ unsigned int val, val_mask; |
750 |
+@@ -361,12 +361,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
751 |
+ err = snd_soc_component_update_bits(component, reg, val_mask, val); |
752 |
+ if (err < 0) |
753 |
+ return err; |
754 |
++ ret = err; |
755 |
+ |
756 |
+- if (type_2r) |
757 |
++ if (type_2r) { |
758 |
+ err = snd_soc_component_update_bits(component, reg2, val_mask, |
759 |
+- val2); |
760 |
++ val2); |
761 |
++ /* Don't discard any error code or drop change flag */ |
762 |
++ if (ret == 0 || err < 0) { |
763 |
++ ret = err; |
764 |
++ } |
765 |
++ } |
766 |
+ |
767 |
+- return err; |
768 |
++ return ret; |
769 |
+ } |
770 |
+ EXPORT_SYMBOL_GPL(snd_soc_put_volsw); |
771 |
+ |
772 |
+@@ -522,7 +528,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
773 |
+ unsigned int mask = (1 << fls(max)) - 1; |
774 |
+ unsigned int invert = mc->invert; |
775 |
+ unsigned int val, val_mask; |
776 |
+- int ret; |
777 |
++ int err, ret; |
778 |
+ |
779 |
+ if (invert) |
780 |
+ val = (max - ucontrol->value.integer.value[0]) & mask; |
781 |
+@@ -531,9 +537,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
782 |
+ val_mask = mask << shift; |
783 |
+ val = val << shift; |
784 |
+ |
785 |
+- ret = snd_soc_component_update_bits(component, reg, val_mask, val); |
786 |
+- if (ret < 0) |
787 |
+- return ret; |
788 |
++ err = snd_soc_component_update_bits(component, reg, val_mask, val); |
789 |
++ if (err < 0) |
790 |
++ return err; |
791 |
++ ret = err; |
792 |
+ |
793 |
+ if (snd_soc_volsw_is_stereo(mc)) { |
794 |
+ if (invert) |
795 |
+@@ -543,8 +550,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
796 |
+ val_mask = mask << shift; |
797 |
+ val = val << shift; |
798 |
+ |
799 |
+- ret = snd_soc_component_update_bits(component, rreg, val_mask, |
800 |
++ err = snd_soc_component_update_bits(component, rreg, val_mask, |
801 |
+ val); |
802 |
++ /* Don't discard any error code or drop change flag */ |
803 |
++ if (ret == 0 || err < 0) { |
804 |
++ ret = err; |
805 |
++ } |
806 |
+ } |
807 |
+ |
808 |
+ return ret; |
809 |
+diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h |
810 |
+index fc2e45d8aaf1d..f49dbd1674a61 100644 |
811 |
+--- a/tools/lib/subcmd/subcmd-util.h |
812 |
++++ b/tools/lib/subcmd/subcmd-util.h |
813 |
+@@ -49,15 +49,8 @@ static NORETURN inline void die(const char *err, ...) |
814 |
+ static inline void *xrealloc(void *ptr, size_t size) |
815 |
+ { |
816 |
+ void *ret = realloc(ptr, size); |
817 |
+- if (!ret && !size) |
818 |
+- ret = realloc(ptr, 1); |
819 |
+- if (!ret) { |
820 |
+- ret = realloc(ptr, size); |
821 |
+- if (!ret && !size) |
822 |
+- ret = realloc(ptr, 1); |
823 |
+- if (!ret) |
824 |
+- die("Out of memory, realloc failed"); |
825 |
+- } |
826 |
++ if (!ret) |
827 |
++ die("Out of memory, realloc failed"); |
828 |
+ return ret; |
829 |
+ } |
830 |
+ |
831 |
+diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh |
832 |
+index 9399c4aeaa265..d4652e295ff8a 100755 |
833 |
+--- a/tools/testing/selftests/zram/zram.sh |
834 |
++++ b/tools/testing/selftests/zram/zram.sh |
835 |
+@@ -1,9 +1,6 @@ |
836 |
+ #!/bin/bash |
837 |
+ TCID="zram.sh" |
838 |
+ |
839 |
+-# Kselftest framework requirement - SKIP code is 4. |
840 |
+-ksft_skip=4 |
841 |
+- |
842 |
+ . ./zram_lib.sh |
843 |
+ |
844 |
+ run_zram () { |
845 |
+@@ -17,14 +14,4 @@ echo "" |
846 |
+ |
847 |
+ check_prereqs |
848 |
+ |
849 |
+-# check zram module exists |
850 |
+-MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
851 |
+-if [ -f $MODULE_PATH ]; then |
852 |
+- run_zram |
853 |
+-elif [ -b /dev/zram0 ]; then |
854 |
+- run_zram |
855 |
+-else |
856 |
+- echo "$TCID : No zram.ko module or /dev/zram0 device file not found" |
857 |
+- echo "$TCID : CONFIG_ZRAM is not set" |
858 |
+- exit $ksft_skip |
859 |
+-fi |
860 |
++run_zram |
861 |
+diff --git a/tools/testing/selftests/zram/zram01.sh b/tools/testing/selftests/zram/zram01.sh |
862 |
+index b9566a6478a9c..8abc9965089d1 100755 |
863 |
+--- a/tools/testing/selftests/zram/zram01.sh |
864 |
++++ b/tools/testing/selftests/zram/zram01.sh |
865 |
+@@ -42,9 +42,7 @@ zram_algs="lzo" |
866 |
+ |
867 |
+ zram_fill_fs() |
868 |
+ { |
869 |
+- local mem_free0=$(free -m | awk 'NR==2 {print $4}') |
870 |
+- |
871 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
872 |
++ for i in $(seq $dev_start $dev_end); do |
873 |
+ echo "fill zram$i..." |
874 |
+ local b=0 |
875 |
+ while [ true ]; do |
876 |
+@@ -54,29 +52,17 @@ zram_fill_fs() |
877 |
+ b=$(($b + 1)) |
878 |
+ done |
879 |
+ echo "zram$i can be filled with '$b' KB" |
880 |
+- done |
881 |
+ |
882 |
+- local mem_free1=$(free -m | awk 'NR==2 {print $4}') |
883 |
+- local used_mem=$(($mem_free0 - $mem_free1)) |
884 |
++ local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"` |
885 |
++ local v=$((100 * 1024 * $b / $mem_used_total)) |
886 |
++ if [ "$v" -lt 100 ]; then |
887 |
++ echo "FAIL compression ratio: 0.$v:1" |
888 |
++ ERR_CODE=-1 |
889 |
++ return |
890 |
++ fi |
891 |
+ |
892 |
+- local total_size=0 |
893 |
+- for sm in $zram_sizes; do |
894 |
+- local s=$(echo $sm | sed 's/M//') |
895 |
+- total_size=$(($total_size + $s)) |
896 |
++ echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
897 |
+ done |
898 |
+- |
899 |
+- echo "zram used ${used_mem}M, zram disk sizes ${total_size}M" |
900 |
+- |
901 |
+- local v=$((100 * $total_size / $used_mem)) |
902 |
+- |
903 |
+- if [ "$v" -lt 100 ]; then |
904 |
+- echo "FAIL compression ratio: 0.$v:1" |
905 |
+- ERR_CODE=-1 |
906 |
+- zram_cleanup |
907 |
+- return |
908 |
+- fi |
909 |
+- |
910 |
+- echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
911 |
+ } |
912 |
+ |
913 |
+ check_prereqs |
914 |
+@@ -90,7 +76,6 @@ zram_mount |
915 |
+ |
916 |
+ zram_fill_fs |
917 |
+ zram_cleanup |
918 |
+-zram_unload |
919 |
+ |
920 |
+ if [ $ERR_CODE -ne 0 ]; then |
921 |
+ echo "$TCID : [FAIL]" |
922 |
+diff --git a/tools/testing/selftests/zram/zram02.sh b/tools/testing/selftests/zram/zram02.sh |
923 |
+index 74569b883737f..3768cfd2e5f83 100755 |
924 |
+--- a/tools/testing/selftests/zram/zram02.sh |
925 |
++++ b/tools/testing/selftests/zram/zram02.sh |
926 |
+@@ -45,7 +45,6 @@ zram_set_memlimit |
927 |
+ zram_makeswap |
928 |
+ zram_swapoff |
929 |
+ zram_cleanup |
930 |
+-zram_unload |
931 |
+ |
932 |
+ if [ $ERR_CODE -ne 0 ]; then |
933 |
+ echo "$TCID : [FAIL]" |
934 |
+diff --git a/tools/testing/selftests/zram/zram_lib.sh b/tools/testing/selftests/zram/zram_lib.sh |
935 |
+index 9e73a4fb9b0aa..130d193cbd727 100755 |
936 |
+--- a/tools/testing/selftests/zram/zram_lib.sh |
937 |
++++ b/tools/testing/selftests/zram/zram_lib.sh |
938 |
+@@ -14,12 +14,17 @@ |
939 |
+ # Author: Alexey Kodanev <alexey.kodanev@××××××.com> |
940 |
+ # Modified: Naresh Kamboju <naresh.kamboju@××××××.org> |
941 |
+ |
942 |
+-MODULE=0 |
943 |
+ dev_makeswap=-1 |
944 |
+ dev_mounted=-1 |
945 |
+- |
946 |
++dev_start=0 |
947 |
++dev_end=-1 |
948 |
++module_load=-1 |
949 |
++sys_control=-1 |
950 |
+ # Kselftest framework requirement - SKIP code is 4. |
951 |
+ ksft_skip=4 |
952 |
++kernel_version=`uname -r | cut -d'.' -f1,2` |
953 |
++kernel_major=${kernel_version%.*} |
954 |
++kernel_minor=${kernel_version#*.} |
955 |
+ |
956 |
+ trap INT |
957 |
+ |
958 |
+@@ -34,68 +39,104 @@ check_prereqs() |
959 |
+ fi |
960 |
+ } |
961 |
+ |
962 |
++kernel_gte() |
963 |
++{ |
964 |
++ major=${1%.*} |
965 |
++ minor=${1#*.} |
966 |
++ |
967 |
++ if [ $kernel_major -gt $major ]; then |
968 |
++ return 0 |
969 |
++ elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then |
970 |
++ return 0 |
971 |
++ fi |
972 |
++ |
973 |
++ return 1 |
974 |
++} |
975 |
++ |
976 |
+ zram_cleanup() |
977 |
+ { |
978 |
+ echo "zram cleanup" |
979 |
+ local i= |
980 |
+- for i in $(seq 0 $dev_makeswap); do |
981 |
++ for i in $(seq $dev_start $dev_makeswap); do |
982 |
+ swapoff /dev/zram$i |
983 |
+ done |
984 |
+ |
985 |
+- for i in $(seq 0 $dev_mounted); do |
986 |
++ for i in $(seq $dev_start $dev_mounted); do |
987 |
+ umount /dev/zram$i |
988 |
+ done |
989 |
+ |
990 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
991 |
++ for i in $(seq $dev_start $dev_end); do |
992 |
+ echo 1 > /sys/block/zram${i}/reset |
993 |
+ rm -rf zram$i |
994 |
+ done |
995 |
+ |
996 |
+-} |
997 |
++ if [ $sys_control -eq 1 ]; then |
998 |
++ for i in $(seq $dev_start $dev_end); do |
999 |
++ echo $i > /sys/class/zram-control/hot_remove |
1000 |
++ done |
1001 |
++ fi |
1002 |
+ |
1003 |
+-zram_unload() |
1004 |
+-{ |
1005 |
+- if [ $MODULE -ne 0 ] ; then |
1006 |
+- echo "zram rmmod zram" |
1007 |
++ if [ $module_load -eq 1 ]; then |
1008 |
+ rmmod zram > /dev/null 2>&1 |
1009 |
+ fi |
1010 |
+ } |
1011 |
+ |
1012 |
+ zram_load() |
1013 |
+ { |
1014 |
+- # check zram module exists |
1015 |
+- MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
1016 |
+- if [ -f $MODULE_PATH ]; then |
1017 |
+- MODULE=1 |
1018 |
+- echo "create '$dev_num' zram device(s)" |
1019 |
+- modprobe zram num_devices=$dev_num |
1020 |
+- if [ $? -ne 0 ]; then |
1021 |
+- echo "failed to insert zram module" |
1022 |
+- exit 1 |
1023 |
+- fi |
1024 |
+- |
1025 |
+- dev_num_created=$(ls /dev/zram* | wc -w) |
1026 |
++ echo "create '$dev_num' zram device(s)" |
1027 |
++ |
1028 |
++ # zram module loaded, new kernel |
1029 |
++ if [ -d "/sys/class/zram-control" ]; then |
1030 |
++ echo "zram modules already loaded, kernel supports" \ |
1031 |
++ "zram-control interface" |
1032 |
++ dev_start=$(ls /dev/zram* | wc -w) |
1033 |
++ dev_end=$(($dev_start + $dev_num - 1)) |
1034 |
++ sys_control=1 |
1035 |
++ |
1036 |
++ for i in $(seq $dev_start $dev_end); do |
1037 |
++ cat /sys/class/zram-control/hot_add > /dev/null |
1038 |
++ done |
1039 |
++ |
1040 |
++ echo "all zram devices (/dev/zram$dev_start~$dev_end" \ |
1041 |
++ "successfully created" |
1042 |
++ return 0 |
1043 |
++ fi |
1044 |
+ |
1045 |
+- if [ "$dev_num_created" -ne "$dev_num" ]; then |
1046 |
+- echo "unexpected num of devices: $dev_num_created" |
1047 |
+- ERR_CODE=-1 |
1048 |
++ # detect old kernel or built-in |
1049 |
++ modprobe zram num_devices=$dev_num |
1050 |
++ if [ ! -d "/sys/class/zram-control" ]; then |
1051 |
++ if grep -q '^zram' /proc/modules; then |
1052 |
++ rmmod zram > /dev/null 2>&1 |
1053 |
++ if [ $? -ne 0 ]; then |
1054 |
++ echo "zram module is being used on old kernel" \ |
1055 |
++ "without zram-control interface" |
1056 |
++ exit $ksft_skip |
1057 |
++ fi |
1058 |
+ else |
1059 |
+- echo "zram load module successful" |
1060 |
++ echo "test needs CONFIG_ZRAM=m on old kernel without" \ |
1061 |
++ "zram-control interface" |
1062 |
++ exit $ksft_skip |
1063 |
+ fi |
1064 |
+- elif [ -b /dev/zram0 ]; then |
1065 |
+- echo "/dev/zram0 device file found: OK" |
1066 |
+- else |
1067 |
+- echo "ERROR: No zram.ko module or no /dev/zram0 device found" |
1068 |
+- echo "$TCID : CONFIG_ZRAM is not set" |
1069 |
+- exit 1 |
1070 |
++ modprobe zram num_devices=$dev_num |
1071 |
+ fi |
1072 |
++ |
1073 |
++ module_load=1 |
1074 |
++ dev_end=$(($dev_num - 1)) |
1075 |
++ echo "all zram devices (/dev/zram0~$dev_end) successfully created" |
1076 |
+ } |
1077 |
+ |
1078 |
+ zram_max_streams() |
1079 |
+ { |
1080 |
+ echo "set max_comp_streams to zram device(s)" |
1081 |
+ |
1082 |
+- local i=0 |
1083 |
++ kernel_gte 4.7 |
1084 |
++ if [ $? -eq 0 ]; then |
1085 |
++ echo "The device attribute max_comp_streams was"\ |
1086 |
++ "deprecated in 4.7" |
1087 |
++ return 0 |
1088 |
++ fi |
1089 |
++ |
1090 |
++ local i=$dev_start |
1091 |
+ for max_s in $zram_max_streams; do |
1092 |
+ local sys_path="/sys/block/zram${i}/max_comp_streams" |
1093 |
+ echo $max_s > $sys_path || \ |
1094 |
+@@ -107,7 +148,7 @@ zram_max_streams() |
1095 |
+ echo "FAIL can't set max_streams '$max_s', get $max_stream" |
1096 |
+ |
1097 |
+ i=$(($i + 1)) |
1098 |
+- echo "$sys_path = '$max_streams' ($i/$dev_num)" |
1099 |
++ echo "$sys_path = '$max_streams'" |
1100 |
+ done |
1101 |
+ |
1102 |
+ echo "zram max streams: OK" |
1103 |
+@@ -117,15 +158,16 @@ zram_compress_alg() |
1104 |
+ { |
1105 |
+ echo "test that we can set compression algorithm" |
1106 |
+ |
1107 |
+- local algs=$(cat /sys/block/zram0/comp_algorithm) |
1108 |
++ local i=$dev_start |
1109 |
++ local algs=$(cat /sys/block/zram${i}/comp_algorithm) |
1110 |
+ echo "supported algs: $algs" |
1111 |
+- local i=0 |
1112 |
++ |
1113 |
+ for alg in $zram_algs; do |
1114 |
+ local sys_path="/sys/block/zram${i}/comp_algorithm" |
1115 |
+ echo "$alg" > $sys_path || \ |
1116 |
+ echo "FAIL can't set '$alg' to $sys_path" |
1117 |
+ i=$(($i + 1)) |
1118 |
+- echo "$sys_path = '$alg' ($i/$dev_num)" |
1119 |
++ echo "$sys_path = '$alg'" |
1120 |
+ done |
1121 |
+ |
1122 |
+ echo "zram set compression algorithm: OK" |
1123 |
+@@ -134,14 +176,14 @@ zram_compress_alg() |
1124 |
+ zram_set_disksizes() |
1125 |
+ { |
1126 |
+ echo "set disk size to zram device(s)" |
1127 |
+- local i=0 |
1128 |
++ local i=$dev_start |
1129 |
+ for ds in $zram_sizes; do |
1130 |
+ local sys_path="/sys/block/zram${i}/disksize" |
1131 |
+ echo "$ds" > $sys_path || \ |
1132 |
+ echo "FAIL can't set '$ds' to $sys_path" |
1133 |
+ |
1134 |
+ i=$(($i + 1)) |
1135 |
+- echo "$sys_path = '$ds' ($i/$dev_num)" |
1136 |
++ echo "$sys_path = '$ds'" |
1137 |
+ done |
1138 |
+ |
1139 |
+ echo "zram set disksizes: OK" |
1140 |
+@@ -151,14 +193,14 @@ zram_set_memlimit() |
1141 |
+ { |
1142 |
+ echo "set memory limit to zram device(s)" |
1143 |
+ |
1144 |
+- local i=0 |
1145 |
++ local i=$dev_start |
1146 |
+ for ds in $zram_mem_limits; do |
1147 |
+ local sys_path="/sys/block/zram${i}/mem_limit" |
1148 |
+ echo "$ds" > $sys_path || \ |
1149 |
+ echo "FAIL can't set '$ds' to $sys_path" |
1150 |
+ |
1151 |
+ i=$(($i + 1)) |
1152 |
+- echo "$sys_path = '$ds' ($i/$dev_num)" |
1153 |
++ echo "$sys_path = '$ds'" |
1154 |
+ done |
1155 |
+ |
1156 |
+ echo "zram set memory limit: OK" |
1157 |
+@@ -167,8 +209,8 @@ zram_set_memlimit() |
1158 |
+ zram_makeswap() |
1159 |
+ { |
1160 |
+ echo "make swap with zram device(s)" |
1161 |
+- local i=0 |
1162 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1163 |
++ local i=$dev_start |
1164 |
++ for i in $(seq $dev_start $dev_end); do |
1165 |
+ mkswap /dev/zram$i > err.log 2>&1 |
1166 |
+ if [ $? -ne 0 ]; then |
1167 |
+ cat err.log |
1168 |
+@@ -191,7 +233,7 @@ zram_makeswap() |
1169 |
+ zram_swapoff() |
1170 |
+ { |
1171 |
+ local i= |
1172 |
+- for i in $(seq 0 $dev_makeswap); do |
1173 |
++ for i in $(seq $dev_start $dev_end); do |
1174 |
+ swapoff /dev/zram$i > err.log 2>&1 |
1175 |
+ if [ $? -ne 0 ]; then |
1176 |
+ cat err.log |
1177 |
+@@ -205,7 +247,7 @@ zram_swapoff() |
1178 |
+ |
1179 |
+ zram_makefs() |
1180 |
+ { |
1181 |
+- local i=0 |
1182 |
++ local i=$dev_start |
1183 |
+ for fs in $zram_filesystems; do |
1184 |
+ # if requested fs not supported default it to ext2 |
1185 |
+ which mkfs.$fs > /dev/null 2>&1 || fs=ext2 |
1186 |
+@@ -224,7 +266,7 @@ zram_makefs() |
1187 |
+ zram_mount() |
1188 |
+ { |
1189 |
+ local i=0 |
1190 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1191 |
++ for i in $(seq $dev_start $dev_end); do |
1192 |
+ echo "mount /dev/zram$i" |
1193 |
+ mkdir zram$i |
1194 |
+ mount /dev/zram$i zram$i > /dev/null || \ |