Gentoo Archives: gentoo-commits

From: Mike Pagano <mpagano@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/linux-patches:4.9 commit in: /
Date: Wed, 23 Feb 2022 12:40:47
Message-Id: 1645620029.cd46743bf50ca75b829e770d3418dc387a5e6350.mpagano@gentoo
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 || \