| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| # Copyright (c) 2021 Oracle. All Rights Reserved. |
| # |
| # FS QA Test No. 151 |
| # |
| # Make sure the xfs_db ls command works the way the author thinks it does. |
| # This means that we can list the current directory, list an arbitrary path, |
| # and we can't list things that aren't directories. |
| # |
| seq=`basename $0` |
| seqres=$RESULT_DIR/$seq |
| echo "QA output created by $seq" |
| |
| here=`pwd` |
| tmp=/tmp/$$ |
| status=1 # failure is the default! |
| trap "_cleanup; exit \$status" 0 1 2 3 15 |
| |
| _cleanup() |
| { |
| cd / |
| rm -f $tmp.* |
| } |
| |
| # get standard environment, filters and checks |
| . ./common/rc |
| . ./common/filter |
| |
| # real QA test starts here |
| _supported_fs xfs |
| _require_xfs_db_command "path" |
| _require_xfs_db_command "ls" |
| _require_scratch |
| |
| echo "Format filesystem and populate" |
| _scratch_mkfs > $seqres.full |
| _scratch_mount >> $seqres.full |
| |
| $XFS_INFO_PROG $SCRATCH_MNT | grep -q ftype=1 || \ |
| _notrun "filesystem does not support ftype" |
| |
| filter_ls() { |
| awk ' |
| BEGIN { cookie = 0; } |
| { |
| if (cookie == 0) |
| cookie = $1; |
| printf("+%d %s %s %s %s %s\n", $1 - cookie, $2, $3, $4, $5, $6); |
| cookie = $1; |
| }' | \ |
| sed -e "s/ $root_ino directory / root directory /g" \ |
| -e "s/ $a_ino directory / a_ino directory /g" \ |
| -e "s/ $b_ino directory / b_ino directory /g" \ |
| -e "s/ $c_ino regular / c_ino regular /g" \ |
| -e "s/ $d_ino symlink / d_ino symlink /g" \ |
| -e "s/ $e_ino blkdev / e_ino blkdev /g" \ |
| -e "s/ $f_ino chardev / f_ino chardev /g" \ |
| -e "s/ $g_ino fifo / g_ino fifo /g" \ |
| -e "s/ $big0_ino regular / big0_ino regular /g" \ |
| -e "s/ $big1_ino regular / big1_ino regular /g" \ |
| -e "s/ $h_ino regular / g_ino regular /g" |
| } |
| |
| mkdir $SCRATCH_MNT/a |
| mkdir $SCRATCH_MNT/a/b |
| $XFS_IO_PROG -f -c 'pwrite 0 61' $SCRATCH_MNT/a/c >> $seqres.full |
| ln -s -f b $SCRATCH_MNT/a/d |
| mknod $SCRATCH_MNT/a/e b 0 0 |
| mknod $SCRATCH_MNT/a/f c 0 0 |
| mknod $SCRATCH_MNT/a/g p |
| touch $SCRATCH_MNT/a/averylongnameforadirectorysothatwecanpushthecookieforward |
| touch $SCRATCH_MNT/a/andmakethefirstcolumnlookmoreinterestingtopeoplelolwtfbbq |
| touch $SCRATCH_MNT/a/h |
| |
| root_ino=$(stat -c '%i' $SCRATCH_MNT) |
| a_ino=$(stat -c '%i' $SCRATCH_MNT/a) |
| b_ino=$(stat -c '%i' $SCRATCH_MNT/a/b) |
| c_ino=$(stat -c '%i' $SCRATCH_MNT/a/c) |
| d_ino=$(stat -c '%i' $SCRATCH_MNT/a/d) |
| e_ino=$(stat -c '%i' $SCRATCH_MNT/a/e) |
| f_ino=$(stat -c '%i' $SCRATCH_MNT/a/f) |
| g_ino=$(stat -c '%i' $SCRATCH_MNT/a/g) |
| big0_ino=$(stat -c '%i' $SCRATCH_MNT/a/avery*) |
| big1_ino=$(stat -c '%i' $SCRATCH_MNT/a/andma*) |
| h_ino=$(stat -c '%i' $SCRATCH_MNT/a/h) |
| |
| _scratch_unmount |
| |
| echo "Manually navigate to root dir then list" |
| _scratch_xfs_db -c 'sb 0' -c 'addr rootino' -c ls | filter_ls |
| |
| echo "Use path to navigate to root dir then list" |
| _scratch_xfs_db -c 'path /' -c ls | filter_ls |
| |
| echo "Use path to navigate to /a then list" |
| _scratch_xfs_db -c 'path /a' -c ls | filter_ls |
| |
| echo "Use path to navigate to /a/b then list" |
| _scratch_xfs_db -c 'path /a/b' -c ls | filter_ls |
| |
| echo "Use path to navigate to /a/c (non-dir) then list" |
| _scratch_xfs_db -c 'path /a/c' -c ls |
| |
| # success, all done |
| status=0 |
| exit |