Many of the interface functions dereference conf->log in inline helpers in raid5-log.h. Refactor all off these to dereference conf->log inside the function instead. This will help to fix the rcu locking when accessing conf->log. No functional changes intended. Signed-off-by: Logan Gunthorpe <logang@xxxxxxxxxxxx> Reviewed-by: Christoph Hellwig <hch@xxxxxx> --- drivers/md/raid5-cache.c | 18 +++++++++++------- drivers/md/raid5-log.h | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 3427f95cb358..24110b687055 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -1006,9 +1006,9 @@ static inline void r5l_add_no_space_stripe(struct r5l_log *log, * running in raid5d, where reclaim could wait for raid5d too (when it flushes * data from log to raid disks), so we shouldn't wait for reclaim here */ -int r5l_write_stripe(struct r5l_log *log, struct stripe_head *sh) +int r5l_write_stripe(struct r5conf *conf, struct stripe_head *sh) { - struct r5conf *conf = sh->raid_conf; + struct r5l_log *log = conf->log; int write_disks = 0; int data_pages, parity_pages; int reserve; @@ -1104,8 +1104,9 @@ int r5l_write_stripe(struct r5l_log *log, struct stripe_head *sh) return 0; } -void r5l_write_stripe_run(struct r5l_log *log) +void r5l_write_stripe_run(struct r5conf *conf) { + struct r5l_log *log = conf->log; if (!log) return; mutex_lock(&log->io_mutex); @@ -1113,8 +1114,10 @@ void r5l_write_stripe_run(struct r5l_log *log) mutex_unlock(&log->io_mutex); } -int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio) +int r5l_handle_flush_request(struct r5conf *conf, struct bio *bio) { + struct r5l_log *log = conf->log; + if (log->r5c_journal_mode == R5C_JOURNAL_MODE_WRITE_THROUGH) { /* * in write through (journal only) @@ -1582,8 +1585,9 @@ void r5l_wake_reclaim(struct r5conf *conf, sector_t space) __r5l_wake_reclaim(conf->log, space); } -void r5l_quiesce(struct r5l_log *log, int quiesce) +void r5l_quiesce(struct r5conf *conf, int quiesce) { + struct r5l_log *log = conf->log; struct mddev *mddev; if (quiesce) { @@ -2892,9 +2896,9 @@ void r5c_finish_stripe_write_out(struct r5conf *conf, set_bit(STRIPE_HANDLE, &sh->state); } -int r5c_cache_data(struct r5l_log *log, struct stripe_head *sh) +int r5c_cache_data(struct r5conf *conf, struct stripe_head *sh) { - struct r5conf *conf = sh->raid_conf; + struct r5l_log *log = conf->log; int pages = 0; int reserve; int i; diff --git a/drivers/md/raid5-log.h b/drivers/md/raid5-log.h index 7594d2d80520..e39db84c5de0 100644 --- a/drivers/md/raid5-log.h +++ b/drivers/md/raid5-log.h @@ -4,12 +4,12 @@ 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); +int r5l_write_stripe(struct r5conf *conf, struct stripe_head *head_sh); +void r5l_write_stripe_run(struct r5conf *conf); 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); +int r5l_handle_flush_request(struct r5conf *conf, struct bio *bio); +void r5l_quiesce(struct r5conf *conf, int quiesce); bool r5l_log_disk_error(struct r5conf *conf); bool r5c_conf_is_writeback(struct r5conf *conf); int r5c_try_caching_write(struct r5conf *conf, struct stripe_head *sh, @@ -21,7 +21,7 @@ void r5c_use_extra_page(struct stripe_head *sh); void r5l_wake_reclaim(struct r5conf *conf, sector_t space); void r5c_handle_cached_data_endio(struct r5conf *conf, struct stripe_head *sh, int disks); -int r5c_cache_data(struct r5l_log *log, struct stripe_head *sh); +int r5c_cache_data(struct r5conf *conf, struct stripe_head *sh); void r5c_make_stripe_write_out(struct stripe_head *sh); void r5c_flush_cache(struct r5conf *conf, int num); void r5c_check_stripe_cache_usage(struct r5conf *conf); @@ -63,10 +63,10 @@ static inline int log_stripe(struct stripe_head *sh, struct stripe_head_state *s /* writing out phase */ if (s->waiting_extra_page) return 0; - return r5l_write_stripe(conf->log, sh); + return r5l_write_stripe(conf, sh); } else if (test_bit(STRIPE_LOG_TRAPPED, &sh->state)) { /* caching phase */ - return r5c_cache_data(conf->log, sh); + return r5c_cache_data(conf, sh); } } else if (raid5_has_ppl(conf)) { return ppl_write_stripe(conf, sh); @@ -88,7 +88,7 @@ static inline void log_stripe_write_finished(struct stripe_head *sh) static inline void log_write_stripe_run(struct r5conf *conf) { if (conf->log) - r5l_write_stripe_run(conf->log); + r5l_write_stripe_run(conf); else if (raid5_has_ppl(conf)) ppl_write_stripe_run(conf); } @@ -106,7 +106,7 @@ static inline int log_handle_flush_request(struct r5conf *conf, struct bio *bio) int ret = -ENODEV; if (conf->log) - ret = r5l_handle_flush_request(conf->log, bio); + ret = r5l_handle_flush_request(conf, bio); else if (raid5_has_ppl(conf)) ret = ppl_handle_flush_request(conf->log, bio); @@ -116,7 +116,7 @@ static inline int log_handle_flush_request(struct r5conf *conf, struct bio *bio) static inline void log_quiesce(struct r5conf *conf, int quiesce) { if (conf->log) - r5l_quiesce(conf->log, quiesce); + r5l_quiesce(conf, quiesce); else if (raid5_has_ppl(conf)) ppl_quiesce(conf, quiesce); } -- 2.30.2