#!/usr/bin/env bash
#
# Test image locking for POSIX locks
#
# Copyright 2017 Red Hat, Inc.
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will 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, see <http://www.gnu.org/licenses/>.
#

# creator
owner=famz@redhat.com

seq="$(basename $0)"
echo "QA output created by $seq"

tmp=/tmp/$$
status=1	# failure is the default!

_cleanup()
{
    _cleanup_test_img
    _rm_test_img "$TEST_IMG.overlay"
    rm -f "$SOCK_DIR/nbd.socket"
}
trap "_cleanup; exit \$status" 0 1 2 3 15

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

_supported_fmt qcow2
_supported_proto file

size=32M

case "$QEMU_DEFAULT_MACHINE" in
  s390-ccw-virtio)
      virtioblk=virtio-blk-ccw
      ;;
  *)
      virtioblk=virtio-blk-pci
      ;;
esac

_make_test_img $size

echo "Starting QEMU"
_launch_qemu -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \
    -device $virtioblk,drive=drive0

echo
echo "Starting a second QEMU using the same image should fail"
echo 'quit' | $QEMU -nographic -monitor stdio \
    -drive file=$TEST_IMG,if=none,id=drive0,file.locking=on \
    -device $virtioblk,drive=drive0 2>&1 | _filter_testdir 2>&1 |
    _filter_qemu |
    sed -e '/falling back to POSIX file/d' \
        -e '/locks can be lost unexpectedly/d'

_cleanup_qemu

echo
echo '=== Testing reopen ==='
echo

# This tests that reopening does not unshare any permissions it should
# not unshare
# (There was a bug where reopening shared exactly the opposite of the
# permissions it was supposed to share)

_launch_qemu

_send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'qmp_capabilities'}" \
    'return'

# Open the image without any format layer (we are not going to access
# it, so that is fine)
# This should keep all permissions shared.
success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'blockdev-add',
      'arguments': {
          'node-name': 'node0',
          'driver': 'file',
          'filename': '$TEST_IMG',
          'locking': 'on'
          } }" \
    'return' \
    'error'

# This snapshot will perform a reopen to drop R/W to RO.
# It should still keep all permissions shared.
success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'blockdev-snapshot-sync',
      'arguments': {
          'node-name': 'node0',
          'snapshot-file': '$TEST_IMG.overlay',
          'snapshot-node-name': 'node1'
      } }" \
    'return' \
    'error'

# Now open the same file again
# This does not require any permissions (and does not unshare any), so
# this will not conflict with node0.
success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'blockdev-add',
      'arguments': {
          'node-name': 'node1',
          'driver': 'file',
          'filename': '$TEST_IMG',
          'locking': 'on'
          } }" \
    'return' \
    'error'

# Start an NBD server to which we can attach node1
success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'nbd-server-start',
      'arguments': {
          'addr': {
              'type': 'unix',
              'data': {
                  'path': '$SOCK_DIR/nbd.socket'
              } } } }" \
    'return' \
    'error'

# Now we attach the image to the NBD server.  This server does require
# some permissions (at least WRITE and READ_CONSISTENT), so if
# reopening node0 unshared any (which it should not have), this will
# fail (but it should not).
success_or_failure=y _send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'nbd-server-add',
      'arguments': {
          'device': 'node1'
      } }" \
    'return' \
    'error'

_cleanup_qemu

echo
echo '=== Testing failure to loosen restrictions ==='
echo

_launch_qemu -drive file=$TEST_IMG,if=none,file.locking=on

_send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'qmp_capabilities'}" \
    'return'

_cleanup_test_img

# When quitting qemu, it will try to drop its locks on the test image.
# Because that file no longer exists, it will be unable to do so.
# However, that is not fatal, so it should just move on.
_send_qemu_cmd $QEMU_HANDLE \
    "{'execute': 'quit'}" \
    'return'

wait=1 _cleanup_qemu

# success, all done
echo "*** done"
rm -f $seq.full
status=0
