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 * Test syncfs 9 * 10 * It basically tests syncfs() to sync filesystem having large dirty file 11 * pages to block device. Also, it tests all supported filesystems on a test 12 * block device. 13 */ 14 15#define _GNU_SOURCE 16#include <stdlib.h> 17#include <stdio.h> 18#include <sys/types.h> 19#include "tst_test.h" 20#include "lapi/syncfs.h" 21#include "check_syncfs.h" 22 23#define MNTPOINT "mnt_point" 24#define FNAME MNTPOINT"/test" 25#define FILE_SIZE_MB 32 26#define FILE_SIZE (FILE_SIZE_MB * TST_MB) 27#define MODE 0644 28 29static void verify_syncfs(void) 30{ 31 int fd; 32 unsigned long written; 33 34 fd = SAFE_OPEN(FNAME, O_RDWR|O_CREAT, MODE); 35 36 tst_dev_sync(fd); 37 tst_dev_bytes_written(tst_device->dev); 38 39 tst_fill_fd(fd, 0, TST_MB, FILE_SIZE_MB); 40 41 TEST(syncfs(fd)); 42 43 if (TST_RET) 44 tst_brk(TFAIL | TTERRNO, "syncfs(fd) failed"); 45 46 written = tst_dev_bytes_written(tst_device->dev); 47 48 SAFE_CLOSE(fd); 49 50 if (written >= FILE_SIZE) 51 tst_res(TPASS, "Test filesystem synced to device"); 52 else 53 tst_res(TFAIL, "Synced %li, expected %i", written, FILE_SIZE); 54} 55 56static void setup(void) 57{ 58 check_syncfs(); 59} 60 61static struct tst_test test = { 62 .needs_root = 1, 63 .mount_device = 1, 64 .all_filesystems = 1, 65 .skip_filesystems = (const char*[]) { 66 "tmpfs", 67 NULL 68 }, 69 .mntpoint = MNTPOINT, 70 .setup = setup, 71 .test_all = verify_syncfs, 72}; 73