|  | #! /bin/bash | 
|  | # SPDX-License-Identifier: GPL-2.0 | 
|  | # Copyright (C) 2014 SUSE Linux Products GmbH. All Rights Reserved. | 
|  | # | 
|  | # FS QA Test No. btrfs/058 | 
|  | # | 
|  | # Regression test for a btrfs issue where we create a RO snapshot to use for | 
|  | # a send operation which fails with a -ESTALE error, due to the presence of | 
|  | # orphan inodes accessible through the snapshot's commit root but no longer | 
|  | # present through the main root. | 
|  | # | 
|  | # This issue is fixed by the following linux kernel btrfs patch: | 
|  | # | 
|  | #    Btrfs: update commit root on snapshot creation after orphan cleanup | 
|  | # | 
|  | . ./common/preamble | 
|  | _begin_fstest auto quick send snapshot | 
|  |  | 
|  | # Override the default cleanup function. | 
|  | _cleanup() | 
|  | { | 
|  | if [ ! -z $XFS_IO_PID ]; then | 
|  | kill $XFS_IO_PID > /dev/null 2>&1 | 
|  | fi | 
|  | rm -fr $tmp | 
|  | } | 
|  |  | 
|  | # Import common functions. | 
|  | . ./common/filter | 
|  |  | 
|  | # real QA test starts here | 
|  | _supported_fs btrfs | 
|  | _require_scratch | 
|  | _require_xfs_io_command "-T" | 
|  |  | 
|  | _scratch_mkfs >/dev/null 2>&1 | 
|  | _scratch_mount | 
|  |  | 
|  | # Create a tmpfile file, write some data to it and leave it open, so that our | 
|  | # main subvolume has an orphan inode item. | 
|  | $XFS_IO_PROG -T $SCRATCH_MNT >>$seqres.full 2>&1 < <( | 
|  | echo "pwrite 0 65536" | 
|  | read | 
|  | ) & | 
|  | XFS_IO_PID=$! | 
|  |  | 
|  | # Give it some time to the xfs_io process to create the tmpfile. | 
|  | sleep 3 | 
|  |  | 
|  | # With the tmpfile open, create a RO snapshot and use it for a send operation. | 
|  | # The send operation used to fail with -ESTALE due to the presence of the | 
|  | # orphan inode. | 
|  | _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap | 
|  | _run_btrfs_util_prog send -f /dev/null $SCRATCH_MNT/mysnap | 
|  |  | 
|  | status=0 | 
|  | exit |