[LTP] [PATCH v4] test.sh: make the loop device size can be increased

Cyril Hrubis chrubis@suse.cz
Thu Sep 22 14:43:25 CEST 2016


Hi!
> diff --git a/doc/test-writing-guidelines.txt b/doc/test-writing-guidelines.txt
> index c7d301f..44dd444 100644
> --- a/doc/test-writing-guidelines.txt
> +++ b/doc/test-writing-guidelines.txt
> @@ -1318,12 +1318,16 @@ Following functions similar to the LTP C interface are available.
>  * tst_rmdir()
>  * tst_fs_has_free()
>  * tst_mkfs()
> -* tst_acquire_device()
>  * tst_release_device()
>  
> -There is one more function called 'tst_check_cmds()' that gets unspecified
> -number of parameters and asserts that each parameter is a name of an
> -executable in '$PATH' and exits the test with 'TCONF' on first missing.
> +One more function called 'tst_check_cmds()' that gets unspecified number
> +of parameters and asserts that each parameter is a name of an executable
> +in '$PATH' and exits the test with 'TCONF' on first missing.
> +
> +Another one is 'tst_acquire_device()' that looks for LTP_DEV env variable
> +first (which may be passed by the test driver or by a user) and returns while
> +it's value greater than 150MB. It also does clear first sectors of $LTP_DEV
> +and makes the block device size can be increased according to real need.



>  tst_sleep
>  +++++++++
> diff --git a/include/old/old_device.h b/include/old/old_device.h
> index 4dae05e..94870c0 100644
> --- a/include/old/old_device.h
> +++ b/include/old/old_device.h
> @@ -36,13 +36,13 @@ const char *tst_dev_fs_type(void);
>   * Looks for LTP_DEV env variable first (which may be passed by the test
>   * driver or by a user) and returns just it's value if found.
>   *
> - * Otherwise creates a temp file and loop device.
> + * Otherwise creates a temp file and loop device according to real need.
>   *
>   * Note that you have to call tst_tmpdir() beforehand.
>   *
>   * Returns path to the device or NULL if it cannot be created.
>   */
> -const char *tst_acquire_device(void (cleanup_fn)(void));
> +const char *tst_acquire_device(void (cleanup_fn)(void), const int size);

This is the old API, that one should not be changed at all.

We should rather add unsigned int device_min_size to the tst_test structure
and make use of that in case that it's > 0.

>  /*
>   * @dev: device path returned by the tst_acquire_device()
> diff --git a/lib/tests/tst_device.c b/lib/tests/tst_device.c
> index c010475..e22eb9d 100644
> --- a/lib/tests/tst_device.c
> +++ b/lib/tests/tst_device.c
> @@ -40,7 +40,7 @@ int main(void)
>  {
>  	tst_tmpdir();
>  
> -	dev = tst_acquire_device(cleanup);
> +	dev = tst_acquire_device(cleanup, -1);
>  	if (!dev)
>  		tst_brkm(TCONF, cleanup, "Failed to acquire test device");
>  
> diff --git a/lib/tst_device.c b/lib/tst_device.c
> index 30b1be2..5226d0f 100644
> --- a/lib/tst_device.c
> +++ b/lib/tst_device.c
> @@ -182,10 +182,15 @@ static void detach_device(const char *dev)
>  		"ioctl(%s, LOOP_CLR_FD, 0) no ENXIO for too long", dev);
>  }
>  
> -const char *tst_acquire_device(void (cleanup_fn)(void))
> +const char *tst_acquire_device(void (cleanup_fn)(void), const int size)
>  {
> +	int fd;
>  	char *dev;
>  	struct stat st;
> +	unsigned long acq_dev_size;
> +	unsigned long ltp_dev_size;
> +
> +	acq_dev_size = size > 150 ? size : 150;
>  
>  	if (device_acquired)
>  		tst_brkm(TBROK, cleanup_fn, "Device allready acquired");
> @@ -204,18 +209,28 @@ const char *tst_acquire_device(void (cleanup_fn)(void))
>  
>  		if (!S_ISBLK(st.st_mode)) {
>  			tst_brkm(TBROK, cleanup_fn,
> -			         "%s is not a block device", dev);
> +					"%s is not a block device", dev);
                                 ^
				 Useless whitespace change.

>  		}
>  
> -		if (tst_fill_file(dev, 0, 1024, 512)) {
> -			tst_brkm(TBROK | TERRNO, cleanup_fn,
> -				 "Failed to clear the first 512k of %s", dev);
> +		fd = SAFE_OPEN(cleanup_fn, dev, O_RDONLY);
> +		SAFE_IOCTL(cleanup_fn, fd, BLKGETSIZE64, &ltp_dev_size);
> +		SAFE_CLOSE(cleanup_fn, fd);
> +		ltp_dev_size = ltp_dev_size/1024/1024;
> +
> +		if (acq_dev_size <= ltp_dev_size) {
> +			if (tst_fill_file(dev, 0, 1024, 512)) {
> +				tst_brkm(TBROK | TERRNO, cleanup_fn,
> +					"Failed to clear the first 512k of %s", dev);
> +			}
> +
> +			return dev;
>  		}
>  
> -		return dev;
> +		tst_resm(TINFO, "Skipping $LTP_DEV size %luMB, requested size %luMB",
> +				ltp_dev_size, acq_dev_size);
>  	}
>  
> -	if (tst_fill_file(DEV_FILE, 0, 1024, 153600)) {
> +	if (tst_fill_file(DEV_FILE, 0, 1024, 1024 * acq_dev_size)) {
>  		tst_brkm(TBROK | TERRNO, cleanup_fn,
>  		         "Failed to create " DEV_FILE);

This function has to be renamed to tst_acquire_device_() and the
tst_acquire_device() from the old API header should call this function
with zero as the size argument.

> diff --git a/lib/tst_test.c b/lib/tst_test.c
> index 12ca051..8b37d75 100644
> --- a/lib/tst_test.c
> +++ b/lib/tst_test.c
> @@ -596,7 +596,7 @@ static void do_setup(int argc, char *argv[])
>  	}
>  
>  	if (tst_test->needs_device) {
> -		tdev.dev = tst_acquire_device(NULL);
> +		tdev.dev = tst_acquire_device(NULL, -1);
>  		tdev.fs_type = tst_dev_fs_type();

Here we should simply pass tst_test->device_min_size.

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list