- From bffab612db2e4d6fa94ef3923d8e988c68c6181a Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Tue, 29 Apr 2025 18:00:00 +0200
- Subject: [PATCH 1/4] sys: |nfs41_Write()| should not modify
- |nfs41_fcb->StandardInfo.EndOfFile|
- |nfs41_Write()| should not modify |nfs41_fcb->StandardInfo.EndOfFile|,
- |nfs41_ExtendForCache()| is responsible to update
- |nfs41_fcb->StandardInfo.EndOfFile| if the file size grows.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- sys/nfs41sys_readwrite.c | 2 --
- 1 file changed, 2 deletions(-)
- diff --git a/sys/nfs41sys_readwrite.c b/sys/nfs41sys_readwrite.c
- index d1a3ba7..ba6f3db 100644
- --- a/sys/nfs41sys_readwrite.c
- +++ b/sys/nfs41sys_readwrite.c
- @@ -402,8 +402,6 @@ NTSTATUS nfs41_Write(
- InterlockedIncrement(&write.sops);
- InterlockedAdd64(&write.size, entry->u.ReadWrite.len);
- #endif
- - nfs41_fcb->StandardInfo.EndOfFile.QuadPart = entry->buf_len +
- - entry->u.ReadWrite.offset;
- status = RxContext->CurrentIrp->IoStatus.Status = STATUS_SUCCESS;
- RxContext->IoStatusBlock.Information = entry->buf_len;
- nfs41_fcb->changeattr = entry->ChangeTime;
- --
- 2.45.1
- From 7991b7488c1a623b7a7598e9b4a86bbe4536fd24 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Wed, 30 Apr 2025 13:06:02 +0200
- Subject: [PATCH 2/4] tests: Add manual tests for block cloning via xcopy.exe
- and winclonefile.exe
- Add manual tests for block cloning via xcopy.exe and winclonefile.exe.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- tests/manual_testing.txt | 32 ++++++++++++++++++++++++++++++++
- 1 file changed, 32 insertions(+)
- diff --git a/tests/manual_testing.txt b/tests/manual_testing.txt
- index 4da80fe..f63f426 100644
- --- a/tests/manual_testing.txt
- +++ b/tests/manual_testing.txt
- @@ -456,6 +456,38 @@ $ runat "x1" "ls -la"
- $ bash -c 'cd -@ "x1" && ls -la'
- +#
- +# Test for block cloning via |FSCTL_DUPLICATE_EXTENTS_TO_FILE|+NFSv4.2 CLONE
- +#
- +
- +# 1. Clone 5GB file via Windows 11 xcopy.exe (xcopy.exe uses |CopyFile2()|,
- +# which uses |FSCTL_DUPLICATE_EXTENTS_TO_FILE| by default in Win11;
- +# requires NFSv4.2 server with btrfs (XFS and ZFS should work too, not
- +# tested yet)):
- +---- snip ----
- +# clone a 5GB file
- +mkdir -p dir1 dir2
- +rm -f dir1/mybigfile.bin dir2/mybigfile.bin
- +time dd if=/dev/urandom of=dir1/mybigfile.bin bs=$((5*1024*1024)) count=1024
- +xcopy /S /E dir1 dir2
- +md5sum dir1/mybigfile.bin dir2/mybigfile.bin
- +---- snip ----
- +
- +# 2. Clone sparse file via "winclonefile", and test whether sparse file
- +# layout and hash sums are identical
- +---- snip ----
- +rm sparsefile2.bin sparsefile2_clone.bin
- +printf "hello\n" | dd of=sparsefile2.bin seek=$((64)) bs=1024
- +printf "world\n" | dd of=sparsefile2.bin seek=$((64*4)) bs=1024
- +dd if=/dev/null of=sparsefile2.bin seek=$((64*8)) bs=1024
- +winclonefile sparsefile2.bin sparsefile2_clone.bin
- +# check whether sparse file layout is the same
- +diff -u <(lssparse -H sparsefile2.bin) <(lssparse -H sparsefile2_clone.bin) && echo "# Test OK" || echo "# Test FAILED"
- +# both hash sums must be identical
- +md5sum --binary sparsefile2.bin sparsefile2_clone.bin
- +---- snip ----
- +
- +
- #
- # Test whether TMPDIR, TEMP, TMP can be on a NFS filesystem
- #
- --
- 2.45.1
- From 2c3db7771963ba019885767edb872400f974ce44 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Wed, 30 Apr 2025 15:01:02 +0200
- Subject: [PATCH 3/4] tests: Add new test script to test various sparse file
- layouts with cp/winclonefile etc.
- Add new test script to test various sparse file layouts with
- cp/winclonefile etc.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- tests/sparsefiles/multisparsefiletest.ksh | 286 ++++++++++++++++++++++
- 1 file changed, 286 insertions(+)
- create mode 100644 tests/sparsefiles/multisparsefiletest.ksh
- diff --git a/tests/sparsefiles/multisparsefiletest.ksh b/tests/sparsefiles/multisparsefiletest.ksh
- new file mode 100644
- index 0000000..5fe82c4
- --- /dev/null
- +++ b/tests/sparsefiles/multisparsefiletest.ksh
- @@ -0,0 +1,286 @@
- +#!/bin/ksh93
- +
- +#
- +# MIT License
- +#
- +# Copyright (c) 2025 Roland Mainz <roland.mainz@nrubsig.org>
- +#
- +# Permission is hereby granted, free of charge, to any person obtaining a copy
- +# of this software and associated documentation files (the "Software"), to deal
- +# in the Software without restriction, including without limitation the rights
- +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- +# copies of the Software, and to permit persons to whom the Software is
- +# furnished to do so, subject to the following conditions:
- +#
- +# The above copyright notice and this permission notice shall be included in all
- +# copies or substantial portions of the Software.
- +#
- +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- +# SOFTWARE.
- +#
- +
- +#
- +# multisparsefiletest1.ksh - test many combinations of sparse file layouts
- +#
- +# Written by Roland Mainz <roland.mainz@nrubsig.org>
- +#
- +
- +function multisparsefiletest1
- +{
- + set -o nounset
- + set -o errexit
- +
- + integer -r dd_blksize=1024
- +
- + integer tests_ok=0
- + integer tests_failed=0
- + integer tests_skipped=0
- +
- + compound c=(
- + integer i
- + typeset testlabel
- +
- + integer found_num_holes # found number of hole ranges
- + integer found_num_data # found number of data ranges
- + )
- +
- + compound -A expected_results=(
- + ['emptyfile']=(
- + integer num_holes=1
- + integer num_data=0
- + )
- + ['dataat0pos,']=(
- + integer num_holes=0
- + integer num_data=1
- + )
- + ['helloat256kpos,']=(
- + integer num_holes=1
- + integer num_data=1
- + )
- + ['dataat0pos,helloat256kpos,']=(
- + integer num_holes=1
- + integer num_data=2
- + )
- + ['helloat512kpos,']=(
- + integer num_holes=1
- + integer num_data=1
- + )
- + ['dataat0pos,helloat512kpos,']=(
- + integer num_holes=1
- + integer num_data=2
- + )
- + ['helloat256kpos,helloat512kpos,']=(
- + integer num_holes=2
- + integer num_data=2
- + )
- + ['dataat0pos,helloat256kpos,helloat512kpos,']=(
- + integer num_holes=2
- + integer num_data=3
- + )
- + ['holeatend,']=(
- + integer num_holes=1
- + integer num_data=0
- + )
- + ['dataat0pos,holeatend,']=(
- + integer num_holes=1
- + integer num_data=1
- + )
- + ['helloat256kpos,holeatend,']=(
- + integer num_holes=2
- + integer num_data=1
- + )
- + ['dataat0pos,helloat256kpos,holeatend,']=(
- + integer num_holes=2
- + integer num_data=2
- + )
- + ['helloat512kpos,holeatend,']=(
- + integer num_holes=2
- + integer num_data=1
- + )
- + ['dataat0pos,helloat512kpos,holeatend,']=(
- + integer num_holes=2
- + integer num_data=2
- + )
- + ['helloat256kpos,helloat512kpos,holeatend,']=(
- + integer num_holes=3
- + integer num_data=2
- + )
- + ['dataat0pos,helloat256kpos,helloat512kpos,holeatend,']=(
- + integer num_holes=3
- + integer num_data=3
- + )
- +
- +
- + ['appenddataatend']=(
- + integer num_holes=0
- + integer num_data=1
- + )
- + ['dataat0pos,appenddataatend']=(
- + integer num_holes=0
- + integer num_data=1
- + )
- + ['helloat256kpos,appenddataatend']=(
- + integer num_holes=1
- + integer num_data=1
- + )
- + ['dataat0pos,helloat256kpos,appenddataatend']=(
- + integer num_holes=1
- + integer num_data=2
- + )
- + ['helloat512kpos,appenddataatend']=(
- + integer num_holes=1
- + integer num_data=1
- + )
- + ['dataat0pos,helloat512kpos,appenddataatend']=(
- + integer num_holes=1
- + integer num_data=2
- + )
- + ['helloat256kpos,helloat512kpos,appenddataatend']=(
- + integer num_holes=2
- + integer num_data=2
- + )
- + ['dataat0pos,helloat256kpos,helloat512kpos,appenddataatend']=(
- + integer num_holes=2
- + integer num_data=3
- + )
- + ['holeatend,appenddataatend']=(
- + integer num_holes=1
- + integer num_data=1
- + )
- + ['dataat0pos,holeatend,appenddataatend']=(
- + integer num_holes=1
- + integer num_data=2
- + )
- + ['helloat256kpos,holeatend,appenddataatend']=(
- + integer num_holes=2
- + integer num_data=2
- + )
- + ['dataat0pos,helloat256kpos,holeatend,appenddataatend']=(
- + integer num_holes=2
- + integer num_data=3
- + )
- + ['helloat512kpos,holeatend,appenddataatend']=(
- + integer num_holes=2
- + integer num_data=2
- + )
- + ['dataat0pos,helloat512kpos,holeatend,appenddataatend']=(
- + integer num_holes=2
- + integer num_data=3
- + )
- + ['helloat256kpos,helloat512kpos,holeatend,appenddataatend']=(
- + integer num_holes=3
- + integer num_data=3
- + )
- + ['dataat0pos,helloat256kpos,helloat512kpos,holeatend,appenddataatend']=(
- + integer num_holes=3
- + integer num_data=3
- + )
- + )
- +
- + for ((c.i=0 ; c.i < 31 ; c.i++ )) ; do
- + rm -f \
- + 'sparsefile2.bin' \
- + 'sparsefile2_cpsparse.bin' \
- + 'sparsefile2_cloned.bin'
- + c.testlabel=''
- +
- + if (( c.i == 0 )) ; then
- + c.testlabel='emptyfile'
- + touch 'sparsefile2.bin'
- + fi
- +
- + if (( c.i & 1 )) ; then
- + printf 'start\n' >'sparsefile2.bin'
- + c.testlabel='dataat0pos,'
- + else
- + testlabel='holeat0pos,'
- + fi
- + if (( c.i & 2 )) ; then
- + # Cygwin has a minimum hole size of 128k on NTFS, so we cannot use smaller values
- + printf "hello\n" | dd of='sparsefile2.bin' seek=$((256)) bs=${dd_blksize} 2>'/dev/null'
- + c.testlabel+='helloat256kpos,'
- + fi
- + if (( c.i & 4 )) ; then
- + printf "world\n" | dd of='sparsefile2.bin' seek=$((512)) bs=${dd_blksize} 2>'/dev/null'
- + c.testlabel+='helloat512kpos,'
- + fi
- + if (( c.i & 8 )) ; then
- + dd if=/dev/null of='sparsefile2.bin' seek=$((2048)) bs=${dd_blksize} 2>'/dev/null'
- + c.testlabel+='holeatend,'
- + fi
- + if (( c.i & 16 )) ; then
- + printf 'appenddataatend\n' >>'sparsefile2.bin'
- + c.testlabel+='appenddataatend'
- + fi
- +
- + typeset tstmod
- +
- + for tstmod in 'plainfile' 'cp_sparseauto' 'cloned' ; do
- + printf '# Test %d '%s' generated\n' c.i "${c.testlabel}/$tstmod"
- +
- + case "${tstmod}" in
- + 'plainfile')
- + c.stdout="$(lssparse -H 'sparsefile2.bin')"
- + ;;
- + 'cp_sparseauto')
- + /usr/bin/cp --sparse='auto' 'sparsefile2.bin' 'sparsefile2_cpsparse.bin'
- + c.stdout="$(lssparse -H 'sparsefile2_cpsparse.bin')"
- + ;;
- + 'cloned')
- + if $test_cloning ; then
- + winclonefile.exe 'sparsefile2.bin' 'sparsefile2_cloned.bin' 1>'/dev/null'
- + c.stdout="$(lssparse -H 'sparsefile2_cloned.bin')"
- + else
- + printf "# Test '%s' SKIPPED\n" "${c.testlabel}/${tstmod}"
- + (( tests_skipped++ ))
- + continue
- + fi
- + ;;
- + *)
- + printf -u2 "Unknown test mod"
- + ;;
- + esac
- +
- + c.found_num_holes=$(grep -F 'Hole range' <<<"${c.stdout}" | wc -l)
- + c.found_num_data=$(grep -F 'Data range' <<<"${c.stdout}" | wc -l)
- +
- + if (( expected_results[${c.testlabel}].num_holes != c.found_num_holes ||
- + expected_results[${c.testlabel}].num_data != c.found_num_data )) ; then
- + printf "# Test '%s' ERROR, expeced %d hole ranges and %d data ranges, got\n" \
- + "${c.testlabel}/${tstmod}" \
- + ${expected_results[${c.testlabel}].num_holes} \
- + ${expected_results[${c.testlabel}].num_data}
- + print -v c
- + (( tests_failed++ ))
- + else
- + printf "# Test '%s' OK\n" "${c.testlabel}/${tstmod}"
- + (( tests_ok++ ))
- + fi
- + done
- + done
- +
- + printf '\n######## Tests OK=%d, skipped tests=%d, failed tests=%d\n' \
- + tests_ok tests_skipped tests_failed
- + return 0
- +}
- +
- +builtin wc
- +
- +#
- +# ToDo list:
- +# - Test whether filesystem supports block cloning and
- +# winclonefile.exe is available
- +# - variable block size
- +# - tests for sparse files >= 2GB, 4GB, 16GB
- +#
- +typeset test_cloning=false
- +
- +multisparsefiletest1
- +
- +#EOF.
- +
- --
- 2.45.1
- From 37d2b0d65f12d00de5719706d98e7256fca7cd1a Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Wed, 30 Apr 2025 15:06:53 +0200
- Subject: [PATCH 4/4] tests: Add missing MIT license to test scripts
- Add missing MIT license to test scripts
- Reported-by: Cedric Blancher <cedric.blancher@gmail.com>
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- tests/nfsbuildtest/nfsbuildtest.ksh93 | 24 +++++++++++++++++++
- tests/winlocktest1/winlocktest1.ksh | 24 +++++++++++++++++++
- .../wintartest_comparewinvsgnu001.bash | 24 +++++++++++++++++++
- tests/wintartests/wintartest_seq001.bash | 24 +++++++++++++++++++
- 4 files changed, 96 insertions(+)
- diff --git a/tests/nfsbuildtest/nfsbuildtest.ksh93 b/tests/nfsbuildtest/nfsbuildtest.ksh93
- index 864eff4..c9e056a 100644
- --- a/tests/nfsbuildtest/nfsbuildtest.ksh93
- +++ b/tests/nfsbuildtest/nfsbuildtest.ksh93
- @@ -1,5 +1,29 @@
- #!/usr/bin/ksh93
- +#
- +# MIT License
- +#
- +# Copyright (c) 2025 Roland Mainz <roland.mainz@nrubsig.org>
- +#
- +# Permission is hereby granted, free of charge, to any person obtaining a copy
- +# of this software and associated documentation files (the "Software"), to deal
- +# in the Software without restriction, including without limitation the rights
- +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- +# copies of the Software, and to permit persons to whom the Software is
- +# furnished to do so, subject to the following conditions:
- +#
- +# The above copyright notice and this permission notice shall be included in all
- +# copies or substantial portions of the Software.
- +#
- +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- +# SOFTWARE.
- +#
- +
- #
- # nfsbuildtest.ksh93
- #
- diff --git a/tests/winlocktest1/winlocktest1.ksh b/tests/winlocktest1/winlocktest1.ksh
- index 8b0307b..91f6433 100644
- --- a/tests/winlocktest1/winlocktest1.ksh
- +++ b/tests/winlocktest1/winlocktest1.ksh
- @@ -1,5 +1,29 @@
- #!/usr/bin/ksh93
- +#
- +# MIT License
- +#
- +# Copyright (c) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
- +#
- +# Permission is hereby granted, free of charge, to any person obtaining a copy
- +# of this software and associated documentation files (the "Software"), to deal
- +# in the Software without restriction, including without limitation the rights
- +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- +# copies of the Software, and to permit persons to whom the Software is
- +# furnished to do so, subject to the following conditions:
- +#
- +# The above copyright notice and this permission notice shall be included in all
- +# copies or substantial portions of the Software.
- +#
- +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- +# SOFTWARE.
- +#
- +
- #
- # winlocktest1 - test whether Win32 locks work across NFSv4 mounts
- #
- diff --git a/tests/wintartests/wintartest_comparewinvsgnu001.bash b/tests/wintartests/wintartest_comparewinvsgnu001.bash
- index 39c1ffb..ced9c8a 100644
- --- a/tests/wintartests/wintartest_comparewinvsgnu001.bash
- +++ b/tests/wintartests/wintartest_comparewinvsgnu001.bash
- @@ -1,5 +1,29 @@
- #!/bin/bash
- +#
- +# MIT License
- +#
- +# Copyright (c) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
- +#
- +# Permission is hereby granted, free of charge, to any person obtaining a copy
- +# of this software and associated documentation files (the "Software"), to deal
- +# in the Software without restriction, including without limitation the rights
- +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- +# copies of the Software, and to permit persons to whom the Software is
- +# furnished to do so, subject to the following conditions:
- +#
- +# The above copyright notice and this permission notice shall be included in all
- +# copies or substantial portions of the Software.
- +#
- +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- +# SOFTWARE.
- +#
- +
- #
- # wintartest_comparewinvsgnu001.bash - filesystem test
- # which compares files unpacked by /cygdrive/c/Windows/system32/tar
- diff --git a/tests/wintartests/wintartest_seq001.bash b/tests/wintartests/wintartest_seq001.bash
- index ee9652b..5736730 100644
- --- a/tests/wintartests/wintartest_seq001.bash
- +++ b/tests/wintartests/wintartest_seq001.bash
- @@ -1,5 +1,29 @@
- #!/bin/bash
- +#
- +# MIT License
- +#
- +# Copyright (c) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
- +#
- +# Permission is hereby granted, free of charge, to any person obtaining a copy
- +# of this software and associated documentation files (the "Software"), to deal
- +# in the Software without restriction, including without limitation the rights
- +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- +# copies of the Software, and to permit persons to whom the Software is
- +# furnished to do so, subject to the following conditions:
- +#
- +# The above copyright notice and this permission notice shall be included in all
- +# copies or substantial portions of the Software.
- +#
- +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- +# SOFTWARE.
- +#
- +
- #
- # wintartest_seq001.bash - filesystem test
- # which generates files with /usr/bin/seq, packs them with
- --
- 2.45.1
msnfs41client: Patches for sys |nfs41_Write()| should not touch EOF pos, more sparse file test coverage+misc, 2025-04-30
Posted by Anonymous on Wed 30th Apr 2025 14:18
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.