From: Eryu Guan <guaneryu@gmail.com>
To: Sun Yong <sunyong0511@gmail.com>
Cc: fstests@vger.kernel.org, yosun@suse.com
Subject: Re: [PATCH v2] fstests: transport two ext4 tests from LTP
Date: Sun, 10 Nov 2019 21:17:12 +0800 [thread overview]
Message-ID: <20191110131710.GD8664@desktop> (raw)
In-Reply-To: <CAAPJbvqksutxzznPO1T5Z_pQA-=SuKHLuzp_TOyJu7s3W2tL=Q@mail.gmail.com>
On Mon, Nov 04, 2019 at 03:30:55PM +0800, Sun Yong wrote:
> Recently LTP upstream removed some ext4 tests[1]. And two of them is
> still valid to keep. So I transport those two tests here.
>
> ext4-nsec-timestamps, which is used to test nanosec timestamps of
> ext4, rewrite into ext4/043 and 044.
> ext4-subdir-limit, which is used to test subdirectory limit of ext4,
> rewrite into ext4/045.
>
> [1] https://marc.info/?l=linux-fsdevel&m=157190623919681&w=2
>
> Signed-off-by: Sun Yong <yosun@suse.com>
> ---
> v2: Correct copyright information
> ---
> diff --git a/src/Makefile b/src/Makefile
> index ce6d8610..387293d1 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -16,7 +16,8 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \
> holetest t_truncate_self t_mmap_dio af_unix t_mmap_stale_pmd \
> t_mmap_cow_race t_mmap_fallocate fsync-err t_mmap_write_ro \
> t_ext4_dax_journal_corruption t_ext4_dax_inline_corruption \
> - t_ofd_locks t_locks_execve t_mmap_collision mmap-write-concurrent
> + t_ofd_locks t_locks_execve t_mmap_collision mmap-write-concurrent \
> + t_ext4_file_time t_create_short_dirs t_create_long_dirs
>
> LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \
> preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \
> diff --git a/src/t_create_long_dirs.c b/src/t_create_long_dirs.c
> new file mode 100644
> index 00000000..76a886aa
> --- /dev/null
> +++ b/src/t_create_long_dirs.c
> @@ -0,0 +1,155 @@
> +/******************************************************************************/
> +/*
> */
> +/* Copyright (c) 2009 FUJITSU LIMITED
> */
> +/*
> */
Seems your patch got white-space damaged somehow, would you please check
and re-send?
Thanks,
Eryu
> +/* 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 */
> +/*
> */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>
> */
> +/*
> */
> +/******************************************************************************/
> +
> +#define _POSIX_C_SOURCE 200809L
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <time.h>
> +#include <fcntl.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include "config.h"
> +
> +#define NAME_LEN 255
> +#define NCHARS 62
> +#define MAX_LEN1 62
> +#define MAX_LEN2 (62 * 62)
> +#define MAX_LEN3 (62 * 62 * 62)
> +
> +/* valid characters for the directory name */
> +char chars[NCHARS + 1] =
> + "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
> +
> +/* to store the generated directory name */
> +char name[NAME_LEN + 1];
> +int names;
> +int parent_fd;
> +
> +/*
> + * init_name - initialize the directory name
> + *
> + * Generate a randomized directory name, and then we generate more
> + * directory names based on it.
> + */
> +void init_name(void)
> +{
> + int i;
> +
> + srand(time(NULL));
> +
> + for (i = 0; i < NAME_LEN; i++)
> + name[i] = chars[rand() % 62];
> +}
> +
> +void create_dir(void)
> +{
> + if (mkdirat(parent_fd, name, S_IRWXU)) {
> + perror("mkdir");
> + exit(1);
> + }
> +}
> +
> +/*
> + * create_dirs - create @names directory names
> + * @n: how many names to be created
> + *
> + * if n <= 62, we need to modify 1 char of the name
> + * if n <= 62*62, we need to modify 2 chars
> + * if n <= 62*62*62, we need to modify 3 chars
> + */
> +void create_dirs(int n)
> +{
> + int i, j, k;
> + int depth;
> +
> + if (n <= MAX_LEN1)
> + depth = 1;
> + else if (n <= MAX_LEN2)
> + depth = 2;
> + else
> + depth = 3;
> +
> + for (i = 0; i < NCHARS; i++) {
> + name[0] = chars[i];
> + if (depth == 1) {
> + create_dir();
> + if (--n == 0)
> + return;
> + continue;
> + }
> +
> + for (j = 0; j < NCHARS; j++) {
> + name[1] = chars[j];
> + if (depth == 2) {
> + create_dir();
> + if (--n == 0)
> + return;
> + continue;
> + }
> +
> + for (k = 0; k < NCHARS; k++) {
> + name[2] = chars[k];
> + create_dir();
> + if (--n == 0)
> + return;
> + }
> + }
> + }
> +}
> +
> +void usage()
> +{
> + fprintf(stderr, "Usage: create_long_dirs nr_dirs parent_dir\n");
> +}
> +
> +/*
> + * Create long-name directories
> + * @argv[1]: directory number
> + * @argv[2]: parent directory
> + */
> +int main(int argc, char *argv[])
> +{
> + if (argc != 3) {
> + usage();
> + return 1;
> + }
> +
> + names = atoi(argv[1]);
> + if (names > MAX_LEN3 || names <= 0) {
> + usage();
> + return 1;
> + }
> +
> + parent_fd = open(argv[2], O_RDONLY);
> + if (parent_fd == -1) {
> + perror("open parent dir failed");
> + return 1;
> + }
> +
> + init_name();
> +
> + create_dirs(names);
> +
> + return 0;
> +}
> diff --git a/src/t_create_short_dirs.c b/src/t_create_short_dirs.c
> new file mode 100644
> index 00000000..c5733b9d
> --- /dev/null
> +++ b/src/t_create_short_dirs.c
> @@ -0,0 +1,158 @@
> +/******************************************************************************/
> +/*
> */
> +/* Copyright (c) 2009 FUJITSU LIMITED
> */
> +/*
> */
> +/* 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 */
> +/*
> */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>
> */
> +/*
> */
> +/******************************************************************************/
> +
> +#define _POSIX_C_SOURCE 200809L
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <errno.h>
> +#include <fcntl.h>
> +#include <sys/stat.h>
> +#include <sys/types.h>
> +#include "config.h"
> +
> +/* valid characters for a directory name */
> +char chars[] =
> "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
> +
> +/* to store the generated directory name */
> +char name[10];
> +int names;
> +int parent_fd;
> +
> +/* NCHARS = 10 + 26 + 26 = 62 */
> +#define NCHARS 62
> +#define MAX_LEN1 62
> +#define MAX_LEN2 (62 * 62)
> +#define MAX_LEN3 (62 * 62 * 62)
> +#define MAX_NAMES (MAX_LEN1 + MAX_LEN2 + MAX_LEN3)
> +
> +void create_dir(void)
> +{
> + if (mkdirat(parent_fd, name, S_IRWXU)) {
> + perror("mkdir");
> + exit(1);
> + }
> +}
> +
> +/*
> + * create_1 - create length-1 directory names
> + * @n: how name names to be created
> + */
> +void create_1(int n)
> +{
> + int i;
> +
> + name[1] = '\0';
> + for (i = 0; i < NCHARS; i++) {
> + name[0] = chars[i];
> + create_dir();
> + if (--n == 0)
> + return;
> + }
> +}
> +
> +/*
> + * create_2 - generate length-2 directory names
> + * @n: how many names to be created
> + */
> +void create_2(int n)
> +{
> + int i, j;
> +
> + name[2] = '\0';
> + for (i = 0; i < NCHARS; i++) {
> + name[0] = chars[i];
> + for (j = 0; j < NCHARS; j++) {
> + name[1] = chars[j];
> + create_dir();
> + if (--n == 0)
> + return;
> + }
> + }
> +}
> +
> +/*
> + * create_3 - generate length-3 directory names
> + * @n: how many names to be created
> + */
> +void create_3(int n)
> +{
> + int i, j, k;
> +
> + name[3] = '\0';
> + for (i = 0; i < NCHARS; i++) {
> + name[0] = chars[i];
> + for (j = 0; j < NCHARS; j++) {
> + name[1] = chars[j];
> + for (k = 0; k < NCHARS; k++) {
> + name[2] = chars[k];
> + create_dir();
> + if (--n == 0)
> + return;
> + }
> + }
> + }
> +}
> +
> +void usage()
> +{
> + fprintf(stderr, "Usage: create_short_dirs nr_dirs parent_dir\n");
> +}
> +
> +/*
> + * Create short-name directoriess
> + * @argv[1]: director number
> + * @argv[2]: the parent directory
> + */
> +int main(int argc, char *argv[])
> +{
> + if (argc != 3) {
> + usage();
> + return 1;
> + }
> +
> + names = atoi(argv[1]);
> + if (names > MAX_NAMES || names <= 0) {
> + usage();
> + return 1;
> + }
> +
> + parent_fd = open(argv[2], O_RDONLY);
> + if (parent_fd == -1) {
> + perror("open parent dir");
> + return 1;
> + }
> +
> + create_1(names);
> + if (names <= MAX_LEN1)
> + return 0;
> +
> + names -= MAX_LEN1;
> + create_2(names);
> + if (names <= MAX_LEN2)
> + return 0;
> +
> + names -= MAX_LEN2;
> + create_3(names);
> +
> + return 0;
> +}
> diff --git a/src/t_ext4_file_time.c b/src/t_ext4_file_time.c
> new file mode 100644
> index 00000000..a10adb3d
> --- /dev/null
> +++ b/src/t_ext4_file_time.c
> @@ -0,0 +1,69 @@
> +/******************************************************************************/
> +/*
> */
> +/* Copyright (c) 2009 FUJITSU LIMITED
> */
> +/*
> */
> +/* 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 */
> +/*
> */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>
> */
> +/*
> */
> +/******************************************************************************/
> +
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> +#include <stdio.h>
> +#include <string.h>
> +
> +/*
> + * Usage: file_time <filename> <atime|mtime|ctime> <sec|nsec>
> + */
> +int main(int argc, char *argv[])
> +{
> + time_t t;
> + struct stat st;
> +
> + if (argc != 4) {
> + fprintf(stderr, "Wrong argument num!\n");
> + return 1;
> + }
> +
> + if (stat(argv[1], &st) != 0) {
> + perror("stat failed");
> + return 1;
> + }
> +
> + if (strcmp(argv[3], "sec") == 0) {
> + if (strcmp(argv[2], "atime") == 0)
> + t = st.st_atime;
> + else if (strcmp(argv[2], "mtime") == 0)
> + t = st.st_mtime;
> + else
> + t = st.st_ctime;
> + } else if (strcmp(argv[3], "nsec") == 0) {
> + if (strcmp(argv[2], "atime") == 0)
> + t = st.st_atim.tv_nsec;
> + else if (strcmp(argv[2], "mtime") == 0)
> + t = st.st_mtim.tv_nsec;
> + else
> + t = st.st_ctim.tv_nsec;
> + } else {
> + fprintf(stderr, "Wrong argument: %s\n", argv[3]);
> + return 1;
> + }
> +
> + printf("%lu\n", t);
> +
> + return 0;
> +}
> diff --git a/tests/ext4/043 b/tests/ext4/043
> new file mode 100755
> index 00000000..b6e5df9f
> --- /dev/null
> +++ b/tests/ext4/043
> @@ -0,0 +1,64 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2019 SUSE Linux Products GmbH. All Rights Reserved.
> +#
> +# FS QA Test No. 043
> +#
> +# Transfer from ltp/testcases/kernel/fs/ext4-new-features/ext4_nsec_timestamps
> +# Test file timestamps is second with 128 inode size
> +#
> +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.*
> + _scratch_cleanup_files
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs ext3 ext4
> +_supported_os Linux
> +
> +_require_scratch
> +_require_test_program "t_ext4_file_time"
> +_require_command "$TUNE2FS_PROG" tune2fs
> +
> +echo "Silence is golden"
> +
> +echo "Start test timestamps with 128 inode size one device
> $SCRATCH_DEV" >$seqres.full
> +_scratch_mkfs_ext4 -I 128 >> $seqres.full 2>&1
> +tune2fs -O extents $SCRATCH_DEV >>$seqres.full 2>&1
> +_scratch_mount
> +
> +touch "${SCRATCH_MNT}/tmp_file"
> +
> +atime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file atime nsec`
> +mtime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file mtime nsec`
> +ctime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file ctime nsec`
> +
> +if [ $atime -ne 0 -o $mtime -ne 0 -o $ctime -ne 0 ]; then
> + echo "Timestamp is not second(atime: $atime, mtime: $mtime,
> ctime: $ctime)" >> $seqres.full
> + _scratch_unmount >> $seqres.full 2>&1
> + exit
> +fi
> +echo "Ext4 nanosecond timestamps test with 128 inode size pass" >> $seqres.full
> +_scratch_unmount >> $seqres.full 2>&1
> +
> +# no BUG_ON, all done
> +status=0
> +exit
> diff --git a/tests/ext4/043.out b/tests/ext4/043.out
> new file mode 100644
> index 00000000..f90f0a57
> --- /dev/null
> +++ b/tests/ext4/043.out
> @@ -0,0 +1,2 @@
> +QA output created by 043
> +Silence is golden
> diff --git a/tests/ext4/044 b/tests/ext4/044
> new file mode 100755
> index 00000000..3e899f5a
> --- /dev/null
> +++ b/tests/ext4/044
> @@ -0,0 +1,112 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2019 SUSE Linux Products GmbH. All Rights Reserved.
> +#
> +# FS QA Test No. 044
> +#
> +# Transfer from ltp/testcases/kernel/fs/ext4-new-features/ext4_nsec_timestamps
> +# Test file timestamps is nanosecond with 256 inode size
> +#
> +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.*
> + _scratch_cleanup_files
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs ext3 ext4
> +_supported_os Linux
> +_require_scratch
> +_require_test_program "t_ext4_file_time"
> +
> +echo "Silence is golden"
> +
> +echo "Test timestamps with 256 inode size one device $SCRATCH_DEV"
> >$seqres.full
> +_scratch_mkfs_ext4 -t ext3 -I 256 >> $seqres.full 2>&1
> +_scratch_mount
> +
> +# Create file
> +touch "${SCRATCH_MNT}/tmp_file"
> +sleep 1
> +
> +# Change atime, ctime and mtime of the file
> +touch "${SCRATCH_MNT}/tmp_file"
> +
> +cur_time=`date '+%s %N'`
> +sec=`echo $cur_time | awk {'print $1'}`
> +nsec=`echo $cur_time | awk {'print $2'}`
> +
> +sec_atime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file atime sec`
> +sec_mtime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file mtime sec`
> +sec_ctime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file ctime sec`
> +nsec_atime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file atime nsec`
> +nsec_mtime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file mtime nsec`
> +nsec_ctime=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file ctime nsec`
> +
> +# Test nanosecond
> +if [ $nsec_atime -eq 0 -a $nsec_mtime -eq 0 -a $nsec_ctime -eq 0 ]; then
> + echo "The timestamp is not nanosecond(nsec_atime: $nsec_atime, \
> + nsec_mtime: $nsec_mtime, nsec_ctime: $nsec_ctime)" >>
> $seqres.full
> + _scratch_unmount >> $seqres.full 2>&1
> + exit
> +fi
> +
> +diff1=$(( $sec_atime - $sec ))
> +diff2=$(( $sec_mtime - $sec ))
> +diff3=$(( $sec_ctime - $sec ))
> +
> +# Test difference between file time and current time
> +if [ $diff1 -gt 1 -o $diff2 -gt 1 -o $diff2 -gt 1 ]; then
> + echo "The timestamp is wrong, it must be earlier than the
> current time we got. \
> + (sec_atime: $sec_atime, sec_mtime: $sec_mtime,
> sec_ctime: $sec_ctime, \
> + cur_time[s]: $sec)" >> $seqres.full
> + _scratch_unmount >> $seqres.full 2>&1
> + exit
> +fi
> +_scratch_unmount >> $seqres.full 2>&1
> +
> +# Test mount to ext3 and then mount back to ext4
> +mount -t ext3 $SCRATCH_DEV $SCRATCH_MNT
> +if [ $? -ne 0 ]; then
> + echo "$SCRATCH_DEV fail in mounting to ext3" >> $seqres.full
> + _scratch_unmount >> $seqres.full 2>&1
> + exit
> +fi
> +_scratch_unmount >> $seqres.full 2>&1
> +_scratch_mount
> +
> +nsec_atime2=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file atime nsec`
> +nsec_mtime2=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file mtime nsec`
> +nsec_ctime2=`$here/src/t_ext4_file_time $SCRATCH_MNT/tmp_file ctime nsec`
> +
> +if [ $nsec_atime -ne $nsec_atime2 -o $nsec_ctime -ne $nsec_ctime2 -o \
> + $nsec_mtime -ne $nsec_mtime2 ]; then
> + echo "File nanosecond timestamp has changed \
> + unexpected. Before[atime mtime ctime]: $nsec_atime \
> + nsec_mtime $nsec_ctime, After[atime mtime ctime]: \
> + $nsec_atime2 $nsec_mtime2 $nsec_ctime2)" >>
> $seqres.full
> + _scratch_unmount >> $seqres.full 2>&1
> + exit
> +fi
> +_scratch_unmount >> $seqres.full 2>&1
> +
> +# no BUG_ON, all done
> +status=0
> +exit
> diff --git a/tests/ext4/044.out b/tests/ext4/044.out
> new file mode 100644
> index 00000000..12a61dc4
> --- /dev/null
> +++ b/tests/ext4/044.out
> @@ -0,0 +1,2 @@
> +QA output created by 044
> +Silence is golden
> diff --git a/tests/ext4/045 b/tests/ext4/045
> new file mode 100755
> index 00000000..c70baa97
> --- /dev/null
> +++ b/tests/ext4/045
> @@ -0,0 +1,148 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2019 SUSE Linux Products GmbH. All Rights Reserved.
> +#
> +# FS QA Test No. 045
> +#
> +# Transfer from
> ltp/testcases/kernel/fs/ext4-new-features/ext4_subdir_limit_test
> +#
> +# Test subdirectory limit of ext4.
> +# We create more than 32000 subdirectorys on the ext4 filesystem.
> +#
> +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
> +
> +SHORT_DIR=1
> +LONG_DIR=2
> +FAIL=1
> +PASS=0
> +prev_block_size=0
> +prev_result=$FAIL
> +
> +_cleanup()
> +{
> + cd /
> + rm -f $tmp.*
> + _scratch_cleanup_files
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs ext4
> +_supported_os Linux
> +
> +_require_scratch
> +_require_test_program "t_create_short_dirs"
> +_require_test_program "t_create_long_dirs"
> +_require_command "$TUNE2FS_PROG" tune2fs
> +_require_command "$E2FSCK_PROG" e2fsck
> +_require_dumpe2fs
> +
> +echo "Silence is golden"
> +
> +# Run a test case
> +# $1: Number of directories to create
> +# $2: create short dir or long dir
> +# $3: parent directory
> +# $4: filesystem block size
> +_workout()
> +{
> + local dir_name_len=
> + if [ $2 -eq $SHORT_DIR ]; then
> + dir_name_len="short name"
> + else
> + dir_name_len="long name"
> + fi
> +
> + echo "Num of dirs to create: $1, Dir name len: $dir_name_len, " \
> + "Parent dir: $3, Block size: $4" >> $seqres.full 2>&1
> +
> + # Only mkfs if block size has been changed, or previous case failed
> + if [ $prev_result -ne $PASS -o $4 -ne $prev_block_size ]; then
> + $MKFS_EXT4_PROG -F -b $4 -I 256 $SCRATCH_DEV >> $seqres.full 2>&1
> + prev_block_size=$4
> + tune2fs -O extents $SCRATCH_DEV >> $seqres.full 2>&1
> + fi
> + prev_result=$FAIL
> +
> + _scratch_mount
> +
> + # create directories
> + mkdir -p $3 2> /dev/null
> +
> + if [ $2 -eq $SHORT_DIR ]; then
> + $here/src/t_create_short_dirs $1 $3
> + else
> + $here/src/t_create_long_dirs $1 $3
> + fi
> +
> + if [ $? -ne 0 ]; then
> + nr_dirs=`ls $3 | wc -l`
> + echo "Failed to create directories - $nr_dirs"
> + _scratch_unmount
> + return
> + fi
> +
> + # delete directories
> + cd $3
> + ls | xargs rmdir
> + if [ $? -ne 0 ]; then
> + echo "Failed to remove directories in $3"
> + cd - > /dev/null
> + _scratch_unmount
> + return
> + fi
> + cd - > /dev/null
> + _scratch_unmount
> +
> + # check dir_nlink is set
> + dumpe2fs $SCRATCH_DEV 2> /dev/null | grep '^Filesystem features'
> | grep -q dir_nlink
> + if [ $? -ne 0 ]; then
> + echo "Feature dir_nlink is not set, please check $seqres.full
> for detail"
> + return
> + fi
> +
> + # run fsck to make sure the filesystem has no errors
> + $E2FSCK_PROG -fy $SCRATCH_DEV >> $seqres.full 2>&1
> + if [ $? -ne 0 ]; then
> + echo "fsck: the filesystem has errors, please check
> $seqres.full for detail"
> + return
> + fi
> +
> + prev_result=$PASS
> +}
> +
> +# main
> +DIR_LEN=( $SHORT_DIR $LONG_DIR )
> +PARENT_DIR=( "$SCRATCH_MNT" "$SCRATCH_MNT/sub" )
> +BLOCK_SIZE=( 1024 2048 4096 )
> +
> +for ((i = 0; i < 3; i++)); do
> + for ((j = 0; j < 2; j++)); do
> + for ((k = 0; k < 2; k++)); do
> + if [ ${DIR_LEN[$k]} -eq $LONG_DIR -a \
> + ${BLOCK_SIZE[$i]} -eq 1024 ]; then
> + continue
> + fi
> + _workout 65537 ${DIR_LEN[$k]} ${PARENT_DIR[$j]} ${BLOCK_SIZE[$i]}
> + done
> + done
> +done
> +
> +_scratch_unmount >> $seqres.full 2>&1
> +
> +# no BUG_ON, all done
> +status=0
> +exit
> diff --git a/tests/ext4/045.out b/tests/ext4/045.out
> new file mode 100644
> index 00000000..66276cfa
> --- /dev/null
> +++ b/tests/ext4/045.out
> @@ -0,0 +1,2 @@
> +QA output created by 045
> +Silence is golden
> diff --git a/tests/ext4/group b/tests/ext4/group
> index 9dfc0d35..8419cdea 100644
> --- a/tests/ext4/group
> +++ b/tests/ext4/group
> @@ -45,6 +45,9 @@
> 040 dangerous_fuzzers
> 041 dangerous_fuzzers
> 042 auto quick
> +043 auto quick
> +044 auto quick
> +045 auto
> 271 auto rw quick
> 301 aio auto ioctl rw stress defrag
> 302 aio auto ioctl rw stress defrag
next prev parent reply other threads:[~2019-11-10 13:17 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-04 7:30 [PATCH v2] fstests: transport two ext4 tests from LTP Sun Yong
2019-11-10 13:17 ` Eryu Guan [this message]
2019-11-26 16:06 ` Darrick J. Wong
2019-11-27 8:03 ` Sun Yong
2019-11-27 16:11 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191110131710.GD8664@desktop \
--to=guaneryu@gmail.com \
--cc=fstests@vger.kernel.org \
--cc=sunyong0511@gmail.com \
--cc=yosun@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).