| #!/bin/sh |
| |
| ################################################################################ |
| ## ## |
| ## Copyright (c) 2009 FUJITSU LIMITED ## |
| ## Author: Shi Weihua <shiwh@cn.fujitsu.com> ## |
| ## Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com> ## |
| ## Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz> ## |
| ## ## |
| ## 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, write to the Free Software Foundation, ## |
| ## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ## |
| ## ## |
| ################################################################################ |
| |
| TCID="cgroup_fj_function2" |
| TST_TOTAL=7 |
| |
| . cgroup_fj_common.sh |
| |
| subsystem=$1 |
| |
| usage_and_exit() |
| { |
| echo "usage of cgroup_fj_function2.sh: " |
| echo " ./cgroup_fj_function2.sh subsystem" |
| echo "example: ./cgroup_fj_function2.sh cpuset" |
| |
| tst_brkm TBROK "$1" |
| } |
| |
| if [ "$#" -ne "1" ]; then |
| usage_and_exit "Invalid number of parameters" |
| fi |
| |
| # Move a task from group to group |
| test1() |
| { |
| if ! attach_and_check "$pid" "$start_path/ltp_1"; then |
| tst_resm TFAIL "Failed to attach task" |
| return |
| fi |
| |
| if ! attach_and_check "$pid" "$start_path"; then |
| tst_resm TFAIL "Failed to attach task" |
| return |
| fi |
| |
| tst_resm TPASS "Task attached succesfully" |
| } |
| |
| # Group can be renamed with mv |
| test2() |
| { |
| create_subgroup "$start_path/ltp_2" |
| |
| if ! mv "$start_path/ltp_2" "$start_path/ltp_3"; then |
| tst_resm TFAIL "Failed to move $start_path/ltp_2 to $start_path/ltp_3" |
| rmdir "$start_path/ltp_2" |
| return |
| fi |
| |
| if ! rmdir "$start_path/ltp_3"; then |
| tst_resm TFAIL "Failed to remove $start_path/ltp_3" |
| return |
| fi |
| |
| tst_resm TPASS "Successfully moved $start_path/ltp_2 to $start_path/ltp_3" |
| } |
| |
| # Group can be renamed with mv unless the target name exists |
| test3() |
| { |
| create_subgroup "$start_path/ltp_2" |
| |
| if mv "$start_path/ltp_2" "$start_path/ltp_1" > /dev/null 2>&1; then |
| tst_resm TFAIL "Moved $start_path/ltp_2 over existing $start_path/ltp_1" |
| return |
| fi |
| |
| tst_resm TPASS "Failed to move $start_path/ltp_2 over existing $start_path/ltp_1" |
| |
| ROD rmdir "$start_path/ltp_2" |
| } |
| |
| # Group with attached task cannot be removed |
| test4() |
| { |
| if ! attach_and_check "$pid" "$start_path/ltp_1"; then |
| tst_resm TFAIL "Failed to attach $pid to $start_path/ltp_1" |
| return |
| fi |
| |
| if rmdir "$start_path/ltp_1" > /dev/null 2>&1; then |
| tst_resm TFAIL "Removed $start_path/ltp_1 which contains task $pid" |
| create_subgroup "$start_path/ltp_1" |
| return |
| fi |
| |
| tst_resm TPASS "Group $start_path/ltp_1 with task $pid cannot be removed" |
| } |
| |
| # Group with a subgroup cannot be removed |
| test5() |
| { |
| create_subgroup "$start_path/ltp_1/a" |
| |
| if rmdir "$start_path/ltp_1" > /dev/null 2>&1; then |
| tst_resm TFAIL "Removed $start_path/ltp_1 which contains subdir 'a'" |
| return |
| fi |
| |
| tst_resm TPASS "Dir $start_path/ltp_1 with subdir 'a' cannot be removed" |
| |
| ROD rmdir "$start_path/ltp_1/a" |
| |
| ROD echo "$pid" \> "$start_path/tasks" |
| } |
| |
| # Group cannot be moved outside of hierarchy |
| test6() |
| { |
| if mv "$start_path/ltp_1" "$PWD/ltp" > /dev/null 2>&1; then |
| tst_resm TFAIL "Subgroup $start_path/ltp_1 outside hierarchy to $PWD/ltp" |
| return |
| fi |
| |
| tst_resm TPASS "Subgroup $start_path/ltp_1 cannot be moved to $PWD/ltp" |
| } |
| |
| # Tasks file cannot be removed |
| test7() |
| { |
| if rm "$start_path/ltp_1/tasks" > /dev/null 2>&1; then |
| tst_resm TFAIL "Tasks file $start_path/ltp_1/tasks could be removed" |
| return |
| fi |
| |
| tst_resm TPASS "Tasks file $start_path/ltp_1/tasks cannot be removed" |
| } |
| |
| # Test notify_on_release with invalid inputs |
| test8() |
| { |
| if echo "-1" > "$start_path/ltp_1/notify_on_release" 2>/dev/null; then |
| tst_resm TFAIL "Can write -1 to $start_path/ltp_1/notify_on_release" |
| return |
| fi |
| |
| if echo "ltp" > "$start_path/ltp_1/notify_on_release" 2>/dev/null; then |
| tst_resm TFAIL "Can write ltp to $start_path/ltp_1/notify_on_release" |
| return |
| fi |
| |
| tst_resm TPASS "Cannot write invalid values to $start_path/ltp_1/notify_on_release" |
| } |
| |
| # Test that notify_on_release can be changed |
| test9() |
| { |
| local notify=$(ROD cat "$start_path/ltp_1/notify_on_release") |
| local value |
| |
| if [ "$notify" -eq 0 ]; then |
| value=1 |
| else |
| value=0 |
| fi |
| |
| if ! echo "$value" > "$start_path/ltp_1/notify_on_release"; then |
| tst_resm TFAIL "Failed to set $start_path/ltp_1/notify_on_release to $value" |
| return |
| fi |
| |
| ROD echo "$notify" \> "$start_path/ltp_1/notify_on_release" |
| |
| tst_resm TPASS "Set $start_path/ltp_1/notify_on_release to $value" |
| } |
| |
| setup |
| |
| cgroup_fj_proc& |
| pid=$! |
| |
| start_path="$mount_point/ltp" |
| |
| create_subgroup "$start_path" |
| create_subgroup "$start_path/ltp_1" |
| |
| test1 |
| test2 |
| test3 |
| test4 |
| test5 |
| test6 |
| test7 |
| test8 |
| test9 |
| |
| ROD kill -9 $pid |
| wait $pid |
| ROD rmdir "$start_path/ltp_1" |
| |
| tst_exit |