1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) Linux Test Project, 2014-2024
4*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
5*49cdfc7eSAndroid Build Coastguard Worker * Author: Stanislav Kholmanskikh <[email protected]>
6*49cdfc7eSAndroid Build Coastguard Worker */
7*49cdfc7eSAndroid Build Coastguard Worker
8*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE
9*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
10*49cdfc7eSAndroid Build Coastguard Worker #include <fcntl.h>
11*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/fallocate.h"
12*49cdfc7eSAndroid Build Coastguard Worker #include "tst_fs.h"
13*49cdfc7eSAndroid Build Coastguard Worker
tst_fill_fd(int fd,char pattern,size_t bs,size_t bcount)14*49cdfc7eSAndroid Build Coastguard Worker int tst_fill_fd(int fd, char pattern, size_t bs, size_t bcount)
15*49cdfc7eSAndroid Build Coastguard Worker {
16*49cdfc7eSAndroid Build Coastguard Worker size_t i;
17*49cdfc7eSAndroid Build Coastguard Worker char *buf;
18*49cdfc7eSAndroid Build Coastguard Worker
19*49cdfc7eSAndroid Build Coastguard Worker /* Filling a memory buffer with provided pattern */
20*49cdfc7eSAndroid Build Coastguard Worker buf = malloc(bs);
21*49cdfc7eSAndroid Build Coastguard Worker if (buf == NULL)
22*49cdfc7eSAndroid Build Coastguard Worker return -1;
23*49cdfc7eSAndroid Build Coastguard Worker
24*49cdfc7eSAndroid Build Coastguard Worker for (i = 0; i < bs; i++)
25*49cdfc7eSAndroid Build Coastguard Worker buf[i] = pattern;
26*49cdfc7eSAndroid Build Coastguard Worker
27*49cdfc7eSAndroid Build Coastguard Worker /* Filling the file */
28*49cdfc7eSAndroid Build Coastguard Worker for (i = 0; i < bcount; i++) {
29*49cdfc7eSAndroid Build Coastguard Worker if (write(fd, buf, bs) != (ssize_t)bs) {
30*49cdfc7eSAndroid Build Coastguard Worker free(buf);
31*49cdfc7eSAndroid Build Coastguard Worker return -1;
32*49cdfc7eSAndroid Build Coastguard Worker }
33*49cdfc7eSAndroid Build Coastguard Worker }
34*49cdfc7eSAndroid Build Coastguard Worker
35*49cdfc7eSAndroid Build Coastguard Worker free(buf);
36*49cdfc7eSAndroid Build Coastguard Worker
37*49cdfc7eSAndroid Build Coastguard Worker return 0;
38*49cdfc7eSAndroid Build Coastguard Worker }
39*49cdfc7eSAndroid Build Coastguard Worker
tst_prealloc_size_fd(int fd,size_t bs,size_t bcount)40*49cdfc7eSAndroid Build Coastguard Worker int tst_prealloc_size_fd(int fd, size_t bs, size_t bcount)
41*49cdfc7eSAndroid Build Coastguard Worker {
42*49cdfc7eSAndroid Build Coastguard Worker int ret;
43*49cdfc7eSAndroid Build Coastguard Worker
44*49cdfc7eSAndroid Build Coastguard Worker errno = 0;
45*49cdfc7eSAndroid Build Coastguard Worker ret = fallocate(fd, 0, 0, bs * bcount);
46*49cdfc7eSAndroid Build Coastguard Worker
47*49cdfc7eSAndroid Build Coastguard Worker if (ret && errno == ENOSPC)
48*49cdfc7eSAndroid Build Coastguard Worker return ret;
49*49cdfc7eSAndroid Build Coastguard Worker
50*49cdfc7eSAndroid Build Coastguard Worker if (ret)
51*49cdfc7eSAndroid Build Coastguard Worker ret = tst_fill_fd(fd, 0, bs, bcount);
52*49cdfc7eSAndroid Build Coastguard Worker
53*49cdfc7eSAndroid Build Coastguard Worker return ret;
54*49cdfc7eSAndroid Build Coastguard Worker }
55*49cdfc7eSAndroid Build Coastguard Worker
tst_fill_file(const char * path,char pattern,size_t bs,size_t bcount)56*49cdfc7eSAndroid Build Coastguard Worker int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount)
57*49cdfc7eSAndroid Build Coastguard Worker {
58*49cdfc7eSAndroid Build Coastguard Worker int fd;
59*49cdfc7eSAndroid Build Coastguard Worker
60*49cdfc7eSAndroid Build Coastguard Worker fd = open(path, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR);
61*49cdfc7eSAndroid Build Coastguard Worker if (fd < 0)
62*49cdfc7eSAndroid Build Coastguard Worker return -1;
63*49cdfc7eSAndroid Build Coastguard Worker
64*49cdfc7eSAndroid Build Coastguard Worker if (tst_fill_fd(fd, pattern, bs, bcount)) {
65*49cdfc7eSAndroid Build Coastguard Worker close(fd);
66*49cdfc7eSAndroid Build Coastguard Worker unlink(path);
67*49cdfc7eSAndroid Build Coastguard Worker return -1;
68*49cdfc7eSAndroid Build Coastguard Worker }
69*49cdfc7eSAndroid Build Coastguard Worker
70*49cdfc7eSAndroid Build Coastguard Worker if (close(fd) < 0) {
71*49cdfc7eSAndroid Build Coastguard Worker unlink(path);
72*49cdfc7eSAndroid Build Coastguard Worker
73*49cdfc7eSAndroid Build Coastguard Worker return -1;
74*49cdfc7eSAndroid Build Coastguard Worker }
75*49cdfc7eSAndroid Build Coastguard Worker
76*49cdfc7eSAndroid Build Coastguard Worker return 0;
77*49cdfc7eSAndroid Build Coastguard Worker }
78*49cdfc7eSAndroid Build Coastguard Worker
tst_prealloc_file(const char * path,size_t bs,size_t bcount)79*49cdfc7eSAndroid Build Coastguard Worker int tst_prealloc_file(const char *path, size_t bs, size_t bcount)
80*49cdfc7eSAndroid Build Coastguard Worker {
81*49cdfc7eSAndroid Build Coastguard Worker int fd;
82*49cdfc7eSAndroid Build Coastguard Worker
83*49cdfc7eSAndroid Build Coastguard Worker fd = open(path, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR);
84*49cdfc7eSAndroid Build Coastguard Worker if (fd < 0)
85*49cdfc7eSAndroid Build Coastguard Worker return -1;
86*49cdfc7eSAndroid Build Coastguard Worker
87*49cdfc7eSAndroid Build Coastguard Worker if (tst_prealloc_size_fd(fd, bs, bcount)) {
88*49cdfc7eSAndroid Build Coastguard Worker close(fd);
89*49cdfc7eSAndroid Build Coastguard Worker unlink(path);
90*49cdfc7eSAndroid Build Coastguard Worker return -1;
91*49cdfc7eSAndroid Build Coastguard Worker }
92*49cdfc7eSAndroid Build Coastguard Worker
93*49cdfc7eSAndroid Build Coastguard Worker if (close(fd) < 0) {
94*49cdfc7eSAndroid Build Coastguard Worker unlink(path);
95*49cdfc7eSAndroid Build Coastguard Worker return -1;
96*49cdfc7eSAndroid Build Coastguard Worker }
97*49cdfc7eSAndroid Build Coastguard Worker
98*49cdfc7eSAndroid Build Coastguard Worker return 0;
99*49cdfc7eSAndroid Build Coastguard Worker }
100