| #! /bin/bash |
| # FS QA Test No. 298 |
| # |
| # Test that inline symlinks are removed from the inode when an extended |
| # attributes forces it into being remote symlink. |
| # Warning: this test will ASSERT on unpatched DEBUG XFS. |
| # |
| #----------------------------------------------------------------------- |
| # Copyright (c) 2013 SGI. All Rights Reserved. |
| # |
| # This program is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public License as |
| # published by the Free Software Foundation. |
| # |
| # This program is distributed in the hope that it would be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, write the Free Software Foundation, |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| #----------------------------------------------------------------------- |
| # |
| |
| 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 |
| |
| # Modify as appropriate. This is a XFS specific bug. xfs_db also limits |
| # this test to xfs |
| _supported_fs xfs |
| _supported_os Linux |
| |
| _require_scratch |
| |
| rm -f $seqres.full |
| _scratch_mkfs_xfs >/dev/null 2>&1 |
| |
| SYMLINK_FILE="$SCRATCH_MNT/symlink" |
| SYMLINK="" |
| SYMLINK_ADD="0123456789ABCDEF01234567890ABCDEF" |
| |
| # test from 32 to MAXPATHLEN sized symlink. This should make sure that |
| # 256-1024 byte version 2 and 3 inodes are covered. |
| SIZE=32 |
| while [ $SIZE -lt 1024 ];do |
| _scratch_mount >/dev/null 2>&1 |
| cd $SCRATCH_MNT |
| echo "Testing symlink size $SIZE" |
| SYMLINK="${SYMLINK}${SYMLINK_ADD}" |
| ln -s $SYMLINK $SYMLINK_FILE > /dev/null 2>&1 |
| |
| inode=`ls -li $SYMLINK_FILE | awk '{print $1}'` |
| # add the extended attributes |
| attr -Rs 1234567890ab $SYMLINK_FILE < /dev/null > /dev/null 2>&1 |
| attr -Rs 1234567890ac $SYMLINK_FILE < /dev/null > /dev/null 2>&1 |
| attr -Rs 1234567890ad $SYMLINK_FILE < /dev/null > /dev/null 2>&1 |
| # remove the extended attributes |
| attr -Rr 1234567890ab $SYMLINK_FILE > /dev/null 2>&1 |
| attr -Rr 1234567890ac $SYMLINK_FILE > /dev/null 2>&1 |
| attr -Rr 1234567890ad $SYMLINK_FILE > /dev/null 2>&1 |
| # remove the symlink - make sure ifree removes the remote symlink. |
| rm $SYMLINK_FILE |
| # umount and check the number of extents on the inode. Should be 0. |
| cd / |
| _scratch_unmount >/dev/null 2>&1 |
| _scratch_xfs_db -c "inode $inode" -c "p core.nextents" |
| |
| let SIZE=$SIZE+32 |
| done |
| |
| status=0 |
| exit |