1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) 2019 Linaro Limited. All rights reserved.
4 * Author: Sumit Garg <sumit.garg@linaro.org>
5 */
6
7/*
8 * fdatasync03
9 *
10 * It basically tests fdatasync() to sync test file data having large dirty
11 * file pages to block device. Also, it tests all supported filesystems on a
12 * test block device.
13 */
14
15#define _GNU_SOURCE
16#include <errno.h>
17#include <stdlib.h>
18#include <stdio.h>
19#include <sys/types.h>
20#include "tst_test.h"
21
22#define MNTPOINT	"mnt_point"
23#define FNAME		MNTPOINT"/test"
24#define FILE_SIZE_MB	32
25#define FILE_SIZE	(FILE_SIZE_MB * TST_MB)
26#define MODE		0644
27
28static void verify_fdatasync(void)
29{
30	int fd;
31	unsigned long written;
32
33	fd = SAFE_OPEN(FNAME, O_RDWR|O_CREAT, MODE);
34
35	tst_dev_sync(fd);
36	tst_dev_bytes_written(tst_device->dev);
37
38	tst_fill_fd(fd, 0, TST_MB, FILE_SIZE_MB);
39
40	TEST(fdatasync(fd));
41
42	if (TST_RET)
43		tst_brk(TFAIL | TTERRNO, "fdatasync(fd) failed");
44
45	written = tst_dev_bytes_written(tst_device->dev);
46
47	SAFE_CLOSE(fd);
48
49	if (written >= FILE_SIZE)
50		tst_res(TPASS, "Test file data synced to device");
51	else
52		tst_res(TFAIL, "Synced %li, expected %i", written, FILE_SIZE);
53}
54
55static struct tst_test test = {
56	.needs_root = 1,
57	.mount_device = 1,
58	.all_filesystems = 1,
59	.mntpoint = MNTPOINT,
60	.test_all = verify_fdatasync,
61	.skip_filesystems = (const char *[]) {
62		"tmpfs",
63		NULL
64	}
65};
66