brintos

brintos / linux-shallow public Read only

0
0
Text · 4.4 KiB · c833250 Raw
152 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _RAID5_LOG_H3#define _RAID5_LOG_H4 5int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev);6void r5l_exit_log(struct r5conf *conf);7int r5l_write_stripe(struct r5l_log *log, struct stripe_head *head_sh);8void r5l_write_stripe_run(struct r5l_log *log);9void r5l_flush_stripe_to_raid(struct r5l_log *log);10void r5l_stripe_write_finished(struct stripe_head *sh);11int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio);12void r5l_quiesce(struct r5l_log *log, int quiesce);13bool r5l_log_disk_error(struct r5conf *conf);14bool r5c_is_writeback(struct r5l_log *log);15int r5c_try_caching_write(struct r5conf *conf, struct stripe_head *sh,16			  struct stripe_head_state *s, int disks);17void r5c_finish_stripe_write_out(struct r5conf *conf, struct stripe_head *sh,18				 struct stripe_head_state *s);19void r5c_release_extra_page(struct stripe_head *sh);20void r5c_use_extra_page(struct stripe_head *sh);21void r5l_wake_reclaim(struct r5l_log *log, sector_t space);22void r5c_handle_cached_data_endio(struct r5conf *conf,23				  struct stripe_head *sh, int disks);24int r5c_cache_data(struct r5l_log *log, struct stripe_head *sh);25void r5c_make_stripe_write_out(struct stripe_head *sh);26void r5c_flush_cache(struct r5conf *conf, int num);27void r5c_check_stripe_cache_usage(struct r5conf *conf);28void r5c_check_cached_full_stripe(struct r5conf *conf);29extern struct md_sysfs_entry r5c_journal_mode;30void r5c_update_on_rdev_error(struct mddev *mddev, struct md_rdev *rdev);31bool r5c_big_stripe_cached(struct r5conf *conf, sector_t sect);32int r5l_start(struct r5l_log *log);33 34struct dma_async_tx_descriptor *35ops_run_partial_parity(struct stripe_head *sh, struct raid5_percpu *percpu,36		       struct dma_async_tx_descriptor *tx);37int ppl_init_log(struct r5conf *conf);38void ppl_exit_log(struct r5conf *conf);39int ppl_write_stripe(struct r5conf *conf, struct stripe_head *sh);40void ppl_write_stripe_run(struct r5conf *conf);41void ppl_stripe_write_finished(struct stripe_head *sh);42int ppl_modify_log(struct r5conf *conf, struct md_rdev *rdev, bool add);43void ppl_quiesce(struct r5conf *conf, int quiesce);44int ppl_handle_flush_request(struct bio *bio);45extern struct md_sysfs_entry ppl_write_hint;46 47static inline bool raid5_has_log(struct r5conf *conf)48{49	return test_bit(MD_HAS_JOURNAL, &conf->mddev->flags);50}51 52static inline bool raid5_has_ppl(struct r5conf *conf)53{54	return test_bit(MD_HAS_PPL, &conf->mddev->flags);55}56 57static inline int log_stripe(struct stripe_head *sh, struct stripe_head_state *s)58{59	struct r5conf *conf = sh->raid_conf;60 61	if (conf->log) {62		if (!test_bit(STRIPE_R5C_CACHING, &sh->state)) {63			/* writing out phase */64			if (s->waiting_extra_page)65				return 0;66			return r5l_write_stripe(conf->log, sh);67		} else if (test_bit(STRIPE_LOG_TRAPPED, &sh->state)) {68			/* caching phase */69			return r5c_cache_data(conf->log, sh);70		}71	} else if (raid5_has_ppl(conf)) {72		return ppl_write_stripe(conf, sh);73	}74 75	return -EAGAIN;76}77 78static inline void log_stripe_write_finished(struct stripe_head *sh)79{80	struct r5conf *conf = sh->raid_conf;81 82	if (conf->log)83		r5l_stripe_write_finished(sh);84	else if (raid5_has_ppl(conf))85		ppl_stripe_write_finished(sh);86}87 88static inline void log_write_stripe_run(struct r5conf *conf)89{90	if (conf->log)91		r5l_write_stripe_run(conf->log);92	else if (raid5_has_ppl(conf))93		ppl_write_stripe_run(conf);94}95 96static inline void log_flush_stripe_to_raid(struct r5conf *conf)97{98	if (conf->log)99		r5l_flush_stripe_to_raid(conf->log);100	else if (raid5_has_ppl(conf))101		ppl_write_stripe_run(conf);102}103 104static inline int log_handle_flush_request(struct r5conf *conf, struct bio *bio)105{106	int ret = -ENODEV;107 108	if (conf->log)109		ret = r5l_handle_flush_request(conf->log, bio);110	else if (raid5_has_ppl(conf))111		ret = ppl_handle_flush_request(bio);112 113	return ret;114}115 116static inline void log_quiesce(struct r5conf *conf, int quiesce)117{118	if (conf->log)119		r5l_quiesce(conf->log, quiesce);120	else if (raid5_has_ppl(conf))121		ppl_quiesce(conf, quiesce);122}123 124static inline void log_exit(struct r5conf *conf)125{126	if (conf->log)127		r5l_exit_log(conf);128	else if (raid5_has_ppl(conf))129		ppl_exit_log(conf);130}131 132static inline int log_init(struct r5conf *conf, struct md_rdev *journal_dev,133			   bool ppl)134{135	if (journal_dev)136		return r5l_init_log(conf, journal_dev);137	else if (ppl)138		return ppl_init_log(conf);139 140	return 0;141}142 143static inline int log_modify(struct r5conf *conf, struct md_rdev *rdev, bool add)144{145	if (raid5_has_ppl(conf))146		return ppl_modify_log(conf, rdev, add);147 148	return 0;149}150 151#endif152