public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH v5] lib: make the loop device size can be increased
@ 2016-09-26 10:12 Li Wang
  2016-09-26 13:07 ` Cyril Hrubis
  0 siblings, 1 reply; 3+ messages in thread
From: Li Wang @ 2016-09-26 10:12 UTC (permalink / raw)
  To: ltp

For the purpose of satisfying specific requirements, here rename function
tst_acqurire_device() to tst_acqurie_device_(), then add parameter '@size'
to tst_acquire_device_() to make the test device can be increased according
to real need.

This change gives a flexibility to ltp test device, you can customize its
size by passing 'tst_test->device_min_size' to your cases. But it's limited
that at least 150MB for the device generation.

Also, add tst_device.c tests, updating test-writing-guidelines.txt documents.

Signed-off-by: Li Wang <liwang@redhat.com>
---
 doc/test-writing-guidelines.txt | 12 ++++++----
 include/old/old_device.h        |  2 ++
 include/tst_test.h              |  2 ++
 lib/newlib_tests/tst_device.c   | 49 +++++++++++++++++++++++++++++++++++++++++
 lib/tst_device.c                | 30 ++++++++++++++++++++-----
 lib/tst_test.c                  |  5 ++++-
 testcases/lib/test.sh           |  8 +++++--
 7 files changed, 96 insertions(+), 12 deletions(-)
 create mode 100644 lib/newlib_tests/tst_device.c

diff --git a/doc/test-writing-guidelines.txt b/doc/test-writing-guidelines.txt
index f927fc6..9c412be 100644
--- a/doc/test-writing-guidelines.txt
+++ b/doc/test-writing-guidelines.txt
@@ -1323,12 +1323,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..d028e77 100644
--- a/include/old/old_device.h
+++ b/include/old/old_device.h
@@ -44,6 +44,8 @@ const char *tst_dev_fs_type(void);
  */
 const char *tst_acquire_device(void (cleanup_fn)(void));
 
+const char *tst_acquire_device_(void (cleanup_fn)(void), unsigned int size);
+
 /*
  * @dev: device path returned by the tst_acquire_device()
  */
diff --git a/include/tst_test.h b/include/tst_test.h
index 4c30134..3f7123e 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -106,6 +106,8 @@ struct tst_test {
 	int needs_device:1;
 	int needs_checkpoints:1;
 
+	unsigned int device_min_size;
+
 	/* override default timeout per test run */
 	unsigned int timeout;
 
diff --git a/lib/newlib_tests/tst_device.c b/lib/newlib_tests/tst_device.c
new file mode 100644
index 0000000..d656904
--- /dev/null
+++ b/lib/newlib_tests/tst_device.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2016 Linux Test Project
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <sys/mount.h>
+
+#include "tst_test.h"
+
+static void do_test(void)
+{
+	int fd;
+	const char *dev;
+	unsigned int ltp_dev_size;
+
+	dev = tst_device->dev;
+	if (!dev)
+		tst_brk(TCONF, "Failed to acquire test device");
+
+	SAFE_MKFS(dev, "ext2", NULL, NULL);
+
+	fd = SAFE_OPEN(dev, O_RDONLY);
+	SAFE_IOCTL(fd, BLKGETSIZE64, &ltp_dev_size);
+	SAFE_CLOSE(fd);
+
+	if (ltp_dev_size/1024/1024 == 160)
+		tst_res(TPASS, "PASSED LTP Device Test");
+}
+
+static struct tst_test test = {
+	.tid = "tst_device",
+	.needs_tmpdir = 1,
+	.needs_device = 1,
+	.device_min_size = 160,
+	.test_all = do_test,
+};
diff --git a/lib/tst_device.c b/lib/tst_device.c
index 30b1be2..7effac8 100644
--- a/lib/tst_device.c
+++ b/lib/tst_device.c
@@ -184,8 +184,18 @@ static void detach_device(const char *dev)
 
 const char *tst_acquire_device(void (cleanup_fn)(void))
 {
+	return tst_acquire_device_(cleanup_fn, 0);
+}
+
+const char *tst_acquire_device_(void (cleanup_fn)(void), unsigned int size)
+{
+	int fd;
 	char *dev;
 	struct stat st;
+	unsigned int acq_dev_size;
+	unsigned int ltp_dev_size;
+
+	acq_dev_size = size > 150 ? size : 150;
 
 	if (device_acquired)
 		tst_brkm(TBROK, cleanup_fn, "Device allready acquired");
@@ -207,15 +217,25 @@ const char *tst_acquire_device(void (cleanup_fn)(void))
 			         "%s is not a block device", dev);
 		}
 
-		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);
 
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 12ca051..1c2995e 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -596,7 +596,10 @@ static void do_setup(int argc, char *argv[])
 	}
 
 	if (tst_test->needs_device) {
-		tdev.dev = tst_acquire_device(NULL);
+		if(!tst_test->device_min_size)
+			tst_test->device_min_size = 150;
+
+		tdev.dev = tst_acquire_device_(NULL, tst_test->device_min_size);
 		tdev.fs_type = tst_dev_fs_type();
 
 		if (!tdev.dev)
diff --git a/testcases/lib/test.sh b/testcases/lib/test.sh
index a1fa2d9..76b7062 100644
--- a/testcases/lib/test.sh
+++ b/testcases/lib/test.sh
@@ -283,11 +283,15 @@ EXPECT_FAIL()
 
 tst_acquire_device()
 {
+	local acq_dev_size=${1:-150}
+
 	if [ -z ${TST_TMPDIR} ]; then
 		tst_brkm "Use 'tst_tmpdir' before 'tst_acquire_device'"
 	fi
 
-	if [ -n "${LTP_DEV}" ]; then
+	ltp_dev_size=$((`blockdev --getsize64 $LTP_DEV`/1024/1024))
+
+	if [ -n "${LTP_DEV}" ] && [ ${acq_dev_size} -le ${ltp_dev_size} ]; then
 		tst_resm TINFO "Using test device LTP_DEV='${LTP_DEV}'"
 		if [ ! -b ${LTP_DEV} ]; then
 			tst_brkm TBROK "${LTP_DEV} is not a block device"
@@ -300,7 +304,7 @@ tst_acquire_device()
 		return
 	fi
 
-	ROD_SILENT dd if=/dev/zero of=test_dev.img bs=1024 count=153600
+	ROD_SILENT dd if=/dev/zero of=test_dev.img bs=1024 count=$((1024*$acq_dev_size))
 
 	TST_DEVICE=$(losetup -f)
 	if [ $? -ne 0 ]; then
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [LTP] [PATCH v5] lib: make the loop device size can be increased
  2016-09-26 10:12 [LTP] [PATCH v5] lib: make the loop device size can be increased Li Wang
@ 2016-09-26 13:07 ` Cyril Hrubis
  2016-09-27  3:25   ` Li Wang
  0 siblings, 1 reply; 3+ messages in thread
From: Cyril Hrubis @ 2016-09-26 13:07 UTC (permalink / raw)
  To: ltp

Hi!
> diff --git a/lib/tst_device.c b/lib/tst_device.c
> index 30b1be2..7effac8 100644
> --- a/lib/tst_device.c
> +++ b/lib/tst_device.c
> @@ -184,8 +184,18 @@ static void detach_device(const char *dev)
>  
>  const char *tst_acquire_device(void (cleanup_fn)(void))
>  {
> +	return tst_acquire_device_(cleanup_fn, 0);
> +}

This can be implemented as static inline function inside the header
file.

> +const char *tst_acquire_device_(void (cleanup_fn)(void), unsigned int size)
> +{
> +	int fd;
>  	char *dev;
>  	struct stat st;
> +	unsigned int acq_dev_size;
> +	unsigned int ltp_dev_size;
> +
> +	acq_dev_size = size > 150 ? size : 150;
>  
>  	if (device_acquired)
>  		tst_brkm(TBROK, cleanup_fn, "Device allready acquired");
> @@ -207,15 +217,25 @@ const char *tst_acquire_device(void (cleanup_fn)(void))
>  			         "%s is not a block device", dev);
>  		}
>  
> -		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);
>  
> diff --git a/lib/tst_test.c b/lib/tst_test.c
> index 12ca051..1c2995e 100644
> --- a/lib/tst_test.c
> +++ b/lib/tst_test.c
> @@ -596,7 +596,10 @@ static void do_setup(int argc, char *argv[])
>  	}
>  
>  	if (tst_test->needs_device) {
> -		tdev.dev = tst_acquire_device(NULL);
> +		if(!tst_test->device_min_size)
> +			tst_test->device_min_size = 150;

The tst_acquire_device_ will make sure that the size is at least 150MB
anyway. So this part is useless, isn't it?

Otherwise it looks good.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [LTP] [PATCH v5] lib: make the loop device size can be increased
  2016-09-26 13:07 ` Cyril Hrubis
@ 2016-09-27  3:25   ` Li Wang
  0 siblings, 0 replies; 3+ messages in thread
From: Li Wang @ 2016-09-27  3:25 UTC (permalink / raw)
  To: ltp

On Mon, Sep 26, 2016 at 03:07:15PM +0200, Cyril Hrubis wrote:
> Hi!
> > diff --git a/lib/tst_device.c b/lib/tst_device.c
> > index 30b1be2..7effac8 100644
> > --- a/lib/tst_device.c
> > +++ b/lib/tst_device.c
> > @@ -184,8 +184,18 @@ static void detach_device(const char *dev)
> >  
> >  const char *tst_acquire_device(void (cleanup_fn)(void))
> >  {
> > +	return tst_acquire_device_(cleanup_fn, 0);
> > +}
> 
> This can be implemented as static inline function inside the header
> file.

Great! no problem.

> > -	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);
> >  
> > diff --git a/lib/tst_test.c b/lib/tst_test.c
> > index 12ca051..1c2995e 100644
> > --- a/lib/tst_test.c
> > +++ b/lib/tst_test.c
> > @@ -596,7 +596,10 @@ static void do_setup(int argc, char *argv[])
> >  	}
> >  
> >  	if (tst_test->needs_device) {
> > -		tdev.dev = tst_acquire_device(NULL);
> > +		if(!tst_test->device_min_size)
> > +			tst_test->device_min_size = 150;
> 
> The tst_acquire_device_ will make sure that the size is at least 150MB
> anyway. So this part is useless, isn't it?

Yes, it's useless! From what I test on removing them, tst_device.c also works fine.

> 
> Otherwise it looks good.

Thanks for reviewing. Patch v6 is coming...


Li Wang

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-09-27  3:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-26 10:12 [LTP] [PATCH v5] lib: make the loop device size can be increased Li Wang
2016-09-26 13:07 ` Cyril Hrubis
2016-09-27  3:25   ` Li Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox