• Goldwyn Rodrigues's avatar
    md-cluster: Improve md_reload_sb to be less error prone · 70bcecdb
    Goldwyn Rodrigues authored
    md_reload_sb is too simplistic and it explicitly needs to determine
    the changes made by the writing node. However, there are multiple areas
    where a simple reload could fail.
    
    Instead, read the superblock of one of the "good" rdevs and update
    the necessary information:
    
    - read the superblock into a newly allocated page, by temporarily
      swapping out rdev->sb_page and calling ->load_super.
    - if that fails return
    - if it succeeds, call check_sb_changes
      1. iterates over list of active devices and checks the matching
       dev_roles[] value.
       	If that is 'faulty', the device must be  marked as faulty
    	 - call md_error to mark the device as faulty. Make sure
    	   not to set CHANGE_DEVS and wakeup mddev->thread or else
    	   it would initiate a resync process, which is the responsibility
    	   of the "primary" node.
    	 - clear the Blocked bit
    	 - Call remove_and_add_spares() to hot remove the device.
    	If the device is 'spare':
    	 - call remove_and_add_spares() to get the number of spares
    	   added in this operation.
    	 - Reduce mddev->degraded to mark the array as not degraded.
      2. reset recovery_cp
    - read the rest of the rdevs to update recovery_offset. If recovery_offset
      is equal to MaxSector, call spare_active() to set it In_sync
    
    This required that recovery_offset be initialized to MaxSector, as
    opposed to zero so as to communicate the end of sync for a rdev.
    Signed-off-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    70bcecdb
raid1.c 86.7 KB