Magellan Linux

Contents of /trunk/kernel-alx-legacy/patches-4.9/0402-4.9.303-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


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