#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2020 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test No. ceph/002
#
# Test bug found while testing copy_file_range.
#
# This bug was an issue with how the OSDs handled the truncate_seq, copying it
# from the original object into the destination object.  This test ensures the
# kernel client correctly handles fixed/non-fixed OSDs.
#
# The bug was tracked here:
#
#   https://tracker.ceph.com/issues/37378
#
# The most relevant commits are:
#
#   ceph OSD:     dcd6a99ef9f5 ("osd: add new 'copy-from2' operation")
#   linux kernel: 78beb0ff2fec ("ceph: use copy-from2 op in copy_file_range")
#
. ./common/preamble
_begin_fstest auto quick copy_range

# get standard environment
. common/filter
. common/attr


_require_xfs_io_command "copy_range"
_exclude_test_mount_option "test_dummy_encryption"
_require_attrs
_require_test

workdir=$TEST_DIR/test-$seq
rm -rf $workdir
mkdir $workdir

# Use 4M object size
objsz=4194304
file="$workdir/file-$objsz"
dest="$workdir/dest-$objsz"

# object_size has to be a multiple of stripe_unit
_ceph_create_file_layout $file $objsz 1 $objsz
_ceph_create_file_layout $dest $objsz 1 $objsz

# Create a 3 objects size files
$XFS_IO_PROG -c "pwrite -S 0x61 0 $objsz" $file >> $seqres.full 2>&1
$XFS_IO_PROG -c "pwrite -S 0x62 $objsz $objsz" $file >> $seqres.full 2>&1
$XFS_IO_PROG -c "pwrite -S 0x63 $(($objsz * 2)) $objsz" $file >> $seqres.full 2>&1

$XFS_IO_PROG -c "pwrite -S 0x64 0 $(($objsz * 3))" $dest >> $seqres.full 2>&1
# Truncate the destination file (messing up with the truncate_seq)
$XFS_IO_PROG -c "truncate 0" $dest >> $seqres.full 2>&1

# copy the whole file over
$XFS_IO_PROG -c "copy_range -s 0 -d 0 -l $(($objsz * 3)) $file" "$dest"

_hexdump $dest

#success, all done
status=0
exit
