1. 17 Dec, 2012 35 commits
  2. 12 Dec, 2012 5 commits
    • Stefan Behrens's avatar
      Btrfs: allow repair code to include target disk when searching mirrors · ad6d620e
      Stefan Behrens authored
      Make the target disk of a running device replace operation
      available for reading. This is only used as a last ressort for
      the defect repair procedure. And it is dependent on the location
      of the data block to read, because during an ongoing device
      replace operation, the target drive is only partially filled
      with the filesystem data.
      Signed-off-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
      Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
      ad6d620e
    • Stefan Behrens's avatar
      Btrfs: increase BTRFS_MAX_MIRRORS by one for dev replace · 72d7aefc
      Stefan Behrens authored
      This change of the define is effective in all modes, it
      is required and used only in the case when a device replace
      procedure is running. The reason is that during an active
      device replace procedure, the target device of the copy
      operation is a mirror for the filesystem data as well that
      can be used to read data in order to repair read errors on
      other disks.
      Signed-off-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
      Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
      72d7aefc
    • Stefan Behrens's avatar
      Btrfs: optionally avoid reads from device replace source drive · 30d9861f
      Stefan Behrens authored
      It is desirable to be able to configure the device replace
      procedure to avoid reading the source drive (the one to be
      copied) whenever possible. This is useful when the number of
      read errors on this disk is high, because it would delay the
      copy procedure alot. Therefore there is an option to avoid
      reading from the source disk unless the repair procedure
      really needs to access it. The regular read req asks for
      mapping the block with mirror_num == 0, in this case the
      source disk is avoided whenever possible. The repair code
      selects the mirror_num explicitly (mirror_num != 0), this
      case is not changed by this commit.
      Signed-off-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
      Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
      30d9861f
    • Stefan Behrens's avatar
      Btrfs: changes to live filesystem are also written to replacement disk · 472262f3
      Stefan Behrens authored
      During a running dev replace operation, all write requests to
      the live filesystem are duplicated to also write to the target
      drive. Therefore btrfs_map_block() is changed to duplicate
      stripes that are written to the source disk of a device replace
      procedure to be written to the target disk as well.
      Signed-off-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
      Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
      472262f3
    • Stefan Behrens's avatar
      Btrfs: introduce GET_READ_MIRRORS functionality for btrfs_map_block() · 29a8d9a0
      Stefan Behrens authored
      Before this commit, btrfs_map_block() was called with REQ_WRITE
      in order to retrieve the list of mirrors for a disk block.
      This needs to be changed for the device replace procedure since
      it makes a difference whether you are asking for read mirrors
      or for locations to write to.
      GET_READ_MIRRORS is introduced as a new interface to call
      btrfs_map_block().
      In the current commit, the functionality is not yet changed,
      only the interface for GET_READ_MIRRORS is introduced and all
      the places that should use this new interface are adapted.
      
      The reason that REQ_WRITE cannot be abused anymore to retrieve
      a list of read mirrors is that during a running dev replace
      operation all write requests to the live filesystem are
      duplicated to also write to the target drive.
      Keep in mind that the target disk is only partially a valid
      copy of the source disk while the operation is ongoing. All
      writes go to the target disk, but not all reads would return
      valid data on the target disk. Therefore it is not possible
      anymore to abuse a REQ_WRITE interface to find valid mirrors
      for a REQ_READ.
      Signed-off-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
      Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
      29a8d9a0