All calls to r5l_flush_stripe_to_raid() have to dereference conf to get the log. The log pointer should be protected by RCU, but isn't. Push the dereference of conf->log into r5l_flush_stripe_to_raid() to reduce the number of sites that dereference conf->log so this can be improved. No functional changes intended. Signed-off-by: Logan Gunthorpe <logang@xxxxxxxxxxxx> --- drivers/md/raid5-cache.c | 3 ++- drivers/md/raid5-log.h | 4 ++-- drivers/md/raid5.c | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 0049c4f45e9c..6db8040fb01b 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -1287,8 +1287,9 @@ static void r5l_log_flush_endio(struct bio *bio) * only write stripes of an io_unit to raid disks till the io_unit is the first * one whose data/parity is in log. */ -void r5l_flush_stripe_to_raid(struct r5l_log *log) +void r5l_flush_stripe_to_raid(struct r5conf *conf) { + struct r5l_log *log = conf->log; bool do_flush; if (!log || !log->need_cache_flush) diff --git a/drivers/md/raid5-log.h b/drivers/md/raid5-log.h index c6f877df4f3e..ead541075528 100644 --- a/drivers/md/raid5-log.h +++ b/drivers/md/raid5-log.h @@ -6,7 +6,7 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev); void r5l_exit_log(struct r5conf *conf); int r5l_write_stripe(struct r5l_log *log, struct stripe_head *head_sh); void r5l_write_stripe_run(struct r5l_log *log); -void r5l_flush_stripe_to_raid(struct r5l_log *log); +void r5l_flush_stripe_to_raid(struct r5conf *conf); void r5l_stripe_write_finished(struct stripe_head *sh); int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio); void r5l_quiesce(struct r5l_log *log, int quiesce); @@ -96,7 +96,7 @@ static inline void log_write_stripe_run(struct r5conf *conf) static inline void log_flush_stripe_to_raid(struct r5conf *conf) { if (conf->log) - r5l_flush_stripe_to_raid(conf->log); + r5l_flush_stripe_to_raid(conf); else if (raid5_has_ppl(conf)) ppl_write_stripe_run(conf); } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 355760f34cb6..436be2a42cc1 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6427,7 +6427,7 @@ static int handle_active_stripes(struct r5conf *conf, int group, release_inactive_stripe_list(conf, temp_inactive_list, NR_STRIPE_HASH_LOCKS); - r5l_flush_stripe_to_raid(conf->log); + r5l_flush_stripe_to_raid(conf); if (release_inactive) { spin_lock_irq(&conf->device_lock); return 0; @@ -6483,7 +6483,7 @@ static void raid5_do_work(struct work_struct *work) flush_deferred_bios(conf); - r5l_flush_stripe_to_raid(conf->log); + r5l_flush_stripe_to_raid(conf); async_tx_issue_pending_all(); blk_finish_plug(&plug); @@ -6570,7 +6570,7 @@ static void raid5d(struct md_thread *thread) flush_deferred_bios(conf); - r5l_flush_stripe_to_raid(conf->log); + r5l_flush_stripe_to_raid(conf); async_tx_issue_pending_all(); blk_finish_plug(&plug); -- 2.30.2