diff options
Diffstat (limited to 'tests/fs-tests/integrity')
| -rw-r--r-- | tests/fs-tests/integrity/integck.c | 45 | 
1 files changed, 33 insertions, 12 deletions
| diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index 045d63d..0cb81b0 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -2683,7 +2683,10 @@ static void read_all(const char *dir_name)  	assert(args.power_cut_mode);  	dir = opendir(dir_name); -	CHECK(dir != NULL); +	if (!dir) { +		errmsg("cannot open %s", dir_name); +		CHECK(0); +	}  	CHECK(getcwd(buf, PATH_MAX) != NULL);  	CHECK(chdir(dir_name) == 0); @@ -2723,12 +2726,11 @@ static int integck(void)  	long rpt;  	CHECK(chdir(fsinfo.mount_point) == 0); +	assert(!top_dir);  	/* Create our top directory */  	if (chdir(fsinfo.test_dir) == 0) {  		CHECK(chdir("..") == 0); -		if (args.power_cut_mode) -			read_all(fsinfo.test_dir);  		ret = rm_minus_rf_dir(fsinfo.test_dir);  		if (ret)  			return -1; @@ -2740,6 +2742,14 @@ static int integck(void)  		return -1;  	} +	ret = sync_directory(fsinfo.test_dir); +	if (ret) +		return -1; + +	top_dir = zalloc(sizeof(struct dir_info)); +	top_dir->entry = zalloc(sizeof(struct dir_entry_info)); +	top_dir->entry->name = dup_string(fsinfo.test_dir); +  	ret = create_test_data();  	if (ret)  		return -1; @@ -3196,11 +3206,13 @@ static int recover_tested_fs(void)  static void free_test_data(void)  { -	close_open_files(); -	free_fs_info(top_dir); -	free(top_dir->entry->name); -	free(top_dir->entry); +	if (top_dir) { +		free_fs_info(top_dir); +		free(top_dir->entry->name); +		free(top_dir->entry);  		free(top_dir); +		top_dir = NULL; +	}  }  int main(int argc, char *argv[]) @@ -3250,11 +3262,8 @@ int main(int argc, char *argv[])  	/* Do the actual test */  	for (rpt = 0; ; rpt++) { -		top_dir = zalloc(sizeof(struct dir_info)); -		top_dir->entry = zalloc(sizeof(struct dir_entry_info)); -		top_dir->entry->name = dup_string(fsinfo.test_dir); -  		ret = integck(); +  		/*  		 * Iterate forever only in case of power-cut emulation testing.  		 */ @@ -3266,7 +3275,7 @@ int main(int argc, char *argv[])  		CHECK(ret);  		CHECK(errno == EROFS || errno == EIO); -		free_test_data(); +		close_open_files();  		do {  			ret = recover_tested_fs(); @@ -3280,6 +3289,17 @@ int main(int argc, char *argv[])  			 */  		} while (ret); +		CHECK(chdir(fsinfo.mount_point) == 0); + +		/* Make sure everything is readable after an emulated power cut */ +		if (top_dir) { +			/* Check the clean data */ +			check_tested_fs(); +			read_all(fsinfo.test_dir); +		} + +		free_test_data(); +  		/*  		 * The file-system became read-only and we are in power cut  		 * testing mode. Re-mount the file-system and re-start the @@ -3290,6 +3310,7 @@ int main(int argc, char *argv[])  	} +	close_open_files();  	free_test_data();  out_free: | 
