summaryrefslogtreecommitdiffstats
path: root/COPYING
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@suse.com>2018-07-20 10:59:06 +0100
committerDavid Sterba <dsterba@suse.com>2018-08-06 13:12:59 +0200
commit0d836392cadd5535f4184d46d901a82eb276ed62 (patch)
treefcb877b9f410107371ed2e1e1e169ee5c8deb933 /COPYING
parent4559b0a71749c442d34f7cfb9e72c9e58db83948 (diff)
downloadlinux-0d836392cadd5535f4184d46d901a82eb276ed62.tar.gz
linux-0d836392cadd5535f4184d46d901a82eb276ed62.tar.bz2
linux-0d836392cadd5535f4184d46d901a82eb276ed62.zip
Btrfs: fix mount failure after fsync due to hard link recreation
If we end up with logging an inode reference item which has the same name but different index from the one we have persisted, we end up failing when replaying the log with an errno value of -EEXIST. The error comes from btrfs_add_link(), which is called from add_inode_ref(), when we are replaying an inode reference item. Example scenario where this happens: $ mkfs.btrfs -f /dev/sdb $ mount /dev/sdb /mnt $ touch /mnt/foo $ ln /mnt/foo /mnt/bar $ sync # Rename the first hard link (foo) to a new name and rename the second # hard link (bar) to the old name of the first hard link (foo). $ mv /mnt/foo /mnt/qwerty $ mv /mnt/bar /mnt/foo # Create a new file, in the same parent directory, with the old name of # the second hard link (bar) and fsync this new file. # We do this instead of calling fsync on foo/qwerty because if we did # that the fsync resulted in a full transaction commit, not triggering # the problem. $ touch /mnt/bar $ xfs_io -c "fsync" /mnt/bar <power fail> $ mount /dev/sdb /mnt mount: mount /dev/sdb on /mnt failed: File exists So fix this by checking if a conflicting inode reference exists (same name, same parent but different index), removing it (and the associated dir index entries from the parent inode) if it exists, before attempting to add the new reference. A test case for fstests follows soon. CC: stable@vger.kernel.org # 4.4+ Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'COPYING')
0 files changed, 0 insertions, 0 deletions