• NeilBrown's avatar
    md: allow resync_start to be set while an array is active. · b098636c
    NeilBrown authored
    The sysfs attribute 'resync_start' (known internally as recovery_cp),
    records where a resync is up to.  A value of 0 means the array is
    not known to be in-sync at all.  A value of MaxSector means the array
    is believed to be fully in-sync.
    
    When the size of member devices of an array (RAID1,RAID4/5/6) is
    increased, the array can be increased to match.  This process sets
    resync_start to the old end-of-device offset so that the new part of
    the array gets resynced.
    
    However with RAID1 (and RAID6) a resync is not technically necessary
    and may be undesirable.  So it would be good if the implied resync
    after the array is resized could be avoided.
    
    So: change 'resync_start' so the value can be changed while the array
    is active, and as a precaution only allow it to be changed while
    resync/recovery is 'frozen'.  Changing it once resync has started is
    not going to be useful anyway.
    
    This allows the array to be resized without a resync by:
      write 'frozen' to 'sync_action'
      write new size to 'component_size' (this will set resync_start)
      write 'none' to 'resync_start'
      write 'idle' to 'sync_action'.
    
    Also slightly improve some tests on recovery_cp when resizing
    raid1/raid5.  Now that an arbitrary value could be set we should be
    more careful in our tests.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    b098636c
raid5.c 167 KB