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:
1 parent
46a841a062
commit
3b9304b5d7
2 files changed
+54
-12
No files matched your search
@@ -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"
|
||||
Reference in new issue
Block a user