[LTP] [PATCH] syscalls: add syscall syncfs test
Sumit Garg
sumit.garg@linaro.org
Thu Feb 14 12:47:06 CET 2019
Hi Xiao,
Thanks for your review comments.
On Thu, 14 Feb 2019 at 17:01, Xiao Yang <yangx.jy@cn.fujitsu.com> wrote:
>
> Hi Sumit,
>
> On 2019/02/14 17:51, Sumit Garg wrote:
> > syncfs01 tests to sync filesystem having large dirty file pages to block
> > device. Also, it tests all supported filesystems on a test block device.
> >
> > Signed-off-by: Sumit Garg<sumit.garg@linaro.org>
> > ---
> >
> > Fixes: https://github.com/linux-test-project/ltp/issues/294
> >
> > runtest/syscalls | 2 +
> > testcases/kernel/syscalls/syncfs/.gitignore | 1 +
> > testcases/kernel/syscalls/syncfs/Makefile | 8 ++
> > testcases/kernel/syscalls/syncfs/syncfs01.c | 110 ++++++++++++++++++++++++++++
> > 4 files changed, 121 insertions(+)
> > create mode 100644 testcases/kernel/syscalls/syncfs/.gitignore
> > create mode 100644 testcases/kernel/syscalls/syncfs/Makefile
> > create mode 100644 testcases/kernel/syscalls/syncfs/syncfs01.c
> >
> > diff --git a/runtest/syscalls b/runtest/syscalls
> > index 668c87c..9442740 100644
> > --- a/runtest/syscalls
> > +++ b/runtest/syscalls
> > @@ -1346,6 +1346,8 @@ symlinkat01 symlinkat01
> > sync01 sync01
> > sync02 sync02
> >
> > +syncfs01 syncfs01
> > +
> > #testcases for sync_file_range
> > sync_file_range01 sync_file_range01
> >
> > diff --git a/testcases/kernel/syscalls/syncfs/.gitignore b/testcases/kernel/syscalls/syncfs/.gitignore
> > new file mode 100644
> > index 0000000..6066295
> > --- /dev/null
> > +++ b/testcases/kernel/syscalls/syncfs/.gitignore
> > @@ -0,0 +1 @@
> > +syncfs01
> > diff --git a/testcases/kernel/syscalls/syncfs/Makefile b/testcases/kernel/syscalls/syncfs/Makefile
> > new file mode 100644
> > index 0000000..3e6c2f4
> > --- /dev/null
> > +++ b/testcases/kernel/syscalls/syncfs/Makefile
> > @@ -0,0 +1,8 @@
> > +# Copyright (c) 2019 - Linaro Limited. All rights reserved.
> > +# SPDX-License-Identifier: GPL-2.0-or-later
> > +
> > +top_srcdir ?= ../../../..
> > +
> > +include $(top_srcdir)/include/mk/testcases.mk
> > +
> > +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> > diff --git a/testcases/kernel/syscalls/syncfs/syncfs01.c b/testcases/kernel/syscalls/syncfs/syncfs01.c
> > new file mode 100644
> > index 0000000..35a8ae8
> > --- /dev/null
> > +++ b/testcases/kernel/syscalls/syncfs/syncfs01.c
> > @@ -0,0 +1,110 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Copyright (c) 2019 Linaro Limited. All rights reserved.
> > + * Author: Sumit Garg<sumit.garg@linaro.org>
> > + */
> > +
> > +/*
> > + * Test syncfs
> > + *
> > + * It basically tests syncfs() to sync filesystem having large dirty file
> > + * pages to block device. Also, it tests all supported filesystems on a test
> > + * block device.
> > + */
> > +
> > +#define _GNU_SOURCE
> > +#include<stdlib.h>
> > +#include<stdio.h>
> > +#include<sys/types.h>
> > +#include<sys/wait.h>
>
> Unused <sys/wait.h> ?
>
Ok, will remove it.
> > +#include "tst_test.h"
> > +#include "lapi/fs.h"
> > +#include "lapi/stat.h"
> > +
> > +#define MNTPOINT "mnt_point"
> > +#define TST_FILE MNTPOINT"/test"
> > +#define TST_FILE_SIZE_MB 32
> > +#define SIZE_MB (1024*1024)
> > +#define MODE 0644
> > +
> > +static char dev_stat_path[1024];
> > +static char *buffer;
> > +static int fd;
> > +
> > +static void verify_syncfs(void)
> > +{
> > + char nwrite_sec_val[BUFSIZ];
> > + int counter;
> > + unsigned long prev_write_sec = 0, write_sec = 0;
> > +
> > + SAFE_FILE_SCANF(dev_stat_path, "%*s %*s %*s %*s %*s %*s %s",
> > + nwrite_sec_val);
> > +
> > + prev_write_sec = SAFE_STRTOUL(nwrite_sec_val, 0, ULONG_MAX);
> > +
> > + fd = SAFE_OPEN(TST_FILE, O_RDWR|O_CREAT, MODE);
> > +
> > + /* Filling the test file */
> > + for (counter = 0; counter< TST_FILE_SIZE_MB; counter++)
> > + SAFE_WRITE(1, fd, buffer, SIZE_MB);
> > +
> > + TEST(syncfs(fd));
> > + if (TST_RET != 0)
> > + tst_brk(TFAIL | TTERRNO, "syncfs(fd) failed");
> > +
> > + SAFE_FILE_SCANF(dev_stat_path, "%*s %*s %*s %*s %*s %*s %s",
> > + nwrite_sec_val);
> > +
> > + write_sec = SAFE_STRTOUL(nwrite_sec_val, 0, ULONG_MAX);
> > +
> > + if ((write_sec - prev_write_sec) * 512>=
> > + (TST_FILE_SIZE_MB * SIZE_MB))
> > + tst_res(TPASS, "Test filesystem synced to device");
> > + else
> > + tst_res(TFAIL, "Failed to sync test filesystem to device");
> > +
> > + SAFE_CLOSE(fd);
> > +}
> > +
> > +static void setup(void)
> > +{
> > + const char *dev;
> > + struct stat st;
> > +
> > + dev = tst_device->dev;
> > + if (!dev)
> > + tst_brk(TCONF, "Failed to acquire test device");
>
> Libary will do this check, so we can remove it.
> Please see the following code at tst_test.c:
> --------------------------------------------------------------------------
> if (tst_test->needs_device && !mntpoint_mounted) {
> tdev.dev = tst_acquire_device_(NULL, tst_test->dev_min_size);
>
> if (!tdev.dev)
> tst_brk(TCONF, "Failed to acquire device");
> --------------------------------------------------------------------------
>
Ok will remove this check.
> > +
> > + snprintf(dev_stat_path, sizeof(dev_stat_path), "/sys/block/%s/stat",
> > + strrchr(dev, '/') + 1);
>
> Use tst_device->dev directly.
>
Ok.
> > +
> > + if (stat(dev_stat_path,&st) != 0)
> > + tst_brk(TCONF, "Test device stat file: %s not found",
> > + dev_stat_path);
> > +
> > + buffer = SAFE_MALLOC(SIZE_MB);
> > +
> > + memset(buffer, 0, SIZE_MB);
> > +}
> > +
> > +static void cleanup(void)
> > +{
> > + if (buffer)
> > + free(buffer);
> > +
> > + if (fd> 0)
> > + SAFE_CLOSE(fd);
> > +}
> > +
> > +static struct tst_test test = {
> > + .needs_root = 1,
> > + .needs_device = 1,
> > + .format_device = 1,
> > + .mount_device = 1,
>
> It is enough to only set '.mount_device', because '.mount_device'
> implies '.needs_device' and '.format_device'
> Please see doc/test-writing-guidelines.txt:
> ------------------------------------------
> If '.mount_device' is set, the device is mounted at '.mntpoint' which is
> used
> to pass a directory name that will be created and used as mount destination.
> You can pass additional flags and data to the mount command via '.mnt_flags'
> and '.mnt_data' pointers. Note that '.mount_device' implies '.needs_device'
> and '.format_device' so there is no need to set the later two.
> ------------------------------------------
Yeah I missed this. Will remove .needs_device and .format_device flags.
> > + .all_filesystems = 1,
> > + .dev_min_size = TST_FILE_SIZE_MB,
> It seems that libary sets the minimal device size to 256M by default, so
> the smaller value will be replaced with 256M.
> Do we have to set the minimal device size to 32M?
>
Yes I saw minimal default size to be 256M. I kept 32M here just for
clarity of minimal requirement for this test case. BTW, if you think
it is unnecessary to keep it then I will remove it.
-Sumit
> Best Regards,
> Xiao Yang
> > + .mntpoint = MNTPOINT,
> > + .setup = setup,
> > + .cleanup = cleanup,
> > + .test_all = verify_syncfs,
> > +};
>
>
>
More information about the ltp
mailing list