Commit 390ee602 authored by NeilBrown's avatar NeilBrown

md: export various start/stop interfaces

export entry points for starting and stopping md arrays.
This will be used by a module to make md/raid5 work under
dm.
Also stop calling md_stop_writes from md_stop, as that won't
work well with dm - it will want to call the two separately.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent e8bb9a83
...@@ -261,7 +261,7 @@ static int md_make_request(struct request_queue *q, struct bio *bio) ...@@ -261,7 +261,7 @@ static int md_make_request(struct request_queue *q, struct bio *bio)
* Once ->stop is called and completes, the module will be completely * Once ->stop is called and completes, the module will be completely
* unused. * unused.
*/ */
static void mddev_suspend(mddev_t *mddev) void mddev_suspend(mddev_t *mddev)
{ {
BUG_ON(mddev->suspended); BUG_ON(mddev->suspended);
mddev->suspended = 1; mddev->suspended = 1;
...@@ -269,13 +269,15 @@ static void mddev_suspend(mddev_t *mddev) ...@@ -269,13 +269,15 @@ static void mddev_suspend(mddev_t *mddev)
wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0);
mddev->pers->quiesce(mddev, 1); mddev->pers->quiesce(mddev, 1);
} }
EXPORT_SYMBOL_GPL(mddev_suspend);
static void mddev_resume(mddev_t *mddev) void mddev_resume(mddev_t *mddev)
{ {
mddev->suspended = 0; mddev->suspended = 0;
wake_up(&mddev->sb_wait); wake_up(&mddev->sb_wait);
mddev->pers->quiesce(mddev, 0); mddev->pers->quiesce(mddev, 0);
} }
EXPORT_SYMBOL_GPL(mddev_resume);
int mddev_congested(mddev_t *mddev, int bits) int mddev_congested(mddev_t *mddev, int bits)
{ {
...@@ -416,7 +418,7 @@ static void mddev_put(mddev_t *mddev) ...@@ -416,7 +418,7 @@ static void mddev_put(mddev_t *mddev)
spin_unlock(&all_mddevs_lock); spin_unlock(&all_mddevs_lock);
} }
static void mddev_init(mddev_t *mddev) void mddev_init(mddev_t *mddev)
{ {
mutex_init(&mddev->open_mutex); mutex_init(&mddev->open_mutex);
mutex_init(&mddev->reconfig_mutex); mutex_init(&mddev->reconfig_mutex);
...@@ -436,6 +438,7 @@ static void mddev_init(mddev_t *mddev) ...@@ -436,6 +438,7 @@ static void mddev_init(mddev_t *mddev)
mddev->resync_max = MaxSector; mddev->resync_max = MaxSector;
mddev->level = LEVEL_NONE; mddev->level = LEVEL_NONE;
} }
EXPORT_SYMBOL_GPL(mddev_init);
static mddev_t * mddev_find(dev_t unit) static mddev_t * mddev_find(dev_t unit)
{ {
...@@ -4333,7 +4336,7 @@ static void md_safemode_timeout(unsigned long data) ...@@ -4333,7 +4336,7 @@ static void md_safemode_timeout(unsigned long data)
static int start_dirty_degraded; static int start_dirty_degraded;
static int md_run(mddev_t *mddev) int md_run(mddev_t *mddev)
{ {
int err; int err;
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
...@@ -4537,6 +4540,7 @@ static int md_run(mddev_t *mddev) ...@@ -4537,6 +4540,7 @@ static int md_run(mddev_t *mddev)
sysfs_notify(&mddev->kobj, NULL, "degraded"); sysfs_notify(&mddev->kobj, NULL, "degraded");
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(md_run);
static int do_md_run(mddev_t *mddev) static int do_md_run(mddev_t *mddev)
{ {
...@@ -4646,7 +4650,7 @@ static void md_clean(mddev_t *mddev) ...@@ -4646,7 +4650,7 @@ static void md_clean(mddev_t *mddev)
mddev->bitmap_info.max_write_behind = 0; mddev->bitmap_info.max_write_behind = 0;
} }
static void md_stop_writes(mddev_t *mddev) void md_stop_writes(mddev_t *mddev)
{ {
if (mddev->sync_thread) { if (mddev->sync_thread) {
set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
...@@ -4666,11 +4670,10 @@ static void md_stop_writes(mddev_t *mddev) ...@@ -4666,11 +4670,10 @@ static void md_stop_writes(mddev_t *mddev)
md_update_sb(mddev, 1); md_update_sb(mddev, 1);
} }
} }
EXPORT_SYMBOL_GPL(md_stop_writes);
static void md_stop(mddev_t *mddev) void md_stop(mddev_t *mddev)
{ {
md_stop_writes(mddev);
mddev->pers->stop(mddev); mddev->pers->stop(mddev);
if (mddev->pers->sync_request && mddev->to_remove == NULL) if (mddev->pers->sync_request && mddev->to_remove == NULL)
mddev->to_remove = &md_redundancy_group; mddev->to_remove = &md_redundancy_group;
...@@ -4678,6 +4681,7 @@ static void md_stop(mddev_t *mddev) ...@@ -4678,6 +4681,7 @@ static void md_stop(mddev_t *mddev)
mddev->pers = NULL; mddev->pers = NULL;
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
} }
EXPORT_SYMBOL_GPL(md_stop);
static int md_set_readonly(mddev_t *mddev, int is_open) static int md_set_readonly(mddev_t *mddev, int is_open)
{ {
...@@ -4724,6 +4728,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) ...@@ -4724,6 +4728,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
if (mddev->ro) if (mddev->ro)
set_disk_ro(disk, 0); set_disk_ro(disk, 0);
md_stop_writes(mddev);
md_stop(mddev); md_stop(mddev);
mddev->queue->merge_bvec_fn = NULL; mddev->queue->merge_bvec_fn = NULL;
mddev->queue->unplug_fn = NULL; mddev->queue->unplug_fn = NULL;
......
...@@ -487,5 +487,12 @@ extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev); ...@@ -487,5 +487,12 @@ extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale); extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
extern void restore_bitmap_write_access(struct file *file); extern void restore_bitmap_write_access(struct file *file);
extern void mddev_init(mddev_t *mddev);
extern int md_run(mddev_t *mddev);
extern void md_stop(mddev_t *mddev);
extern void md_stop_writes(mddev_t *mddev);
extern void md_rdev_init(mdk_rdev_t *rdev); extern void md_rdev_init(mdk_rdev_t *rdev);
extern void mddev_suspend(mddev_t *mddev);
extern void mddev_resume(mddev_t *mddev);
#endif /* _MD_MD_H */ #endif /* _MD_MD_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment