diff options
| -rw-r--r-- | tests/fs-tests/integrity/integck.c | 118 | 
1 files changed, 63 insertions, 55 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index a35b7ae..5afc1e9 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -1189,54 +1189,76 @@ out_error:   */  static int file_write(struct file_info *file, int fd)  { -	off_t offset; -	size_t size; -	ssize_t actual; -	unsigned int seed; -	int ret, truncate = 0; +	int ret; -	/* -	 * Do not do 'mmap()' operations if: -	 * 1. we are in power cut testing mode, because an emulated power cut -	 *    failure may cause SIGBUS when we are writing to the 'mmap()'ed -	 *    area, and SIGBUS is not easy to ignore. -	 * 2. When the file-system is full, because again, writing to the -	 *    'mmap()'ed area may cause SIGBUS when the space allocation fails. -	 *    This is not enough to guarantee we never get SIGBUS, though. For -	 *    example, if we write a lot to a hole, this might require a lot of -	 *    additional space, and we may fail here. But I do not know why we -	 *    never observed this, probably this is just very unlikely. -	 */  	if (!args.power_cut_mode && fsinfo.can_mmap && !full && -	    file->link_count && random_no(100) == 1) -		return file_mmap_write(file); +	    file->link_count && random_no(100) == 1) { +		/* +		 * Do not do 'mmap()' operations if: +		 * 1. we are in power cut testing mode, because an emulated +		 *    power cut failure may cause SIGBUS when we are writing to +		 *    the 'mmap()'ed area, and SIGBUS is not easy to ignore. +		 * 2. When the file-system is full, because again, writing to the +		 *    'mmap()'ed area may cause SIGBUS when the space allocation +		 *    fails. This is not enough to guarantee we never get +		 *    SIGBUS, though. For example, if we write a lot to a hole, +		 *    this might require a lot of additional space, and we may +		 *    fail here. But I do not know why we never observed this, +		 *    probably this is just very unlikely. +		 */ +		ret = file_mmap_write(file); +	} else { +		int truncate = 0; +		off_t offset; +		size_t size; +		ssize_t actual; +		unsigned int seed; + +		get_offset_and_size(file, &offset, &size); +		seed = random_no(MAX_RANDOM_SEED); +		actual = file_write_data(file, fd, offset, size, seed); +		if (actual < 0) +			return -1; -	get_offset_and_size(file, &offset, &size); -	seed = random_no(MAX_RANDOM_SEED); -	actual = file_write_data(file, fd, offset, size, seed); -	if (actual < 0) -		return -1; +		if (actual != 0) +			file_write_info(file, fd, offset, actual, seed); -	if (offset + actual <= file->length && shrink) -		/* 1 time in 100, when shrinking truncate after the write */ -		if (random_no(100) == 0) -			truncate = 1; +		if (offset + actual <= file->length && shrink) { +			/* +			 * 1 time in 100, when shrinking truncate after the +			 * write. +			 */ +			if (random_no(100) == 0) +				truncate = 1; +		} -	if (actual != 0) -		file_write_info(file, fd, offset, actual, seed); +		if (truncate) { +			size_t new_length = offset + actual; -	/* Delete errored files */ -	if (!fsinfo.nospc_size_ok && file->no_space_error) -		return file_delete(file); +			ret = file_ftruncate(file, fd, new_length); +			if (ret == -1) +				return -1; +			if (!ret) +				file_truncate_info(file, fd, new_length); +		} -	if (truncate) { -		size_t new_length = offset + actual; +		/* Delete errored files */ +		if (!fsinfo.nospc_size_ok && file->no_space_error) +			return file_delete(file); +	} -		ret = file_ftruncate(file, fd, new_length); -		if (ret == -1) -			return -1; -		if (!ret) -			file_truncate_info(file, fd, new_length); +	/* Sync sometimes */ +	if (random_no(1000) >= 999) { +		if (random_no(100) >= 50) { +			ret = fsync(fd); +			if (ret) +				pcv("fsync failed for %s", file->links->name); +		} else { +			ret = fdatasync(fd); +			if (ret) +				pcv("fdatasync failed for %s", +				    file->links->name); +		}  	}  	return 0; @@ -2190,22 +2212,8 @@ static int operate_on_open_file(struct fd_info *fdi)  		file_close(fdi);  	else if (shrink && r < 121 && fdi->file->link_count)  		ret = file_delete(fdi->file); -	else { +	else  		ret = file_write(fdi->file, fdi->fd); -		if (!ret && r >= 999) { -			if (random_no(100) >= 50) { -				ret = fsync(fdi->fd); -				if (ret) -					pcv("fsync failed for %s", -					    fdi->file->links->name); -			} else { -				ret = fdatasync(fdi->fd); -				if (ret) -					pcv("fdatasync failed for %s", -					    fdi->file->links->name); -			} -		} -	}  	return ret;  }  | 
