diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/fs-tests/integrity/integck.c | 70 | 
1 files changed, 64 insertions, 6 deletions
| diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index a225042..ebe4995 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -31,7 +31,10 @@  #include <dirent.h>  #include <getopt.h>  #include <assert.h> +#include <mntent.h>  #include <sys/mman.h> +#include <sys/vfs.h> +#include <sys/mount.h>  #include "tests.h"  #define PROGRAM_VERSION "1.1" @@ -48,6 +51,17 @@ static struct {  	.repeat_cnt = 1,  }; +/* + * The below data structure describes the tested file-system. + * + * max_name_len: maximum file name length + * fstype: file-system type (e.g., "ubifs") + */ +static struct { +	int max_name_len; +	const char *fstype; +} fsinfo; +  /* Structures to store data written to the test file system,     so that we can check whether the file system is correct. */ @@ -1383,7 +1397,7 @@ static char *make_name(struct dir_info *dir)  	do {  		found = 0;  		if (tests_random_no(5) == 1) { -			int i, n = tests_random_no(tests_max_fname_len) + 1; +			int i, n = tests_random_no(fsinfo.max_name_len) + 1;  			CHECK(n > 0 && n < 256);  			for (i = 0; i < n; i++) @@ -2000,6 +2014,43 @@ void integck(void)  	CHECK(rmdir(dir_name) != -1);  } +/* + * Fill 'fsinfo' with information about the tested file-system. + */ +static void get_tested_fs_info(void) +{ +	struct statfs fs_info; +	struct mntent *mntent; +	const char *mp; +        FILE *f; + +	CHECK(statfs(args.mount_point, &fs_info) == 0); + +	fsinfo.max_name_len = fs_info.f_namelen; + +	mp = "/proc/mounts"; +        f = fopen(mp, "rb"); +        if (!f) { +		mp = "/etc/mtab"; +                f = fopen(mp, "rb"); +	} +	CHECK(f != NULL); + +        while (1) { +		mntent = getmntent(f); +                if (!mntent) { +			errmsg("cannot find file-system info"); +			CHECK(0); +		} + +		if (!strcmp(mntent->mnt_dir, args.mount_point)) +			break; +        } +        fclose(f); + +	fsinfo.fstype = dup_string(mntent->mnt_type); +} +  static const char doc[] = PROGRAM_NAME " version " PROGRAM_VERSION  " - a stress test which checks the file-system integrity.\n"  "It creates a directory named \"integck_test_dir_pid\", where where pid is the\n" @@ -2023,10 +2074,13 @@ static const struct option long_options[] = {  };  /* - * Parse input command-line options. Returns zero on success and -1 on error. + * Parse and validate input command-line options. Returns zero on success and + * -1 on error.   */  static int parse_opts(int argc, char * const argv[])  { +	struct stat st; +  	while (1) {  		int key, error = 0; @@ -2065,6 +2119,11 @@ static int parse_opts(int argc, char * const argv[])  		return errmsg("more then one test file-system specified (use -h for help)");  	args.mount_point = argv[optind]; + +	if (chdir(args.mount_point) != 0 || lstat(args.mount_point, &st) != 0) +		return errmsg("invalid test file system mount directory: %s", +			      args.mount_point); +  	return 0;  } @@ -2076,12 +2135,11 @@ int main(int argc, char *argv[])  	if (ret)  		return EXIT_FAILURE; +	get_tested_fs_info(); +  	/* Temporary hack - will be fixed a bit later */  	tests_file_system_mount_dir = (void *)args.mount_point; -	tests_file_system_type = "ubifs"; - -	/* Change directory to the file system and check it is ok for testing */ -	tests_check_test_file_system(); +	tests_file_system_type = (void *)fsinfo.fstype;  	/*  	 * JFFS2 does not support shared writable mmap and it may report | 
