Skip to content

Commit daee202

Browse files
GuoqingJiang-Linuxliu-song-6
authored andcommitted
md: check level before create and exit io_acct_set
The bio_set (io_acct_set) is used by personalities to clone bio and trace the timestamp of bio. Some personalities such as raid1/10 don't need the bio_set, so add check to not create it unconditionally. Also update the comment for md_account_bio to make it more clear. Suggested-by: Christoph Hellwig <[email protected]> Signed-off-by: Guoqing Jiang <[email protected]> Signed-off-by: Song Liu <[email protected]>
1 parent c32dc04 commit daee202

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

drivers/md/md.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2341,7 +2341,8 @@ int md_integrity_register(struct mddev *mddev)
23412341

23422342
pr_debug("md: data integrity enabled on %s\n", mdname(mddev));
23432343
if (bioset_integrity_create(&mddev->bio_set, BIO_POOL_SIZE) ||
2344-
bioset_integrity_create(&mddev->io_acct_set, BIO_POOL_SIZE)) {
2344+
(mddev->level != 1 && mddev->level != 10 &&
2345+
bioset_integrity_create(&mddev->io_acct_set, BIO_POOL_SIZE))) {
23452346
pr_err("md: failed to create integrity pool for %s\n",
23462347
mdname(mddev));
23472348
return -EINVAL;
@@ -5570,7 +5571,8 @@ static void md_free(struct kobject *ko)
55705571

55715572
bioset_exit(&mddev->bio_set);
55725573
bioset_exit(&mddev->sync_set);
5573-
bioset_exit(&mddev->io_acct_set);
5574+
if (mddev->level != 1 && mddev->level != 10)
5575+
bioset_exit(&mddev->io_acct_set);
55745576
kfree(mddev);
55755577
}
55765578

@@ -5866,7 +5868,8 @@ int md_run(struct mddev *mddev)
58665868
if (err)
58675869
goto exit_bio_set;
58685870
}
5869-
if (!bioset_initialized(&mddev->io_acct_set)) {
5871+
if (mddev->level != 1 && mddev->level != 10 &&
5872+
!bioset_initialized(&mddev->io_acct_set)) {
58705873
err = bioset_init(&mddev->io_acct_set, BIO_POOL_SIZE,
58715874
offsetof(struct md_io_acct, bio_clone), 0);
58725875
if (err)
@@ -6048,7 +6051,8 @@ int md_run(struct mddev *mddev)
60486051
module_put(pers->owner);
60496052
md_bitmap_destroy(mddev);
60506053
abort:
6051-
bioset_exit(&mddev->io_acct_set);
6054+
if (mddev->level != 1 && mddev->level != 10)
6055+
bioset_exit(&mddev->io_acct_set);
60526056
exit_sync_set:
60536057
bioset_exit(&mddev->sync_set);
60546058
exit_bio_set:
@@ -6276,7 +6280,8 @@ void md_stop(struct mddev *mddev)
62766280
__md_stop(mddev);
62776281
bioset_exit(&mddev->bio_set);
62786282
bioset_exit(&mddev->sync_set);
6279-
bioset_exit(&mddev->io_acct_set);
6283+
if (mddev->level != 1 && mddev->level != 10)
6284+
bioset_exit(&mddev->io_acct_set);
62806285
}
62816286

62826287
EXPORT_SYMBOL_GPL(md_stop);
@@ -8593,7 +8598,10 @@ static void md_end_io_acct(struct bio *bio)
85938598
bio_endio(orig_bio);
85948599
}
85958600

8596-
/* used by personalities (raid0 and raid5) to account io stats */
8601+
/*
8602+
* Used by personalities that don't already clone the bio and thus can't
8603+
* easily add the timestamp to their extended bio structure.
8604+
*/
85978605
void md_account_bio(struct mddev *mddev, struct bio **bio)
85988606
{
85998607
struct md_io_acct *md_io_acct;

0 commit comments

Comments
 (0)