| ##/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0+ | |
| # Copyright (c) 2025 Oracle. All Rights Reserved. | |
| # | |
| # Common/sysfs file for the sysfs related helper functions. | |
| # Test for the existence of a policy at /sys/fs/$FSTYP/$DEV/$ATTR | |
| # | |
| # All arguments are necessary, and in this order: | |
| # - dev: device name, e.g. $SCRATCH_DEV | |
| # - attr: path name under /sys/fs/$FSTYP/$dev | |
| # - policy: policy within /sys/fs/$FSTYP/$dev | |
| # | |
| # Usage example: | |
| # _has_fs_sysfs_attr_policy /dev/mapper/scratch-dev read_policy round-robin | |
| _has_fs_sysfs_attr_policy() | |
| { | |
| local dev=$1 | |
| local attr=$2 | |
| local policy=$3 | |
| if [ ! -b "$dev" -o -z "$attr" -o -z "$policy" ]; then | |
| _fail \ | |
| "Usage: _has_fs_sysfs_attr_policy <mounted_device> <attr> <policy>" | |
| fi | |
| local dname=$(_fs_sysfs_dname $dev) | |
| if ! test -e /sys/fs/${FSTYP}/${dname}/${attr}; then | |
| return 1 | |
| fi | |
| cat /sys/fs/${FSTYP}/${dname}/${attr} | grep -q ${policy} | |
| } | |
| # Require the existence of a sysfs entry at /sys/fs/$FSTYP/$DEV/$ATTR | |
| # and value in it contains $policy | |
| # All arguments are necessary, and in this order: | |
| # - dev: device name, e.g. $SCRATCH_DEV | |
| # - attr: path name under /sys/fs/$FSTYP/$dev | |
| # - policy: mentioned in /sys/fs/$FSTYP/$dev/$attr | |
| # | |
| # Usage example: | |
| # _require_fs_sysfs_attr_policy /dev/mapper/scratch-dev read_policy round-robin | |
| _require_fs_sysfs_attr_policy() | |
| { | |
| _has_fs_sysfs_attr_policy "$@" && return | |
| local dev=$1 | |
| local attr=$2 | |
| local policy=$3 | |
| local dname=$(_fs_sysfs_dname $dev) | |
| _notrun "This test requires /sys/fs/${FSTYP}/${dname}/${attr} ${policy}" | |
| } | |
| _set_sysfs_policy() | |
| { | |
| local dev=$1 | |
| local attr=$2 | |
| shift | |
| shift | |
| local policy=$@ | |
| _set_fs_sysfs_attr $dev $attr ${policy} | |
| case "$FSTYP" in | |
| btrfs) | |
| _get_fs_sysfs_attr $dev $attr | grep -q "[${policy}]" | |
| if [[ $? != 0 ]]; then | |
| echo "Setting sysfs $attr $policy failed" | |
| fi | |
| ;; | |
| *) | |
| _fail \ | |
| "sysfs syntax verification for '${attr}' '${policy}' for '${FSTYP}' is not implemented" | |
| ;; | |
| esac | |
| } | |
| _set_sysfs_policy_must_fail() | |
| { | |
| local dev=$1 | |
| local attr=$2 | |
| shift | |
| shift | |
| local policy=$@ | |
| _set_fs_sysfs_attr $dev $attr ${policy} | _filter_sysfs_error \ | |
| | tee -a $seqres.full | |
| } | |
| # Verify sysfs attribute rejects invalid input. | |
| # Usage syntax: | |
| # _verify_sysfs_syntax <$dev> <$attr> <$policy> [$value] | |
| # Examples: | |
| # _verify_sysfs_syntax $TEST_DEV read_policy pid | |
| # _verify_sysfs_syntax $TEST_DEV read_policy round-robin 4k | |
| # Note: | |
| # Testcase must include | |
| # . ./common/filter | |
| # Prerequisite checks are kept outside this function | |
| # to make them clear to the test case, rather than hiding | |
| # them deep inside another function. | |
| # _require_fs_sysfs_attr_policy $TEST_DEV $attr $policy | |
| _verify_sysfs_syntax() | |
| { | |
| local dev=$1 | |
| local attr=$2 | |
| local policy=$3 | |
| local value=$4 | |
| # Test policy specified wrongly. Must fail. | |
| _set_sysfs_policy_must_fail $dev $attr "'$policy $policy'" | |
| _set_sysfs_policy_must_fail $dev $attr "'$policy t'" | |
| _set_sysfs_policy_must_fail $dev $attr "' '" | |
| _set_sysfs_policy_must_fail $dev $attr "'${policy} n'" | |
| _set_sysfs_policy_must_fail $dev $attr "'n ${policy}'" | |
| _set_sysfs_policy_must_fail $dev $attr "' ${policy}'" | |
| _set_sysfs_policy_must_fail $dev $attr "' ${policy} '" | |
| _set_sysfs_policy_must_fail $dev $attr "'${policy} '" | |
| _set_sysfs_policy_must_fail $dev $attr _${policy} | |
| _set_sysfs_policy_must_fail $dev $attr ${policy}_ | |
| _set_sysfs_policy_must_fail $dev $attr _${policy}_ | |
| _set_sysfs_policy_must_fail $dev $attr ${policy}: | |
| # Test policy longer than 32 chars fails stable. | |
| _set_sysfs_policy_must_fail $dev $attr 'jfdkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjffjfjfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' | |
| # Test policy specified correctly. Must pass. | |
| _set_sysfs_policy $dev $attr $policy | |
| # If the policy has no value return | |
| if [[ -z $value ]]; then | |
| return | |
| fi | |
| # Test value specified wrongly. Must fail. | |
| _set_sysfs_policy_must_fail $dev $attr "'$policy: $value'" | |
| _set_sysfs_policy_must_fail $dev $attr "'$policy:$value '" | |
| _set_sysfs_policy_must_fail $dev $attr "'$policy:$value typo'" | |
| _set_sysfs_policy_must_fail $dev $attr "'$policy:${value}typo'" | |
| _set_sysfs_policy_must_fail $dev $attr "'$policy :$value'" | |
| # Test policy and value all specified correctly. Must pass. | |
| _set_sysfs_policy $dev $attr $policy:$value | |
| } |