diff --git a/kernel/syscall.c b/kernel/syscall.c index 763fd3f2..f810e85b 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -5368,6 +5368,11 @@ SYSCALL_DECLARE(madvise) } if (advice == MADV_REMOVE) { + if (range->flag & VR_LOCKED) { + error = -EINVAL; + goto out; + } + if (!range->memobj || !memobj_is_removable(range->memobj)) { dkprintf("sys_madvise(%lx,%lx,%x):" "not removable [%lx-%lx)\n", diff --git a/test/issues/1372/README b/test/issues/1372/README new file mode 100644 index 00000000..d1f00f21 --- /dev/null +++ b/test/issues/1372/README @@ -0,0 +1,20 @@ +/* REDME COPYRIGHT FUJITSU LIMITED 2020 */ + +ltp: madvise02: MADV_REMOVEが期待通りに動作しない(2) +https://postpeta.pccluster.org/redmine/issues/1372 + +テストセットREADME + +(0) 事前準備 + 1. $HOME/.mck_test_configを用意する + +(1) テスト実行方法 + 1. ./run.sh + +(2) テスト項目詳細 + + LTPの下記項目を実行し期待通りに動作することを確認する + "test OK." が書き出されれば合格判定となる。具体例はresult.logを参照。 + - madvise02 + +以上。 diff --git a/test/issues/1372/result.log b/test/issues/1372/result.log new file mode 100644 index 00000000..dc150161 --- /dev/null +++ b/test/issues/1372/result.log @@ -0,0 +1,27 @@ +[root@hostname 1372]# ./run.sh +mcstop+release.sh ... done +mcreboot.sh -c 12-59 -m 512M@4 ... done +test run. +tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s +madvise02.c:189: PASS: MADV_NORMAL failed as expected: EINVAL +madvise02.c:189: PASS: MADV_NORMAL failed as expected: EINVAL +madvise02.c:189: PASS: MADV_REMOVE failed as expected: EINVAL +madvise02.c:189: PASS: MADV_DONTNEED failed as expected: EINVAL +madvise02.c:182: CONF: MADV_MERGEABLE is not supported +madvise02.c:182: CONF: MADV_UNMERGEABLE is not supported +madvise02.c:189: PASS: MADV_NORMAL failed as expected: ENOMEM +madvise02.c:189: PASS: MADV_WILLNEED failed as expected: ENOMEM +madvise02.c:182: CONF: MADV_WILLNEED is not supported +madvise02.c:189: PASS: MADV_FREE failed as expected: EINVAL +madvise02.c:189: PASS: MADV_WIPEONFORK failed as expected: EINVAL +madvise02.c:189: PASS: MADV_WIPEONFORK shared_anon failed as expected: EINVAL +madvise02.c:189: PASS: MADV_WIPEONFORK private file backed failed as expected: EINVAL + +Summary: +passed 10 +failed 0 +skipped 3 +warnings 0 +tst_tmpdir.c:330: WARN: tst_rmdir: rmobj(/tmp/Ql3dOH) failed: remove(/tmp/Ql3dOH) failed; errno=39: ENOTEMPTY +test OK. +mcstop+release.sh ... done \ No newline at end of file diff --git a/test/issues/1372/run.sh b/test/issues/1372/run.sh new file mode 100755 index 00000000..5d28ebd2 --- /dev/null +++ b/test/issues/1372/run.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# run.sh COPYRIGHT FUJITSU LIMITED 2020 + +# load setting and booting mck. +USELTP=1 +. ../../common.sh +chmod 777 /dev/mcos* + +echo "test run." +ltp=`cat <<__EOL__ +madvise02 +__EOL__` + +FAIL=0 +for tp in $ltp +do + pushd ${LTPBIN} > /dev/null + ${MCEXEC} ${LTPBIN}/${tp} + if [ $? -ne 0 ]; then + FAIL=1 + fi + popd > /dev/null +done + +if [ ${FAIL} -eq 1 ]; then + echo "test NG." +else + echo "test OK." +fi + +mcstop