forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/md/raid0.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 raid0.c : Multiple Devices driver for Linux
34 Copyright (C) 1994-96 Marc ZYNGIER
....@@ -7,14 +8,6 @@
78
89 RAID-0 management functions.
910
10
- This program is free software; you can redistribute it and/or modify
11
- it under the terms of the GNU General Public License as published by
12
- the Free Software Foundation; either version 2, or (at your option)
13
- any later version.
14
-
15
- You should have received a copy of the GNU General Public License
16
- (for example /usr/src/linux/COPYING); if not, write to the Free
17
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1811 */
1912
2013 #include <linux/blkdev.h>
....@@ -36,21 +29,6 @@
3629 (1L << MD_HAS_PPL) | \
3730 (1L << MD_HAS_MULTIPLE_PPLS))
3831
39
-static int raid0_congested(struct mddev *mddev, int bits)
40
-{
41
- struct r0conf *conf = mddev->private;
42
- struct md_rdev **devlist = conf->devlist;
43
- int raid_disks = conf->strip_zone[0].nb_dev;
44
- int i, ret = 0;
45
-
46
- for (i = 0; i < raid_disks && !ret ; i++) {
47
- struct request_queue *q = bdev_get_queue(devlist[i]->bdev);
48
-
49
- ret |= bdi_congested(q->backing_dev_info, bits);
50
- }
51
- return ret;
52
-}
53
-
5432 /*
5533 * inform the user of the raid configuration
5634 */
....@@ -70,7 +48,7 @@
7048 int len = 0;
7149
7250 for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
73
- len += snprintf(line+len, 200-len, "%s%s", k?"/":"",
51
+ len += scnprintf(line+len, 200-len, "%s%s", k?"/":"",
7452 bdevname(conf->devlist[j*raid_disks
7553 + k]->bdev, b));
7654 pr_debug("md: zone%d=[%s]\n", j, line);
....@@ -150,21 +128,6 @@
150128 pr_debug("md/raid0:%s: FINAL %d zones\n",
151129 mdname(mddev), conf->nr_strip_zones);
152130
153
- if (conf->nr_strip_zones == 1) {
154
- conf->layout = RAID0_ORIG_LAYOUT;
155
- } else if (mddev->layout == RAID0_ORIG_LAYOUT ||
156
- mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
157
- conf->layout = mddev->layout;
158
- } else if (default_layout == RAID0_ORIG_LAYOUT ||
159
- default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
160
- conf->layout = default_layout;
161
- } else {
162
- pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n",
163
- mdname(mddev));
164
- pr_err("md/raid0: please set raid0.default_layout to 1 or 2\n");
165
- err = -ENOTSUPP;
166
- goto abort;
167
- }
168131 /*
169132 * now since we have the hard sector sizes, we can make sure
170133 * chunk size is a multiple of that sector size
....@@ -293,6 +256,22 @@
293256 pr_debug("md/raid0:%s: current zone start: %llu\n",
294257 mdname(mddev),
295258 (unsigned long long)smallest->sectors);
259
+ }
260
+
261
+ if (conf->nr_strip_zones == 1 || conf->strip_zone[1].nb_dev == 1) {
262
+ conf->layout = RAID0_ORIG_LAYOUT;
263
+ } else if (mddev->layout == RAID0_ORIG_LAYOUT ||
264
+ mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
265
+ conf->layout = mddev->layout;
266
+ } else if (default_layout == RAID0_ORIG_LAYOUT ||
267
+ default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
268
+ conf->layout = default_layout;
269
+ } else {
270
+ pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n",
271
+ mdname(mddev));
272
+ pr_err("md/raid0: please set raid0.default_layout to 1 or 2\n");
273
+ err = -EOPNOTSUPP;
274
+ goto abort;
296275 }
297276
298277 pr_debug("md/raid0:%s: done.\n", mdname(mddev));
....@@ -432,22 +411,6 @@
432411 mdname(mddev),
433412 (unsigned long long)mddev->array_sectors);
434413
435
- if (mddev->queue) {
436
- /* calculate the max read-ahead size.
437
- * For read-ahead of large files to be effective, we need to
438
- * readahead at least twice a whole stripe. i.e. number of devices
439
- * multiplied by chunk size times 2.
440
- * If an individual device has an ra_pages greater than the
441
- * chunk size, then we will not drive that device as hard as it
442
- * wants. We consider this a configuration error: a larger
443
- * chunksize should be used in that case.
444
- */
445
- int stripe = mddev->raid_disks *
446
- (mddev->chunk_sectors << 9) / PAGE_SIZE;
447
- if (mddev->queue->backing_dev_info->ra_pages < 2* stripe)
448
- mddev->queue->backing_dev_info->ra_pages = 2* stripe;
449
- }
450
-
451414 dump_zones(mddev);
452415
453416 ret = md_integrity_register(mddev);
....@@ -462,23 +425,6 @@
462425 kfree(conf->strip_zone);
463426 kfree(conf->devlist);
464427 kfree(conf);
465
-}
466
-
467
-/*
468
- * Is io distribute over 1 or more chunks ?
469
-*/
470
-static inline int is_io_in_chunk_boundary(struct mddev *mddev,
471
- unsigned int chunk_sects, struct bio *bio)
472
-{
473
- if (likely(is_power_of_2(chunk_sects))) {
474
- return chunk_sects >=
475
- ((bio->bi_iter.bi_sector & (chunk_sects-1))
476
- + bio_sectors(bio));
477
- } else{
478
- sector_t sector = bio->bi_iter.bi_sector;
479
- return chunk_sects >= (sector_div(sector, chunk_sects)
480
- + bio_sectors(bio));
481
- }
482428 }
483429
484430 static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
....@@ -502,7 +448,7 @@
502448 zone->zone_end - bio->bi_iter.bi_sector, GFP_NOIO,
503449 &mddev->bio_set);
504450 bio_chain(split, bio);
505
- generic_make_request(bio);
451
+ submit_bio_noacct(bio);
506452 bio = split;
507453 end = zone->zone_end;
508454 } else
....@@ -561,13 +507,12 @@
561507 !discard_bio)
562508 continue;
563509 bio_chain(discard_bio, bio);
564
- bio_clone_blkcg_association(discard_bio, bio);
510
+ bio_clone_blkg_association(discard_bio, bio);
565511 if (mddev->gendisk)
566512 trace_block_bio_remap(bdev_get_queue(rdev->bdev),
567513 discard_bio, disk_devt(mddev->gendisk),
568514 bio->bi_iter.bi_sector);
569
- bio_clear_flag(bio, BIO_QUEUE_ENTERED);
570
- generic_make_request(discard_bio);
515
+ submit_bio_noacct(discard_bio);
571516 }
572517 bio_endio(bio);
573518 }
....@@ -608,7 +553,7 @@
608553 struct bio *split = bio_split(bio, sectors, GFP_NOIO,
609554 &mddev->bio_set);
610555 bio_chain(split, bio);
611
- generic_make_request(bio);
556
+ submit_bio_noacct(bio);
612557 bio = split;
613558 }
614559
....@@ -627,6 +572,11 @@
627572 return true;
628573 }
629574
575
+ if (unlikely(is_mddev_broken(tmp_dev, "raid0"))) {
576
+ bio_io_error(bio);
577
+ return true;
578
+ }
579
+
630580 bio_set_dev(bio, tmp_dev->bdev);
631581 bio->bi_iter.bi_sector = sector + zone->dev_start +
632582 tmp_dev->data_offset;
....@@ -636,8 +586,7 @@
636586 disk_devt(mddev->gendisk), bio_sector);
637587 mddev_check_writesame(mddev, bio);
638588 mddev_check_write_zeroes(mddev, bio);
639
- bio_clear_flag(bio, BIO_QUEUE_ENTERED);
640
- generic_make_request(bio);
589
+ submit_bio_noacct(bio);
641590 return true;
642591 }
643592
....@@ -822,7 +771,6 @@
822771 .size = raid0_size,
823772 .takeover = raid0_takeover,
824773 .quiesce = raid0_quiesce,
825
- .congested = raid0_congested,
826774 };
827775
828776 static int __init raid0_init (void)