Lines Matching refs:conf

39 #define R5C_FULL_STRIPE_FLUSH_BATCH(conf) (conf->max_nr_stripes / 4)  argument
195 static inline sector_t r5c_tree_index(struct r5conf *conf, in r5c_tree_index() argument
198 sector_div(sect, conf->chunk_sectors); in r5c_tree_index()
292 r5c_return_dev_pending_writes(struct r5conf *conf, struct r5dev *dev) in r5c_return_dev_pending_writes() argument
299 dev->sector + RAID5_STRIPE_SECTORS(conf)) { in r5c_return_dev_pending_writes()
300 wbi2 = r5_next_bio(conf, wbi, dev->sector); in r5c_return_dev_pending_writes()
301 md_write_end(conf->mddev); in r5c_return_dev_pending_writes()
307 void r5c_handle_cached_data_endio(struct r5conf *conf, in r5c_handle_cached_data_endio() argument
315 r5c_return_dev_pending_writes(conf, &sh->dev[i]); in r5c_handle_cached_data_endio()
323 void r5c_check_stripe_cache_usage(struct r5conf *conf) in r5c_check_stripe_cache_usage() argument
326 struct r5l_log *log = READ_ONCE(conf->log); in r5c_check_stripe_cache_usage()
331 total_cached = atomic_read(&conf->r5c_cached_partial_stripes) + in r5c_check_stripe_cache_usage()
332 atomic_read(&conf->r5c_cached_full_stripes); in r5c_check_stripe_cache_usage()
342 if (total_cached > conf->min_nr_stripes * 1 / 2 || in r5c_check_stripe_cache_usage()
343 atomic_read(&conf->empty_inactive_list_nr) > 0) in r5c_check_stripe_cache_usage()
351 void r5c_check_cached_full_stripe(struct r5conf *conf) in r5c_check_cached_full_stripe() argument
353 struct r5l_log *log = READ_ONCE(conf->log); in r5c_check_cached_full_stripe()
362 if (atomic_read(&conf->r5c_cached_full_stripes) >= in r5c_check_cached_full_stripe()
363 min(R5C_FULL_STRIPE_FLUSH_BATCH(conf), in r5c_check_cached_full_stripe()
364 conf->chunk_sectors >> RAID5_STRIPE_SHIFT(conf))) in r5c_check_cached_full_stripe()
396 static sector_t r5c_log_required_to_flush_cache(struct r5conf *conf) in r5c_log_required_to_flush_cache() argument
398 struct r5l_log *log = READ_ONCE(conf->log); in r5c_log_required_to_flush_cache()
404 ((conf->max_degraded + 1) * atomic_read(&log->stripe_in_journal_count) + in r5c_log_required_to_flush_cache()
405 (conf->raid_disks - conf->max_degraded) * (conf->group_cnt + 1)); in r5c_log_required_to_flush_cache()
417 struct r5conf *conf = log->rdev->mddev->private; in r5c_update_log_state() local
427 reclaim_space = r5c_log_required_to_flush_cache(conf); in r5c_update_log_state()
429 set_bit(R5C_LOG_CRITICAL, &conf->cache_state); in r5c_update_log_state()
431 if (test_bit(R5C_LOG_CRITICAL, &conf->cache_state)) in r5c_update_log_state()
433 clear_bit(R5C_LOG_CRITICAL, &conf->cache_state); in r5c_update_log_state()
436 set_bit(R5C_LOG_TIGHT, &conf->cache_state); in r5c_update_log_state()
438 clear_bit(R5C_LOG_TIGHT, &conf->cache_state); in r5c_update_log_state()
450 struct r5conf *conf = sh->raid_conf; in r5c_make_stripe_write_out() local
451 struct r5l_log *log = READ_ONCE(conf->log); in r5c_make_stripe_write_out()
459 atomic_inc(&conf->preread_active_stripes); in r5c_make_stripe_write_out()
684 struct r5conf *conf = mddev->private; in r5c_disable_writeback_async() local
693 !READ_ONCE(conf->log) || in r5c_disable_writeback_async()
696 log = READ_ONCE(conf->log); in r5c_disable_writeback_async()
862 struct r5conf *conf = mddev->private; in r5l_append_flush_payload() local
872 if (conf->quiesce) in r5l_append_flush_payload()
991 struct r5conf *conf = sh->raid_conf; in r5l_write_stripe() local
1060 if (test_bit(R5C_LOG_CRITICAL, &conf->cache_state) && in r5l_write_stripe()
1149 static sector_t r5c_calculate_new_cp(struct r5conf *conf) in r5c_calculate_new_cp() argument
1152 struct r5l_log *log = READ_ONCE(conf->log); in r5c_calculate_new_cp()
1174 struct r5conf *conf = log->rdev->mddev->private; in r5l_reclaimable_space() local
1177 r5c_calculate_new_cp(conf)); in r5l_reclaimable_space()
1222 struct r5conf *conf = log->rdev->mddev->private; in __r5l_stripe_write_finished() local
1234 test_bit(R5C_LOG_TIGHT, &conf->cache_state)) in __r5l_stripe_write_finished()
1361 static void r5c_flush_stripe(struct r5conf *conf, struct stripe_head *sh) in r5c_flush_stripe() argument
1372 lockdep_assert_held(&conf->device_lock); in r5c_flush_stripe()
1378 atomic_inc(&conf->active_stripes); in r5c_flush_stripe()
1382 atomic_inc(&conf->r5c_flushing_partial_stripes); in r5c_flush_stripe()
1384 atomic_inc(&conf->r5c_flushing_full_stripes); in r5c_flush_stripe()
1394 void r5c_flush_cache(struct r5conf *conf, int num) in r5c_flush_cache() argument
1399 lockdep_assert_held(&conf->device_lock); in r5c_flush_cache()
1400 if (!READ_ONCE(conf->log)) in r5c_flush_cache()
1404 list_for_each_entry_safe(sh, next, &conf->r5c_full_stripe_list, lru) { in r5c_flush_cache()
1405 r5c_flush_stripe(conf, sh); in r5c_flush_cache()
1412 &conf->r5c_partial_stripe_list, lru) { in r5c_flush_cache()
1413 r5c_flush_stripe(conf, sh); in r5c_flush_cache()
1419 static void r5c_do_reclaim(struct r5conf *conf) in r5c_do_reclaim() argument
1421 struct r5l_log *log = READ_ONCE(conf->log); in r5c_do_reclaim()
1432 flushing_partial = atomic_read(&conf->r5c_flushing_partial_stripes); in r5c_do_reclaim()
1433 flushing_full = atomic_read(&conf->r5c_flushing_full_stripes); in r5c_do_reclaim()
1434 total_cached = atomic_read(&conf->r5c_cached_partial_stripes) + in r5c_do_reclaim()
1435 atomic_read(&conf->r5c_cached_full_stripes) - in r5c_do_reclaim()
1438 if (total_cached > conf->min_nr_stripes * 3 / 4 || in r5c_do_reclaim()
1439 atomic_read(&conf->empty_inactive_list_nr) > 0) in r5c_do_reclaim()
1445 else if (total_cached > conf->min_nr_stripes * 1 / 2 || in r5c_do_reclaim()
1446 atomic_read(&conf->r5c_cached_full_stripes) - flushing_full > in r5c_do_reclaim()
1447 R5C_FULL_STRIPE_FLUSH_BATCH(conf)) in r5c_do_reclaim()
1458 spin_lock_irqsave(&conf->device_lock, flags); in r5c_do_reclaim()
1459 r5c_flush_cache(conf, stripes_to_flush); in r5c_do_reclaim()
1460 spin_unlock_irqrestore(&conf->device_lock, flags); in r5c_do_reclaim()
1464 if (test_bit(R5C_LOG_TIGHT, &conf->cache_state)) { in r5c_do_reclaim()
1466 spin_lock(&conf->device_lock); in r5c_do_reclaim()
1479 r5c_flush_stripe(conf, sh); in r5c_do_reclaim()
1484 spin_unlock(&conf->device_lock); in r5c_do_reclaim()
1488 if (!test_bit(R5C_LOG_CRITICAL, &conf->cache_state)) in r5c_do_reclaim()
1491 md_wakeup_thread(conf->mddev->thread); in r5c_do_reclaim()
1496 struct r5conf *conf = log->rdev->mddev->private; in r5l_do_reclaim() local
1525 next_checkpoint = r5c_calculate_new_cp(conf); in r5l_do_reclaim()
1549 struct r5conf *conf = mddev->private; in r5l_reclaim_thread() local
1550 struct r5l_log *log = READ_ONCE(conf->log); in r5l_reclaim_thread()
1554 r5c_do_reclaim(conf); in r5l_reclaim_thread()
1590 bool r5l_log_disk_error(struct r5conf *conf) in r5l_log_disk_error() argument
1592 struct r5l_log *log = READ_ONCE(conf->log); in r5l_log_disk_error()
1596 return test_bit(MD_HAS_JOURNAL, &conf->mddev->flags); in r5l_log_disk_error()
1807 struct r5conf *conf = mddev->private; in r5l_recovery_load_data() local
1810 raid5_compute_sector(conf, in r5l_recovery_load_data()
1829 struct r5conf *conf = mddev->private; in r5l_recovery_load_parity() local
1831 ctx->meta_total_blocks += BLOCK_SECTORS * conf->max_degraded; in r5l_recovery_load_parity()
1859 r5l_recovery_replay_one_stripe(struct r5conf *conf, in r5l_recovery_replay_one_stripe() argument
1888 rdev = conf->disks[disk_index].rdev; in r5l_recovery_replay_one_stripe()
1896 rrdev = conf->disks[disk_index].replacement; in r5l_recovery_replay_one_stripe()
1912 struct r5conf *conf, in r5c_recovery_alloc_stripe() argument
1918 sh = raid5_get_active_stripe(conf, NULL, stripe_sect, in r5c_recovery_alloc_stripe()
1992 struct r5conf *conf = mddev->private; in r5l_recovery_verify_data_checksum_for_mb() local
2018 if (conf->max_degraded == 2 && /* q for RAID 6 */ in r5l_recovery_verify_data_checksum_for_mb()
2066 struct r5conf *conf = mddev->private; in r5c_recovery_analyze_meta_block() local
2121 conf, le64_to_cpu(payload->location), 0, &dd, in r5c_recovery_analyze_meta_block()
2129 sh = r5c_recovery_alloc_stripe(conf, stripe_sect, 1); in r5c_recovery_analyze_meta_block()
2138 conf, stripe_sect, 1); in r5c_recovery_analyze_meta_block()
2141 int new_size = conf->min_nr_stripes * 2; in r5c_recovery_analyze_meta_block()
2146 if (conf->min_nr_stripes <= new_size / 2) { in r5c_recovery_analyze_meta_block()
2151 conf->min_nr_stripes, in r5c_recovery_analyze_meta_block()
2152 conf->max_nr_stripes); in r5c_recovery_analyze_meta_block()
2156 conf, stripe_sect, 0); in r5c_recovery_analyze_meta_block()
2169 r5l_recovery_replay_one_stripe(conf, sh, ctx); in r5c_recovery_analyze_meta_block()
2414 struct r5conf *conf = mddev->private; in r5c_recovery_flush_data_only_stripes() local
2435 wait_event(conf->wait_for_quiescent, in r5c_recovery_flush_data_only_stripes()
2436 atomic_read(&conf->active_stripes) == 0); in r5c_recovery_flush_data_only_stripes()
2522 struct r5conf *conf; in r5c_journal_mode_show() local
2529 conf = mddev->private; in r5c_journal_mode_show()
2530 if (!conf || !conf->log) in r5c_journal_mode_show()
2533 switch (conf->log->r5c_journal_mode) { in r5c_journal_mode_show()
2563 struct r5conf *conf; in r5c_journal_mode_set() local
2569 conf = mddev->private; in r5c_journal_mode_set()
2570 if (!conf || !conf->log) in r5c_journal_mode_set()
2573 if (raid5_calc_degraded(conf) > 0 && in r5c_journal_mode_set()
2577 conf->log->r5c_journal_mode = mode; in r5c_journal_mode_set()
2622 int r5c_try_caching_write(struct r5conf *conf, in r5c_try_caching_write() argument
2627 struct r5l_log *log = READ_ONCE(conf->log); in r5c_try_caching_write()
2685 tree_index = r5c_tree_index(conf, sh->sector); in r5c_try_caching_write()
2717 atomic_inc(&conf->r5c_cached_partial_stripes); in r5c_try_caching_write()
2748 struct r5conf *conf = sh->raid_conf; in r5c_release_extra_page() local
2753 sh->dev[0].orig_page == conf->disks[0].extra_page; in r5c_release_extra_page()
2767 clear_bit(R5C_EXTRA_PAGE_IN_USE, &conf->cache_state); in r5c_release_extra_page()
2768 md_wakeup_thread(conf->mddev->thread); in r5c_release_extra_page()
2774 struct r5conf *conf = sh->raid_conf; in r5c_use_extra_page() local
2782 dev->orig_page = conf->disks[i].extra_page; in r5c_use_extra_page()
2790 void r5c_finish_stripe_write_out(struct r5conf *conf, in r5c_finish_stripe_write_out() argument
2794 struct r5l_log *log = READ_ONCE(conf->log); in r5c_finish_stripe_write_out()
2822 if (atomic_dec_and_test(&conf->pending_full_writes)) in r5c_finish_stripe_write_out()
2823 md_wakeup_thread(conf->mddev->thread); in r5c_finish_stripe_write_out()
2836 tree_index = r5c_tree_index(conf, sh->sector); in r5c_finish_stripe_write_out()
2854 BUG_ON(atomic_read(&conf->r5c_cached_partial_stripes) == 0); in r5c_finish_stripe_write_out()
2855 atomic_dec(&conf->r5c_flushing_partial_stripes); in r5c_finish_stripe_write_out()
2856 atomic_dec(&conf->r5c_cached_partial_stripes); in r5c_finish_stripe_write_out()
2860 BUG_ON(atomic_read(&conf->r5c_cached_full_stripes) == 0); in r5c_finish_stripe_write_out()
2861 atomic_dec(&conf->r5c_flushing_full_stripes); in r5c_finish_stripe_write_out()
2862 atomic_dec(&conf->r5c_cached_full_stripes); in r5c_finish_stripe_write_out()
2873 struct r5conf *conf = sh->raid_conf; in r5c_cache_data() local
2905 if (test_bit(R5C_LOG_CRITICAL, &conf->cache_state) && in r5c_cache_data()
2927 bool r5c_big_stripe_cached(struct r5conf *conf, sector_t sect) in r5c_big_stripe_cached() argument
2929 struct r5l_log *log = READ_ONCE(conf->log); in r5c_big_stripe_cached()
2936 tree_index = r5c_tree_index(conf, sect); in r5c_big_stripe_cached()
3026 struct r5conf *conf = mddev->private; in r5l_start() local
3028 r5l_exit_log(conf); in r5l_start()
3035 struct r5conf *conf = mddev->private; in r5c_update_on_rdev_error() local
3036 struct r5l_log *log = READ_ONCE(conf->log); in r5c_update_on_rdev_error()
3041 if ((raid5_calc_degraded(conf) > 0 || in r5c_update_on_rdev_error()
3047 int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev) in r5l_init_log() argument
3054 mdname(conf->mddev), rdev->bdev); in r5l_init_log()
3068 conf->raid_disks) > PAGE_SIZE) { in r5l_init_log()
3070 mdname(conf->mddev), conf->raid_disks); in r5l_init_log()
3132 WRITE_ONCE(conf->log, log); in r5l_init_log()
3134 set_bit(MD_HAS_JOURNAL, &conf->mddev->flags); in r5l_init_log()
3150 void r5l_exit_log(struct r5conf *conf) in r5l_exit_log() argument
3152 struct r5l_log *log = conf->log; in r5l_exit_log()
3154 md_unregister_thread(conf->mddev, &log->reclaim_thread); in r5l_exit_log()
3160 WRITE_ONCE(conf->log, NULL); in r5l_exit_log()
3161 wake_up(&conf->mddev->sb_wait); in r5l_exit_log()