md: start to refactor do_md_stop
authorNeilBrown <neilb@suse.de>
Mon, 29 Mar 2010 00:37:13 +0000 (11:37 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 18 May 2010 05:27:53 +0000 (15:27 +1000)
do_md_stop is large and clunky, so hard to understand.

This is a first step of refactoring, pulling two simple
sub-functions out.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index e752332..002d0a3 100644 (file)
@@ -4568,6 +4568,58 @@ void restore_bitmap_write_access(struct file *file)
        spin_unlock(&inode->i_lock);
 }
 
+static void md_clean(mddev_t *mddev)
+{
+       mddev->array_sectors = 0;
+       mddev->external_size = 0;
+       mddev->dev_sectors = 0;
+       mddev->raid_disks = 0;
+       mddev->recovery_cp = 0;
+       mddev->resync_min = 0;
+       mddev->resync_max = MaxSector;
+       mddev->reshape_position = MaxSector;
+       mddev->external = 0;
+       mddev->persistent = 0;
+       mddev->level = LEVEL_NONE;
+       mddev->clevel[0] = 0;
+       mddev->flags = 0;
+       mddev->ro = 0;
+       mddev->metadata_type[0] = 0;
+       mddev->chunk_sectors = 0;
+       mddev->ctime = mddev->utime = 0;
+       mddev->layout = 0;
+       mddev->max_disks = 0;
+       mddev->events = 0;
+       mddev->delta_disks = 0;
+       mddev->new_level = LEVEL_NONE;
+       mddev->new_layout = 0;
+       mddev->new_chunk_sectors = 0;
+       mddev->curr_resync = 0;
+       mddev->resync_mismatches = 0;
+       mddev->suspend_lo = mddev->suspend_hi = 0;
+       mddev->sync_speed_min = mddev->sync_speed_max = 0;
+       mddev->recovery = 0;
+       mddev->in_sync = 0;
+       mddev->degraded = 0;
+       mddev->barriers_work = 0;
+       mddev->safemode = 0;
+       mddev->bitmap_info.offset = 0;
+       mddev->bitmap_info.default_offset = 0;
+       mddev->bitmap_info.chunksize = 0;
+       mddev->bitmap_info.daemon_sleep = 0;
+       mddev->bitmap_info.max_write_behind = 0;
+}
+
+static void md_stop(mddev_t *mddev)
+{
+       mddev->pers->stop(mddev);
+       if (mddev->pers->sync_request && mddev->to_remove == NULL)
+               mddev->to_remove = &md_redundancy_group;
+       module_put(mddev->pers->owner);
+       mddev->pers = NULL;
+
+}
+
 /* mode:
  *   0 - completely stop and dis-assemble array
  *   1 - switch to readonly
@@ -4608,14 +4660,11 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
                        if (mddev->ro)
                                set_disk_ro(disk, 0);
 
-                       mddev->pers->stop(mddev);
+                       md_stop(mddev);
                        mddev->queue->merge_bvec_fn = NULL;
                        mddev->queue->unplug_fn = NULL;
                        mddev->queue->backing_dev_info.congested_fn = NULL;
-                       module_put(mddev->pers->owner);
-                       if (mddev->pers->sync_request && mddev->to_remove == NULL)
-                               mddev->to_remove = &md_redundancy_group;
-                       mddev->pers = NULL;
+
                        /* tell userspace to handle 'inactive' */
                        sysfs_notify_dirent(mddev->sysfs_state);
 
@@ -4663,44 +4712,7 @@ out:
 
                export_array(mddev);
 
-               mddev->array_sectors = 0;
-               mddev->external_size = 0;
-               mddev->dev_sectors = 0;
-               mddev->raid_disks = 0;
-               mddev->recovery_cp = 0;
-               mddev->resync_min = 0;
-               mddev->resync_max = MaxSector;
-               mddev->reshape_position = MaxSector;
-               mddev->external = 0;
-               mddev->persistent = 0;
-               mddev->level = LEVEL_NONE;
-               mddev->clevel[0] = 0;
-               mddev->flags = 0;
-               mddev->ro = 0;
-               mddev->metadata_type[0] = 0;
-               mddev->chunk_sectors = 0;
-               mddev->ctime = mddev->utime = 0;
-               mddev->layout = 0;
-               mddev->max_disks = 0;
-               mddev->events = 0;
-               mddev->delta_disks = 0;
-               mddev->new_level = LEVEL_NONE;
-               mddev->new_layout = 0;
-               mddev->new_chunk_sectors = 0;
-               mddev->curr_resync = 0;
-               mddev->resync_mismatches = 0;
-               mddev->suspend_lo = mddev->suspend_hi = 0;
-               mddev->sync_speed_min = mddev->sync_speed_max = 0;
-               mddev->recovery = 0;
-               mddev->in_sync = 0;
-               mddev->degraded = 0;
-               mddev->barriers_work = 0;
-               mddev->safemode = 0;
-               mddev->bitmap_info.offset = 0;
-               mddev->bitmap_info.default_offset = 0;
-               mddev->bitmap_info.chunksize = 0;
-               mddev->bitmap_info.daemon_sleep = 0;
-               mddev->bitmap_info.max_write_behind = 0;
+               md_clean(mddev);
                kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
                if (mddev->hold_active == UNTIL_STOP)
                        mddev->hold_active = 0;