1. 11 May, 2011 4 commits
    • NeilBrown's avatar
      md: simplify raid10 read_balance · 56d99121
      NeilBrown authored
      raid10 read balance has two different loop for looking through
      possible devices to chose the best.
      Collapse those into one loop and generally make the code more
      readable.
      Signed-off-by: default avatarNeilBrown <neilb@suse.de>
      56d99121
    • NeilBrown's avatar
      md/bitmap: fix saving of events_cleared and other state. · 8258c532
      NeilBrown authored
      If a bitmap is found to be 'stale' the events_cleared value
      is set to match 'events'.
      However if the array is degraded this does not get stored on disk.
      This can subsequently lead to incorrect behaviour.
      
      So change bitmap_update_sb to always update events_cleared in the
      superblock from the known events_cleared.
      For neatness also set ->state from ->flags.
      This requires updating ->state whenever we update ->flags, which makes
      sense anyway.
      
      This is suitable for any active -stable release.
      
      cc: stable@kernel.org
      Signed-off-by: default avatarNeilBrown <neilb@suse.de>
      8258c532
    • NeilBrown's avatar
      md: reject a re-add request that cannot be honoured. · bedd86b7
      NeilBrown authored
      The 'add_new_disk' ioctl can be used to add a device either as a
      spare, or as an active disk that just needs to be resynced based on
      write-intent-bitmap information (re-add)
      
      Currently if a re-add is requested but fails we add as a spare
      instead.  This makes it impossible for user-space to check for
      failure.
      
      So change to require that a re-add attempt will either succeed or
      completely fail.  User-space can then decide what to do next.
      Signed-off-by: default avatarNeilBrown <neilb@suse.de>
      bedd86b7
    • NeilBrown's avatar
      md: Fix race when creating a new md device. · b0140891
      NeilBrown authored
      There is a race when creating an md device by opening /dev/mdXX.
      
      If two processes do this at much the same time they will follow the
      call path
        __blkdev_get -> get_gendisk -> kobj_lookup
      
      The first will call
        -> md_probe -> md_alloc -> add_disk -> blk_register_region
      
      and the race happens when the second gets to kobj_lookup after
      add_disk has called blk_register_region but before it returns to
      md_alloc.
      
      In the case the second will not call md_probe (as the probe is already
      done) but will get a handle on the gendisk, return to __blkdev_get
      which will then call md_open (via the ->open) pointer.
      
      As mddev->gendisk hasn't been set yet, md_open will think something is
      wrong an return with ERESTARTSYS.
      
      This can loop endlessly while the first thread makes no progress
      through add_disk.  Nothing is blocking it, but due to scheduler
      behaviour it doesn't get a turn.
      So this is essentially a live-lock.
      
      We fix this by simply moving the assignment to mddev->gendisk before
      the call the add_disk() so md_open doesn't get confused.
      Also move blk_queue_flush earlier because add_disk should be as late
      as possible.
      
      To make sure that md_open doesn't complete until md_alloc has done all
      that is needed, we take mddev->open_mutex during the last part of
      md_alloc.  md_open will wait for this.
      
      This can cause a lock-up on boot so Cc:ing for stable.
      For 2.6.36 and earlier a different patch will be needed as the
      'blk_queue_flush' call isn't there.
      Signed-off-by: default avatarNeilBrown <neilb@suse.de>
      Reported-by: default avatarThomas Jarosch <thomas.jarosch@intra2net.com>
      Tested-by: default avatarThomas Jarosch <thomas.jarosch@intra2net.com>
      Cc: stable@kernel.org
      b0140891
  2. 10 May, 2011 2 commits
  3. 09 May, 2011 27 commits
  4. 08 May, 2011 6 commits
  5. 07 May, 2011 1 commit