@@ -2340,7 +2340,8 @@ int md_integrity_register(struct mddev *mddev)
23402340 bdev_get_integrity (reference -> bdev ));
23412341
23422342 pr_debug ("md: data integrity enabled on %s\n" , mdname (mddev ));
2343- if (bioset_integrity_create (& mddev -> bio_set , BIO_POOL_SIZE )) {
2343+ if (bioset_integrity_create (& mddev -> bio_set , BIO_POOL_SIZE ) ||
2344+ bioset_integrity_create (& mddev -> io_acct_set , BIO_POOL_SIZE )) {
23442345 pr_err ("md: failed to create integrity pool for %s\n" ,
23452346 mdname (mddev ));
23462347 return - EINVAL ;
@@ -5569,6 +5570,7 @@ static void md_free(struct kobject *ko)
55695570
55705571 bioset_exit (& mddev -> bio_set );
55715572 bioset_exit (& mddev -> sync_set );
5573+ bioset_exit (& mddev -> io_acct_set );
55725574 kfree (mddev );
55735575}
55745576
@@ -5862,7 +5864,13 @@ int md_run(struct mddev *mddev)
58625864 if (!bioset_initialized (& mddev -> sync_set )) {
58635865 err = bioset_init (& mddev -> sync_set , BIO_POOL_SIZE , 0 , BIOSET_NEED_BVECS );
58645866 if (err )
5865- return err ;
5867+ goto exit_bio_set ;
5868+ }
5869+ if (!bioset_initialized (& mddev -> io_acct_set )) {
5870+ err = bioset_init (& mddev -> io_acct_set , BIO_POOL_SIZE ,
5871+ offsetof(struct md_io_acct , bio_clone ), 0 );
5872+ if (err )
5873+ goto exit_sync_set ;
58665874 }
58675875
58685876 spin_lock (& pers_lock );
@@ -5990,6 +5998,7 @@ int md_run(struct mddev *mddev)
59905998 blk_queue_flag_set (QUEUE_FLAG_NONROT , mddev -> queue );
59915999 else
59926000 blk_queue_flag_clear (QUEUE_FLAG_NONROT , mddev -> queue );
6001+ blk_queue_flag_set (QUEUE_FLAG_IO_STAT , mddev -> queue );
59936002 }
59946003 if (pers -> sync_request ) {
59956004 if (mddev -> kobj .sd &&
@@ -6039,8 +6048,11 @@ int md_run(struct mddev *mddev)
60396048 module_put (pers -> owner );
60406049 md_bitmap_destroy (mddev );
60416050abort :
6042- bioset_exit (& mddev -> bio_set );
6051+ bioset_exit (& mddev -> io_acct_set );
6052+ exit_sync_set :
60436053 bioset_exit (& mddev -> sync_set );
6054+ exit_bio_set :
6055+ bioset_exit (& mddev -> bio_set );
60446056 return err ;
60456057}
60466058EXPORT_SYMBOL_GPL (md_run );
@@ -6264,6 +6276,7 @@ void md_stop(struct mddev *mddev)
62646276 __md_stop (mddev );
62656277 bioset_exit (& mddev -> bio_set );
62666278 bioset_exit (& mddev -> sync_set );
6279+ bioset_exit (& mddev -> io_acct_set );
62676280}
62686281
62696282EXPORT_SYMBOL_GPL (md_stop );
@@ -8568,6 +8581,38 @@ void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
85688581}
85698582EXPORT_SYMBOL_GPL (md_submit_discard_bio );
85708583
8584+ static void md_end_io_acct (struct bio * bio )
8585+ {
8586+ struct md_io_acct * md_io_acct = bio -> bi_private ;
8587+ struct bio * orig_bio = md_io_acct -> orig_bio ;
8588+
8589+ orig_bio -> bi_status = bio -> bi_status ;
8590+
8591+ bio_end_io_acct (orig_bio , md_io_acct -> start_time );
8592+ bio_put (bio );
8593+ bio_endio (orig_bio );
8594+ }
8595+
8596+ /* used by personalities (raid0 and raid5) to account io stats */
8597+ void md_account_bio (struct mddev * mddev , struct bio * * bio )
8598+ {
8599+ struct md_io_acct * md_io_acct ;
8600+ struct bio * clone ;
8601+
8602+ if (!blk_queue_io_stat ((* bio )-> bi_bdev -> bd_disk -> queue ))
8603+ return ;
8604+
8605+ clone = bio_clone_fast (* bio , GFP_NOIO , & mddev -> io_acct_set );
8606+ md_io_acct = container_of (clone , struct md_io_acct , bio_clone );
8607+ md_io_acct -> orig_bio = * bio ;
8608+ md_io_acct -> start_time = bio_start_io_acct (* bio );
8609+
8610+ clone -> bi_end_io = md_end_io_acct ;
8611+ clone -> bi_private = md_io_acct ;
8612+ * bio = clone ;
8613+ }
8614+ EXPORT_SYMBOL_GPL (md_account_bio );
8615+
85718616/* md_allow_write(mddev)
85728617 * Calling this ensures that the array is marked 'active' so that writes
85738618 * may proceed without blocking. It is important to call this before
0 commit comments