Commit e6c033f7 authored by Shaohua Li's avatar Shaohua Li Committed by NeilBrown
Browse files

raid5-cache: move reclaim stop to quiesce



Move reclaim stop to quiesce handling, where is safer for this stuff.

Signed-off-by: default avatarShaohua Li <shli@fb.com>
Signed-off-by: default avatarNeilBrown <neilb@suse.com>
parent ac6096e9
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -748,6 +748,24 @@ static void r5l_wake_reclaim(struct r5l_log *log, sector_t space)
	md_wakeup_thread(log->reclaim_thread);
}

void r5l_quiesce(struct r5l_log *log, int state)
{
	if (!log || state == 2)
		return;
	if (state == 0) {
		log->reclaim_thread = md_register_thread(r5l_reclaim_thread,
					log->rdev->mddev, "reclaim");
	} else if (state == 1) {
		/*
		 * at this point all stripes are finished, so io_unit is at
		 * least in STRIPE_END state
		 */
		r5l_wake_reclaim(log, -1L);
		md_unregister_thread(&log->reclaim_thread);
		r5l_do_reclaim(log);
	}
}

struct r5l_recovery_ctx {
	struct page *meta_page;		/* current meta */
	sector_t meta_total_blocks;	/* total size of current meta and data */
@@ -1120,19 +1138,7 @@ io_kc:

void r5l_exit_log(struct r5l_log *log)
{
	/*
	 * at this point all stripes are finished, so io_unit is at least in
	 * STRIPE_END state
	 */
	r5l_wake_reclaim(log, -1L);
	md_unregister_thread(&log->reclaim_thread);
	r5l_do_reclaim(log);
	/*
	 * force a super update, r5l_do_reclaim might updated the super.
	 * mddev->thread is already stopped
	 */
	md_update_sb(log->rdev->mddev, 1);

	kmem_cache_destroy(log->io_kc);
	kfree(log);
}
+1 −0
Original line number Diff line number Diff line
@@ -7582,6 +7582,7 @@ static void raid5_quiesce(struct mddev *mddev, int state)
		unlock_all_device_hash_locks_irq(conf);
		break;
	}
	r5l_quiesce(conf->log, state);
}

static void *raid45_takeover_raid0(struct mddev *mddev, int level)
+1 −0
Original line number Diff line number Diff line
@@ -630,4 +630,5 @@ extern void r5l_write_stripe_run(struct r5l_log *log);
extern void r5l_flush_stripe_to_raid(struct r5l_log *log);
extern void r5l_stripe_write_finished(struct stripe_head *sh);
extern int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio);
extern void r5l_quiesce(struct r5l_log *log, int state);
#endif