@@ -376,6 +376,7 @@ _scratch_xfs_populate() {
is_rt="$(_xfs_get_rtextents "$SCRATCH_MNT")"
is_rmapbt="$(_xfs_has_feature "$SCRATCH_MNT" rmapbt -v)"
is_reflink="$(_xfs_has_feature "$SCRATCH_MNT" reflink -v)"
+ is_pptr="$(_xfs_has_feature "$SCRATCH_MNT" parent -v)"
# Reverse-mapping btree
if [ $is_rmapbt -gt 0 ]; then
@@ -412,6 +413,43 @@ _scratch_xfs_populate() {
cp --reflink=always "${SCRATCH_MNT}/REFCOUNTBT" "${SCRATCH_MNT}/REFCOUNTBT2"
fi
+ # Parent pointers
+ if [ $is_pptr -gt 0 ]; then
+ echo "+ parent pointers"
+
+ # Create a couple of parent pointers
+ __populate_create_dir "${SCRATCH_MNT}/PPTRS" 1 '' --hardlink --format "two_%d"
+
+ # Create one xattr leaf block of parent pointers
+ nr="$((blksz * 2 / 16))"
+ __populate_create_dir "${SCRATCH_MNT}/PPTRS" ${nr} '' --hardlink --format "many%04d"
+
+ # Create multiple xattr leaf blocks of large parent pointers
+ nr="$((blksz * 16 / 16))"
+ __populate_create_dir "${SCRATCH_MNT}/PPTRS" ${nr} '' --hardlink --format "y%0254d"
+
+ # Create multiple paths to a file
+ local moof="${SCRATCH_MNT}/PPTRS/moofile"
+ touch "${moof}"
+ for ((i = 0; i < 4; i++)); do
+ mkdir -p "${SCRATCH_MNT}/PPTRS/SUB${i}"
+ ln "${moof}" "${SCRATCH_MNT}/PPTRS/SUB${i}/moofile"
+ done
+
+ # Create parent pointers of various lengths
+ touch "${SCRATCH_MNT}/PPTRS/vlength"
+ local len_len
+ local tst
+ local fname
+ ln "${SCRATCH_MNT}/PPTRS/vlength" "${SCRATCH_MNT}/PPTRS/b"
+ for len in 32 64 96 128 160 192 224 250 255; do
+ len_len="${#len}"
+ tst="$(perl -e "print \"b\" x (${len} - (${len_len} + 1))")"
+ fname="v${tst}${len}"
+ ln "${SCRATCH_MNT}/PPTRS/vlength" "${SCRATCH_MNT}/PPTRS/${fname}"
+ done
+ fi
+
# Copy some real files (xfs tests, I guess...)
echo "+ real files"
test $fill -ne 0 && __populate_fill_fs "${SCRATCH_MNT}" 5
@@ -17,6 +17,7 @@ GetOptions("start=i" => \$start,
"dir=s" => \$dir,
"remove!" => \$remove,
"help!" => \$help,
+ "hardlink!" => \$hardlink,
"verbose!" => \$verbose);
@@ -36,6 +37,7 @@ Options:
--format=str printf formatting string for file name ("%08d")
--verbose verbose output
--help this help screen
+ --hardlink hardlink subsequent files to the first one created
EOF
exit(1) unless defined $help;
# otherwise...
@@ -51,12 +53,21 @@ $file_mult = 20 if (!defined $file_mult);
$format = "%08d" if (!defined $format);
$incr = 1 if (!defined $incr);
+if ($hardlink) {
+ $file_mult = 0;
+ $link_fname = sprintf($format, $start);
+}
+
for ($i = $start; $i <= $end; $i += $incr) {
$fname = sprintf($format, $i);
if ($remove) {
$verbose && print "rm $fname\n";
unlink($fname) or rmdir($fname) or die("unlink $fname");
+ } elsif ($hardlink && $i > $start) {
+ # hardlink the first file
+ $verbose && print "ln $link_fname $fname\n";
+ link $link_fname, $fname;
} elsif ($file_mult == 0 or ($i % $file_mult) == 0) {
# create a file
$verbose && print "touch $fname\n";