| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * multipath.c : Multiple Devices driver for Linux |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 8 | 9 | * MULTIPATH management functions. |
|---|
| 9 | 10 | * |
|---|
| 10 | 11 | * derived from raid1.c. |
|---|
| 11 | | - * |
|---|
| 12 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 13 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 14 | | - * the Free Software Foundation; either version 2, or (at your option) |
|---|
| 15 | | - * any later version. |
|---|
| 16 | | - * |
|---|
| 17 | | - * You should have received a copy of the GNU General Public License |
|---|
| 18 | | - * (for example /usr/src/linux/COPYING); if not, write to the Free |
|---|
| 19 | | - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|---|
| 20 | 12 | */ |
|---|
| 21 | 13 | |
|---|
| 22 | 14 | #include <linux/blkdev.h> |
|---|
| .. | .. |
|---|
| 139 | 131 | mp_bh->bio.bi_private = mp_bh; |
|---|
| 140 | 132 | mddev_check_writesame(mddev, &mp_bh->bio); |
|---|
| 141 | 133 | mddev_check_write_zeroes(mddev, &mp_bh->bio); |
|---|
| 142 | | - generic_make_request(&mp_bh->bio); |
|---|
| 134 | + submit_bio_noacct(&mp_bh->bio); |
|---|
| 143 | 135 | return true; |
|---|
| 144 | 136 | } |
|---|
| 145 | 137 | |
|---|
| .. | .. |
|---|
| 157 | 149 | } |
|---|
| 158 | 150 | rcu_read_unlock(); |
|---|
| 159 | 151 | seq_putc(seq, ']'); |
|---|
| 160 | | -} |
|---|
| 161 | | - |
|---|
| 162 | | -static int multipath_congested(struct mddev *mddev, int bits) |
|---|
| 163 | | -{ |
|---|
| 164 | | - struct mpconf *conf = mddev->private; |
|---|
| 165 | | - int i, ret = 0; |
|---|
| 166 | | - |
|---|
| 167 | | - rcu_read_lock(); |
|---|
| 168 | | - for (i = 0; i < mddev->raid_disks ; i++) { |
|---|
| 169 | | - struct md_rdev *rdev = rcu_dereference(conf->multipaths[i].rdev); |
|---|
| 170 | | - if (rdev && !test_bit(Faulty, &rdev->flags)) { |
|---|
| 171 | | - struct request_queue *q = bdev_get_queue(rdev->bdev); |
|---|
| 172 | | - |
|---|
| 173 | | - ret |= bdi_congested(q->backing_dev_info, bits); |
|---|
| 174 | | - /* Just like multipath_map, we just check the |
|---|
| 175 | | - * first available device |
|---|
| 176 | | - */ |
|---|
| 177 | | - break; |
|---|
| 178 | | - } |
|---|
| 179 | | - } |
|---|
| 180 | | - rcu_read_unlock(); |
|---|
| 181 | | - return ret; |
|---|
| 182 | 152 | } |
|---|
| 183 | 153 | |
|---|
| 184 | 154 | /* |
|---|
| .. | .. |
|---|
| 356 | 326 | bio->bi_opf |= REQ_FAILFAST_TRANSPORT; |
|---|
| 357 | 327 | bio->bi_end_io = multipath_end_request; |
|---|
| 358 | 328 | bio->bi_private = mp_bh; |
|---|
| 359 | | - generic_make_request(bio); |
|---|
| 329 | + submit_bio_noacct(bio); |
|---|
| 360 | 330 | } |
|---|
| 361 | 331 | } |
|---|
| 362 | 332 | spin_unlock_irqrestore(&conf->device_lock, flags); |
|---|
| .. | .. |
|---|
| 486 | 456 | .hot_add_disk = multipath_add_disk, |
|---|
| 487 | 457 | .hot_remove_disk= multipath_remove_disk, |
|---|
| 488 | 458 | .size = multipath_size, |
|---|
| 489 | | - .congested = multipath_congested, |
|---|
| 490 | 459 | }; |
|---|
| 491 | 460 | |
|---|
| 492 | 461 | static int __init multipath_init (void) |
|---|