generic: check overwriting rename

This tests whether the file or directory overwritten by rename is properly
removed (nlink is zero).

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Miklos Szeredi
2014-10-14 17:40:34 +11:00
committed by Dave Chinner
parent 448efe1309
commit de161cbaac
6 changed files with 117 additions and 1 deletions
+1
View File
@@ -108,6 +108,7 @@
/src/aio-dio-regress/aiodio_sparse2
/src/cloner
/src/renameat2
/src/t_rename_overwrite
# dmapi/ binaries
/dmapi/src/common/cmd/read_invis
+1 -1
View File
@@ -11,7 +11,7 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \
devzero feature alloc fault fstest t_access_root \
godown resvtest writemod makeextents itrash rename \
multi_open_unlink dmiperf unwritten_sync genhashnames t_holes \
t_mmap_writev t_truncate_cmtime dirhash_collide
t_mmap_writev t_truncate_cmtime dirhash_collide t_rename_overwrite
LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \
preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \
+39
View File
@@ -0,0 +1,39 @@
#include <stdio.h>
#include <fcntl.h>
#include <err.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
const char *path1;
const char *path2;
struct stat stbuf;
int res;
int fd;
if (argc != 3) {
fprintf(stderr, "usage: %s path1 path2\n", argv[0]);
return 1;
}
path1 = argv[1];
path2 = argv[2];
fd = open(path2, O_RDONLY);
if (fd == -1)
err(1, "open(\"%s\")", path2);
res = rename(path1, path2);
if (res == -1)
err(1, "rename(\"%s\", \"%s\")", path1, path2);
res = fstat(fd, &stbuf);
if (res == -1)
err(1, "fstat(%i)", fd);
if (stbuf.st_nlink != 0) {
fprintf(stderr, "nlink is %lu, should be 0\n", stbuf.st_nlink);
return 1;
}
return 0;
}
+72
View File
@@ -0,0 +1,72 @@
#! /bin/bash
# FS QA Test No. generic/035
#
# Check overwriting rename system call
#
#-----------------------------------------------------------------------
# Copyright (c) 2014 Miklos Szeredi. All Rights Reserved.
#
# 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.
#
# This program is distributed in the hope that it would 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 the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#-----------------------------------------------------------------------
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
_supported_fs generic
_supported_os Linux
_require_test
# real QA test starts here
rename_dir=$TEST_DIR/$$
mkdir -p $rename_dir
echo "overwriting regular file:"
file1=$rename_dir/file1
file2=$rename_dir/file2
touch $file1
touch $file2
src/t_rename_overwrite $file1 $file2
rm $file2
echo "overwriting directory:"
dir1=$rename_dir/dir1
dir2=$rename_dir/dir2
mkdir $dir1
mkdir $dir2
src/t_rename_overwrite $dir1 $dir2
rmdir $dir2
rmdir $rename_dir
# success, all done
status=0
exit
+3
View File
@@ -0,0 +1,3 @@
QA output created by 035
overwriting regular file:
overwriting directory:
+1
View File
@@ -37,6 +37,7 @@
032 auto quick rw
033 auto quick rw
034 auto quick metadata log
035 auto quick
053 acl repair auto quick
062 attr udf auto quick
068 other auto freeze dangerous stress