[LTP] [PATCH v3 05/16] lib/tst_fs: Add tst_fill_fs()

Sandeep Patil sspatil@google.com
Thu Nov 9 19:50:24 CET 2017


On Wed, Oct 11, 2017 at 04:41:19PM +0200, Cyril Hrubis wrote:
> Adds a simple helper to fill a filesystem.
> 
> All the funciton does is to create and write to files in a given

s/funciton/function

> directory until write() fails with ENOSPC.
> 
> This is intended to be used in various filesystem related tests such as
> fallocate and stress tests.

Couple of other use cases
 - To fill a filesystem would be to create nested directories for EMLINK
   testing in order to test file system limit(s) (e.g. syscalls/mkdir)
 - Filling a filesystem with empty files (e.g syscalls/rename etc )

 That said, the function can be expanded to do this at a later time as well
 based on the function parameters.


> 
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> ---
>  include/tst_fs.h  |  5 +++++
>  lib/tst_fill_fs.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 68 insertions(+)
>  create mode 100644 lib/tst_fill_fs.c
> 
> diff --git a/include/tst_fs.h b/include/tst_fs.h
> index 1f6d2bab5..0ad535c2b 100644
> --- a/include/tst_fs.h
> +++ b/include/tst_fs.h
> @@ -151,6 +151,11 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);
>   */
>  const char **tst_get_supported_fs_types(void);
>  
> +/*
> + * Creates and writes to files on given path until write fails with ENOSPC
> + */
> +void tst_fill_fs(const char *path, int verbose);
> +
>  #ifdef TST_TEST_H__
>  static inline long tst_fs_type(const char *path)
>  {
> diff --git a/lib/tst_fill_fs.c b/lib/tst_fill_fs.c
> new file mode 100644
> index 000000000..6b2bbbcd7
> --- /dev/null
> +++ b/lib/tst_fill_fs.c
> @@ -0,0 +1,63 @@
> +/*
> + * Copyright (c) 2017 Cyril Hrubis <chrubis@suse.cz>
> + *
> + * 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 <errno.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +#define TST_NO_DEFAULT_MAIN
> +#include "tst_test.h"
> +#include "tst_fs.h"
> +
> +void tst_fill_fs(const char *path, int verbose)
> +{
> +	int i = 0;
> +	char file[PATH_MAX];
> +	char buf[4096];
> +	size_t len;
> +	ssize_t ret;
> +	int fd;
> +
> +	for (;;) {
> +		len = random() % (1024 * 102400);
> +
> +		snprintf(file, sizeof(file), "%s/file%i", path, i++);
> +
> +		if (verbose)
> +			tst_res(TINFO, "Creating file %s size %zu", file, len);
> +
> +		fd = SAFE_OPEN(file, O_WRONLY | O_CREAT, 0700);
> +
> +		while (len) {
> +			ret = write(fd, buf, MIN(len, sizeof(buf)));
> +
> +			if (ret < 0) {
> +				SAFE_CLOSE(fd);
> +
> +				if (errno != ENOSPC)
> +					tst_brk(TBROK | TERRNO, "write()");
> +
> +				tst_res(TINFO | TERRNO, "write()");
> +				return;
> +			}
> +
> +			len -= ret;
> +		}
> +
> +		SAFE_CLOSE(fd);
> +	}
> +}

Reviewed-by: Sandeep Patil <sspatil@google.com>

> -- 
> 2.13.5
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp


More information about the ltp mailing list