1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (C) 2019 Intel Corporation 4# All rights reserved. 5# 6testdir=$(readlink -f $(dirname $0)) 7rootdir=$(readlink -f $testdir/../../..) 8source $rootdir/scripts/common.sh 9source $rootdir/test/common/autotest_common.sh 10 11SMARTCTL_CMD='smartctl -d nvme' 12rpc_py=$rootdir/scripts/rpc.py 13 14"$rootdir/scripts/setup.sh" 15 16bdf=$(get_first_nvme_bdf) 17 18PCI_ALLOWED="${bdf}" $rootdir/scripts/setup.sh reset 19nvme_name=$(get_nvme_ctrlr_from_bdf ${bdf}) 20if [[ -z "$nvme_name" ]]; then 21 echo "setup.sh failed bind kernel driver to ${bdf}" 22 exit 1 23fi 24 25KERNEL_SMART_JSON=$(${SMARTCTL_CMD} --json=g -a /dev/${nvme_name} | grep -v "/dev/${nvme_name}" | sort || true) 26 27${SMARTCTL_CMD} -i /dev/${nvme_name}n1 28 29# logs are not provided by json output 30KERNEL_SMART_ERRLOG=$(${SMARTCTL_CMD} -l error /dev/${nvme_name}) 31 32$rootdir/scripts/setup.sh 33 34$SPDK_BIN_DIR/spdk_tgt -m 0x3 & 35spdk_tgt_pid=$! 36trap 'kill -9 ${spdk_tgt_pid}; exit 1' SIGINT SIGTERM EXIT 37 38waitforlisten $spdk_tgt_pid 39 40$rpc_py bdev_nvme_attach_controller -b Nvme0 -t PCIe -a ${bdf} 41$rpc_py bdev_nvme_cuse_register -n Nvme0 42 43sleep 5 44 45if [ ! -c /dev/spdk/nvme0 ]; then 46 exit 1 47fi 48 49CUSE_SMART_JSON=$(${SMARTCTL_CMD} --json=g -a /dev/spdk/nvme0 | grep -v "/dev/spdk/nvme0" | sort || true) 50 51DIFF_SMART_JSON=$(diff --changed-group-format='%<' --unchanged-group-format='' <(echo "$KERNEL_SMART_JSON") <(echo "$CUSE_SMART_JSON") || true) 52 53# Mask values can change 54ERR_SMART_JSON=$(grep -v "json\.nvme_smart_health_information_log\.\|json\.local_time\.\|json\.temperature\.\|json\.power_on_time\.hours" <<< $DIFF_SMART_JSON || true) 55 56if [ -n "$ERR_SMART_JSON" ]; then 57 echo "Wrong values for: $ERR_SMART_JSON" 58 exit 1 59fi 60 61CUSE_SMART_ERRLOG=$(${SMARTCTL_CMD} -l error /dev/spdk/nvme0) 62if [ "$CUSE_SMART_ERRLOG" != "$KERNEL_SMART_ERRLOG" ]; then 63 echo "Wrong values in NVMe Error log" 64 exit 1 65fi 66 67# Data integrity was checked before, now make sure other commands didn't fail 68${SMARTCTL_CMD} -i /dev/spdk/nvme0n1 69${SMARTCTL_CMD} -c /dev/spdk/nvme0 70${SMARTCTL_CMD} -A /dev/spdk/nvme0 71 72# Health test can fail 73${SMARTCTL_CMD} -x /dev/spdk/nvme0 || true 74${SMARTCTL_CMD} -H /dev/spdk/nvme0 || true 75 76$rpc_py bdev_nvme_detach_controller Nvme0 77sleep 1 78if [ -c /dev/spdk/nvme1 ]; then 79 exit 1 80fi 81 82trap - SIGINT SIGTERM EXIT 83killprocess $spdk_tgt_pid 84