• Stefan Behrens's avatar
    Btrfs: fix wrong write offset when replacing a device · db60e49a
    Stefan Behrens authored
    commit 115930cb upstream.
    
    Miao Xie reported the following issue:
    
    The filesystem was corrupted after we did a device replace.
    
    Steps to reproduce:
     # mkfs.btrfs -f -m single -d raid10 <device0>..<device3>
     # mount <device0> <mnt>
     # btrfs replace start -rfB 1 <device4> <mnt>
     # umount <mnt>
     # btrfsck <device4>
    
    The reason for the issue is that we changed the write offset by mistake,
    introduced by commit 625f1c8d.
    
    We read the data from the source device at first, and then write the
    data into the corresponding place of the new device. In order to
    implement the "-r" option, the source location is remapped using
    btrfs_map_block(). The read takes place on the mapped location, and
    the write needs to take place on the unmapped location. Currently
    the write is using the mapped location, and this commit changes it
    back by undoing the change to the write address that the aforementioned
    commit added by mistake.
    Reported-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    db60e49a
scrub.c 89.3 KB