Btrfs: fix estale with btrfs send
authorJosef Bacik <jbacik@fusionio.com>
Mon, 20 May 2013 15:26:50 +0000 (11:26 -0400)
committerJosef Bacik <jbacik@fusionio.com>
Fri, 14 Jun 2013 15:29:55 +0000 (11:29 -0400)
commit139f807a1eba1e484941a98fb93ee32ad859a6a1
tree1c00d319b8d623ef9ddc55da3966bf31cdad35bc
parent183860f6a0646b876645ecce0553a7ef2dd71254
Btrfs: fix estale with btrfs send

This fixes bugzilla 57491.  If we take a snapshot of a fs with a unlink ongoing
and then try to send that root we will run into problems.  When comparing with a
parent root we will search the parents and the send roots commit_root, which if
we've just created the snapshot will include the file that needs to be evicted
by the orphan cleanup.  So when we find a changed extent we will try and copy
that info into the send stream, but when we lookup the inode we use the normal
root, which no longer has the inode because the orphan cleanup deleted it.  The
best solution I have for this is to check our otransid with the generation of
the commit root and if they match just commit the transaction again, that way we
get the changes from the orphan cleanup.  With this patch the reproducer I made
for this bugzilla no longer returns ESTALE when trying to do the send.  Thanks,

Cc: stable@vger.kernel.org
Reported-by: Chris Wilson <jakdaw@gmail.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
fs/btrfs/send.c