rofiles: Fix --copyup when creating a new file

This tripped up the `docbook-dtds` `%post` in my experiments
with doing rpm-ostree for buildroots.

I cloned and built [xfstests](https://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git)
but haven't yet investigated actually running it.

In the meantime let's do the obvious fix here; we need to distinguish
between "copyup enabled" and "actually did a copyup" in the open path
at least, since if we didn't do a copyup we don't need to re-open.

Closes: #1396
Approved by: jlebon
This commit is contained in:
Colin Walters authored and Atomic Bot committed 2018-01-08 15:21:29 +00:00
1 parent 46a841a062
commit 3b9304b5d7
2 files changed
+54 -12

No files matched your search

+43 -8
View File
@@ -121,19 +121,54 @@ echo "ok flock"
# And now with --copyup enabled
fusermount -u ${test_tmpdir}/mnt
assert_not_has_file mnt/firstfile
rofiles-fuse --copyup checkout-test2 mnt
copyup_reset() {
cd ${test_tmpdir}
fusermount -u mnt
rm checkout-test2 -rf
$OSTREE checkout -H test2 checkout-test2
rofiles-fuse --copyup checkout-test2 mnt
}
assert_test_file() {
t=$1
f=$2
if ! test ${t} "${f}"; then
ls -al "${f}"
fatal "Failed test ${t} ${f}"
fi
}
copyup_reset
assert_file_has_content mnt/firstfile first
echo "ok copyup mount"
# Test O_TRUNC directly
firstfile_orig_inode=$(stat -c %i checkout-test2/firstfile)
for path in firstfile{,-link}; do
echo truncating > mnt/${path}
assert_file_has_content mnt/${path} truncating
assert_not_file_has_content mnt/${path} first
done
echo -n truncating > mnt/firstfile
assert_streq "$(cat mnt/firstfile)" truncating
firstfile_new_inode=$(stat -c %i checkout-test2/firstfile)
assert_not_streq "${firstfile_orig_inode}" "${firstfile_new_inode}"
assert_test_file -f checkout-test2/firstfile
copyup_reset
firstfile_link_orig_inode=$(stat -c %i checkout-test2/firstfile-link)
firstfile_orig_inode=$(stat -c %i checkout-test2/firstfile)
# Now write via the symlink
echo -n truncating > mnt/firstfile-link
assert_streq "$(cat mnt/firstfile)" truncating
firstfile_new_inode=$(stat -c %i checkout-test2/firstfile)
firstfile_link_new_inode=$(stat -c %i checkout-test2/firstfile-link)
assert_not_streq "${firstfile_orig_inode}" "${firstfile_new_inode}"
assert_streq "${firstfile_link_orig_inode}" "${firstfile_link_new_inode}"
assert_test_file -f checkout-test2/firstfile
# Verify we didn't replace the link with a regfile somehow
assert_test_file -L checkout-test2/firstfile-link
# These both end up creating new files; in the sed case we'll then do a rename()
copyup_reset
echo "hello new file" > mnt/a-new-non-copyup-file
assert_file_has_content_literal mnt/a-new-non-copyup-file "hello new file"
sed -i -e s,first,second, mnt/firstfile
assert_file_has_content_literal mnt/firstfile "second"
echo "ok copyup"