#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2022-2024 Oracle and/or its affiliates.  All Rights Reserved.
#
# FS QA Test No. 618
#
# simple parent pointer test
#

. ./common/preamble
_begin_fstest auto quick parent

# get standard environment, filters and checks
. ./common/parent
. ./common/filter

# Modify as appropriate
_require_scratch
_require_xfs_sysfs debug/larp
_require_xfs_parent
_require_xfs_io_command "parent"


# Create a directory tree using a protofile and
# make sure all inodes created have parent pointers

protofile=$tmp.proto

cat >$protofile <<EOF
DUMMY1
0 0
: root directory
d--777 3 1
: a directory
testfolder1 d--755 3 1
file1 ---755 3 1 /dev/null
$
: back in the root
testfolder2 d--755 3 1
file2 ---755 3 1 /dev/null
: done
$
EOF

_scratch_mkfs -f -n parent=1 -p $protofile >>$seqres.full 2>&1 \
	|| _fail "mkfs failed"
_check_scratch_fs

_scratch_mount >>$seqres.full 2>&1 \
	|| _fail "mount failed"

testfolder1="testfolder1"
testfolder2="testfolder2"
file1="file1"
file2="file2"
file3="file3"
file1_ln="file1_link"

echo ""
# Create parent pointer test
_xfs_verify_parent "$testfolder1" "$file1" "$testfolder1/$file1"

echo ""
# Move parent pointer test
mv $SCRATCH_MNT/$testfolder1/$file1 $SCRATCH_MNT/$testfolder2/$file1
_xfs_verify_parent "$testfolder2" "$file1" "$testfolder2/$file1"

echo ""
# Hard link parent pointer test
ln $SCRATCH_MNT/$testfolder2/$file1 $SCRATCH_MNT/$testfolder1/$file1_ln
_xfs_verify_parent "$testfolder1" "$file1_ln" "$testfolder1/$file1_ln"
_xfs_verify_parent "$testfolder1" "$file1_ln" "$testfolder2/$file1"
_xfs_verify_parent "$testfolder2" "$file1"    "$testfolder1/$file1_ln"
_xfs_verify_parent "$testfolder2" "$file1"    "$testfolder2/$file1"

echo ""
# Remove hard link parent pointer test
ino="$(stat -c '%i' $SCRATCH_MNT/$testfolder2/$file1)"
rm $SCRATCH_MNT/$testfolder2/$file1
_xfs_verify_parent "$testfolder1" "$file1_ln" "$testfolder1/$file1_ln"
_xfs_verify_no_parent "$file1" "$ino" "$testfolder1/$file1_ln"

echo ""
# Rename parent pointer test
ino="$(stat -c '%i' $SCRATCH_MNT/$testfolder1/$file1_ln)"
mv $SCRATCH_MNT/$testfolder1/$file1_ln $SCRATCH_MNT/$testfolder1/$file2
_xfs_verify_parent "$testfolder1" "$file2" "$testfolder1/$file2"
_xfs_verify_no_parent "$file1_ln" "$ino" "$testfolder1/$file2"

echo ""
# Over write parent pointer test
touch $SCRATCH_MNT/$testfolder2/$file3
_xfs_verify_parent "$testfolder2" "$file3" "$testfolder2/$file3"
ino="$(stat -c '%i' $SCRATCH_MNT/$testfolder2/$file3)"
mv -f $SCRATCH_MNT/$testfolder2/$file3 $SCRATCH_MNT/$testfolder1/$file2
_xfs_verify_parent "$testfolder1" "$file2" "$testfolder1/$file2"

# Make sure that parent -p filtering works
mkdir -p $SCRATCH_MNT/dira/ $SCRATCH_MNT/dirb/
dira_inum=$(stat -c '%i' $SCRATCH_MNT/dira)
dirb_inum=$(stat -c '%i' $SCRATCH_MNT/dirb)
touch $SCRATCH_MNT/gorn
ln $SCRATCH_MNT/gorn $SCRATCH_MNT/dira/file1
ln $SCRATCH_MNT/gorn $SCRATCH_MNT/dirb/file1
echo look for both
$XFS_IO_PROG -c 'parent -p' $SCRATCH_MNT/gorn | _filter_scratch
echo look for dira
$XFS_IO_PROG -c 'parent -p -n dira' -c "parent -p -i $dira_inum" $SCRATCH_MNT/gorn | _filter_scratch
echo look for dirb
$XFS_IO_PROG -c 'parent -p -n dirb' -c "parent -p -i $dirb_inum" $SCRATCH_MNT/gorn | _filter_scratch

# success, all done
status=0
exit
