1f08c3bdfSopenharmony_ci/*
2f08c3bdfSopenharmony_ci * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
3f08c3bdfSopenharmony_ci *
4f08c3bdfSopenharmony_ci * This program is free software; you can redistribute it and/or modify it
5f08c3bdfSopenharmony_ci * under the terms of version 2 of the GNU General Public License as
6f08c3bdfSopenharmony_ci * published by the Free Software Foundation.
7f08c3bdfSopenharmony_ci *
8f08c3bdfSopenharmony_ci * This program is distributed in the hope that it would be useful, but
9f08c3bdfSopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of
10f08c3bdfSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11f08c3bdfSopenharmony_ci *
12f08c3bdfSopenharmony_ci * Further, this software is distributed without any warranty that it is
13f08c3bdfSopenharmony_ci * free of the rightful claim of any third person regarding infringement
14f08c3bdfSopenharmony_ci * or the like.  Any license provided herein, whether implied or
15f08c3bdfSopenharmony_ci * otherwise, applies only to this software file.  Patent licenses, if
16f08c3bdfSopenharmony_ci * any, provided herein do not apply to combinations of this program with
17f08c3bdfSopenharmony_ci * other software, or any other product whatsoever.
18f08c3bdfSopenharmony_ci *
19f08c3bdfSopenharmony_ci * You should have received a copy of the GNU General Public License along
20f08c3bdfSopenharmony_ci * with this program; if not, write the Free Software Foundation, Inc.,
21f08c3bdfSopenharmony_ci * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22f08c3bdfSopenharmony_ci *
23f08c3bdfSopenharmony_ci * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24f08c3bdfSopenharmony_ci * Mountain View, CA  94043, or:
25f08c3bdfSopenharmony_ci *
26f08c3bdfSopenharmony_ci * http://www.sgi.com
27f08c3bdfSopenharmony_ci *
28f08c3bdfSopenharmony_ci * For further information regarding this notice, see:
29f08c3bdfSopenharmony_ci *
30f08c3bdfSopenharmony_ci * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31f08c3bdfSopenharmony_ci */
32f08c3bdfSopenharmony_ci
33f08c3bdfSopenharmony_ci#include "config.h"
34f08c3bdfSopenharmony_ci#include "global.h"
35f08c3bdfSopenharmony_ci#include "tst_common.h"
36f08c3bdfSopenharmony_ci
37f08c3bdfSopenharmony_ci#ifdef HAVE_SYS_PRCTL_H
38f08c3bdfSopenharmony_ci# include <sys/prctl.h>
39f08c3bdfSopenharmony_ci#endif
40f08c3bdfSopenharmony_ci#include <limits.h>
41f08c3bdfSopenharmony_ci
42f08c3bdfSopenharmony_ci#define XFS_ERRTAG_MAX		17
43f08c3bdfSopenharmony_ci
44f08c3bdfSopenharmony_citypedef enum {
45f08c3bdfSopenharmony_ci#ifndef NO_XFS
46f08c3bdfSopenharmony_ci	OP_ALLOCSP,
47f08c3bdfSopenharmony_ci	OP_ATTR_REMOVE,
48f08c3bdfSopenharmony_ci	OP_ATTR_SET,
49f08c3bdfSopenharmony_ci	OP_BULKSTAT,
50f08c3bdfSopenharmony_ci	OP_BULKSTAT1,
51f08c3bdfSopenharmony_ci#endif
52f08c3bdfSopenharmony_ci	OP_CHOWN,
53f08c3bdfSopenharmony_ci	OP_CREAT,
54f08c3bdfSopenharmony_ci	OP_DREAD,
55f08c3bdfSopenharmony_ci	OP_DWRITE,
56f08c3bdfSopenharmony_ci	OP_FDATASYNC,
57f08c3bdfSopenharmony_ci#ifndef NO_XFS
58f08c3bdfSopenharmony_ci	OP_FREESP,
59f08c3bdfSopenharmony_ci#endif
60f08c3bdfSopenharmony_ci	OP_FSYNC,
61f08c3bdfSopenharmony_ci	OP_GETDENTS,
62f08c3bdfSopenharmony_ci	OP_LINK,
63f08c3bdfSopenharmony_ci	OP_MKDIR,
64f08c3bdfSopenharmony_ci	OP_MKNOD,
65f08c3bdfSopenharmony_ci	OP_READ,
66f08c3bdfSopenharmony_ci	OP_READLINK,
67f08c3bdfSopenharmony_ci	OP_RENAME,
68f08c3bdfSopenharmony_ci#ifndef NO_XFS
69f08c3bdfSopenharmony_ci	OP_RESVSP,
70f08c3bdfSopenharmony_ci#endif
71f08c3bdfSopenharmony_ci	OP_RMDIR,
72f08c3bdfSopenharmony_ci	OP_STAT,
73f08c3bdfSopenharmony_ci	OP_SYMLINK,
74f08c3bdfSopenharmony_ci	OP_SYNC,
75f08c3bdfSopenharmony_ci	OP_TRUNCATE,
76f08c3bdfSopenharmony_ci	OP_UNLINK,
77f08c3bdfSopenharmony_ci#ifndef NO_XFS
78f08c3bdfSopenharmony_ci	OP_UNRESVSP,
79f08c3bdfSopenharmony_ci#endif
80f08c3bdfSopenharmony_ci	OP_WRITE,
81f08c3bdfSopenharmony_ci	OP_LAST
82f08c3bdfSopenharmony_ci} opty_t;
83f08c3bdfSopenharmony_ci
84f08c3bdfSopenharmony_citypedef void (*opfnc_t) (int, long);
85f08c3bdfSopenharmony_ci
86f08c3bdfSopenharmony_citypedef struct opdesc {
87f08c3bdfSopenharmony_ci	opty_t op;
88f08c3bdfSopenharmony_ci	char *name;
89f08c3bdfSopenharmony_ci	opfnc_t func;
90f08c3bdfSopenharmony_ci	int freq;
91f08c3bdfSopenharmony_ci	int iswrite;
92f08c3bdfSopenharmony_ci	int isxfs;
93f08c3bdfSopenharmony_ci} opdesc_t;
94f08c3bdfSopenharmony_ci
95f08c3bdfSopenharmony_citypedef struct fent {
96f08c3bdfSopenharmony_ci	int id;
97f08c3bdfSopenharmony_ci	int parent;
98f08c3bdfSopenharmony_ci} fent_t;
99f08c3bdfSopenharmony_ci
100f08c3bdfSopenharmony_citypedef struct flist {
101f08c3bdfSopenharmony_ci	int nfiles;
102f08c3bdfSopenharmony_ci	int nslots;
103f08c3bdfSopenharmony_ci	int tag;
104f08c3bdfSopenharmony_ci	fent_t *fents;
105f08c3bdfSopenharmony_ci} flist_t;
106f08c3bdfSopenharmony_ci
107f08c3bdfSopenharmony_citypedef struct pathname {
108f08c3bdfSopenharmony_ci	int len;
109f08c3bdfSopenharmony_ci	char *path;
110f08c3bdfSopenharmony_ci} pathname_t;
111f08c3bdfSopenharmony_ci
112f08c3bdfSopenharmony_ci#define	FT_DIR	0
113f08c3bdfSopenharmony_ci#define	FT_DIRm	(1 << FT_DIR)
114f08c3bdfSopenharmony_ci#define	FT_REG	1
115f08c3bdfSopenharmony_ci#define	FT_REGm	(1 << FT_REG)
116f08c3bdfSopenharmony_ci#define	FT_SYM	2
117f08c3bdfSopenharmony_ci#define	FT_SYMm	(1 << FT_SYM)
118f08c3bdfSopenharmony_ci#define	FT_DEV	3
119f08c3bdfSopenharmony_ci#define	FT_DEVm	(1 << FT_DEV)
120f08c3bdfSopenharmony_ci#define	FT_RTF	4
121f08c3bdfSopenharmony_ci#define	FT_RTFm	(1 << FT_RTF)
122f08c3bdfSopenharmony_ci#define	FT_nft	5
123f08c3bdfSopenharmony_ci#define	FT_ANYm	((1 << FT_nft) - 1)
124f08c3bdfSopenharmony_ci#define	FT_REGFILE	(FT_REGm | FT_RTFm)
125f08c3bdfSopenharmony_ci#define	FT_NOTDIR	(FT_ANYm & ~FT_DIRm)
126f08c3bdfSopenharmony_ci
127f08c3bdfSopenharmony_ci#define	FLIST_SLOT_INCR	16
128f08c3bdfSopenharmony_ci#define	NDCACHE	64
129f08c3bdfSopenharmony_ci
130f08c3bdfSopenharmony_ci#define	MAXFSIZE	((1ULL << 63) - 1ULL)
131f08c3bdfSopenharmony_ci#define	MAXFSIZE32	((1ULL << 40) - 1ULL)
132f08c3bdfSopenharmony_ci
133f08c3bdfSopenharmony_civoid allocsp_f(int, long);
134f08c3bdfSopenharmony_civoid attr_remove_f(int, long);
135f08c3bdfSopenharmony_civoid attr_set_f(int, long);
136f08c3bdfSopenharmony_civoid bulkstat_f(int, long);
137f08c3bdfSopenharmony_civoid bulkstat1_f(int, long);
138f08c3bdfSopenharmony_civoid chown_f(int, long);
139f08c3bdfSopenharmony_civoid creat_f(int, long);
140f08c3bdfSopenharmony_civoid dread_f(int, long);
141f08c3bdfSopenharmony_civoid dwrite_f(int, long);
142f08c3bdfSopenharmony_civoid fdatasync_f(int, long);
143f08c3bdfSopenharmony_civoid freesp_f(int, long);
144f08c3bdfSopenharmony_civoid fsync_f(int, long);
145f08c3bdfSopenharmony_civoid getdents_f(int, long);
146f08c3bdfSopenharmony_civoid link_f(int, long);
147f08c3bdfSopenharmony_civoid mkdir_f(int, long);
148f08c3bdfSopenharmony_civoid mknod_f(int, long);
149f08c3bdfSopenharmony_civoid read_f(int, long);
150f08c3bdfSopenharmony_civoid readlink_f(int, long);
151f08c3bdfSopenharmony_civoid rename_f(int, long);
152f08c3bdfSopenharmony_civoid resvsp_f(int, long);
153f08c3bdfSopenharmony_civoid rmdir_f(int, long);
154f08c3bdfSopenharmony_civoid stat_f(int, long);
155f08c3bdfSopenharmony_civoid symlink_f(int, long);
156f08c3bdfSopenharmony_civoid sync_f(int, long);
157f08c3bdfSopenharmony_civoid truncate_f(int, long);
158f08c3bdfSopenharmony_civoid unlink_f(int, long);
159f08c3bdfSopenharmony_civoid unresvsp_f(int, long);
160f08c3bdfSopenharmony_civoid write_f(int, long);
161f08c3bdfSopenharmony_ci
162f08c3bdfSopenharmony_ciopdesc_t ops[] = {
163f08c3bdfSopenharmony_ci#ifndef NO_XFS
164f08c3bdfSopenharmony_ci	{OP_ALLOCSP, "allocsp", allocsp_f, 1, 1, 1},
165f08c3bdfSopenharmony_ci	{OP_ATTR_REMOVE, "attr_remove", attr_remove_f, /* 1 */ 0, 1, 1},
166f08c3bdfSopenharmony_ci	{OP_ATTR_SET, "attr_set", attr_set_f, /* 2 */ 0, 1, 1},
167f08c3bdfSopenharmony_ci	{OP_BULKSTAT, "bulkstat", bulkstat_f, 1, 0, 1},
168f08c3bdfSopenharmony_ci	{OP_BULKSTAT1, "bulkstat1", bulkstat1_f, 1, 0, 1},
169f08c3bdfSopenharmony_ci#endif
170f08c3bdfSopenharmony_ci	{OP_CHOWN, "chown", chown_f, 3, 1, 0},
171f08c3bdfSopenharmony_ci	{OP_CREAT, "creat", creat_f, 4, 1, 0},
172f08c3bdfSopenharmony_ci	{OP_DREAD, "dread", dread_f, 4, 0, 0},
173f08c3bdfSopenharmony_ci	{OP_DWRITE, "dwrite", dwrite_f, 4, 1, 0},
174f08c3bdfSopenharmony_ci	{OP_FDATASYNC, "fdatasync", fdatasync_f, 1, 1, 0},
175f08c3bdfSopenharmony_ci#ifndef NO_XFS
176f08c3bdfSopenharmony_ci	{OP_FREESP, "freesp", freesp_f, 1, 1, 1},
177f08c3bdfSopenharmony_ci#endif
178f08c3bdfSopenharmony_ci	{OP_FSYNC, "fsync", fsync_f, 1, 1, 0},
179f08c3bdfSopenharmony_ci	{OP_GETDENTS, "getdents", getdents_f, 1, 0, 0},
180f08c3bdfSopenharmony_ci	{OP_LINK, "link", link_f, 1, 1, 0},
181f08c3bdfSopenharmony_ci	{OP_MKDIR, "mkdir", mkdir_f, 2, 1, 0},
182f08c3bdfSopenharmony_ci	{OP_MKNOD, "mknod", mknod_f, 2, 1, 0},
183f08c3bdfSopenharmony_ci	{OP_READ, "read", read_f, 1, 0, 0},
184f08c3bdfSopenharmony_ci	{OP_READLINK, "readlink", readlink_f, 1, 0, 0},
185f08c3bdfSopenharmony_ci	{OP_RENAME, "rename", rename_f, 2, 1, 0},
186f08c3bdfSopenharmony_ci#ifndef NO_XFS
187f08c3bdfSopenharmony_ci	{OP_RESVSP, "resvsp", resvsp_f, 1, 1, 1},
188f08c3bdfSopenharmony_ci#endif
189f08c3bdfSopenharmony_ci	{OP_RMDIR, "rmdir", rmdir_f, 1, 1, 0},
190f08c3bdfSopenharmony_ci	{OP_STAT, "stat", stat_f, 1, 0, 0},
191f08c3bdfSopenharmony_ci	{OP_SYMLINK, "symlink", symlink_f, 2, 1, 0},
192f08c3bdfSopenharmony_ci	{OP_SYNC, "sync", sync_f, 1, 0, 0},
193f08c3bdfSopenharmony_ci	{OP_TRUNCATE, "truncate", truncate_f, 2, 1, 0},
194f08c3bdfSopenharmony_ci	{OP_UNLINK, "unlink", unlink_f, 1, 1, 0},
195f08c3bdfSopenharmony_ci#ifndef NO_XFS
196f08c3bdfSopenharmony_ci	{OP_UNRESVSP, "unresvsp", unresvsp_f, 1, 1, 1},
197f08c3bdfSopenharmony_ci#endif
198f08c3bdfSopenharmony_ci	{OP_WRITE, "write", write_f, 4, 1, 0},
199f08c3bdfSopenharmony_ci}, *ops_end;
200f08c3bdfSopenharmony_ci
201f08c3bdfSopenharmony_ciflist_t flist[FT_nft] = {
202f08c3bdfSopenharmony_ci	{0, 0, 'd', NULL},
203f08c3bdfSopenharmony_ci	{0, 0, 'f', NULL},
204f08c3bdfSopenharmony_ci	{0, 0, 'l', NULL},
205f08c3bdfSopenharmony_ci	{0, 0, 'c', NULL},
206f08c3bdfSopenharmony_ci	{0, 0, 'r', NULL},
207f08c3bdfSopenharmony_ci};
208f08c3bdfSopenharmony_ci
209f08c3bdfSopenharmony_ciint dcache[NDCACHE];
210f08c3bdfSopenharmony_ciint errrange;
211f08c3bdfSopenharmony_ciint errtag;
212f08c3bdfSopenharmony_ciopty_t *freq_table;
213f08c3bdfSopenharmony_ciint freq_table_size;
214f08c3bdfSopenharmony_ci#ifndef NO_XFS
215f08c3bdfSopenharmony_cixfs_fsop_geom_t geom;
216f08c3bdfSopenharmony_ci#endif
217f08c3bdfSopenharmony_cichar *homedir;
218f08c3bdfSopenharmony_ciint *ilist;
219f08c3bdfSopenharmony_ciint ilistlen;
220f08c3bdfSopenharmony_cioff64_t maxfsize;
221f08c3bdfSopenharmony_cichar *myprog;
222f08c3bdfSopenharmony_ciint namerand;
223f08c3bdfSopenharmony_ciint nameseq;
224f08c3bdfSopenharmony_ciint nops;
225f08c3bdfSopenharmony_ciint nproc = 1;
226f08c3bdfSopenharmony_ciint operations = 1;
227f08c3bdfSopenharmony_ciint procid;
228f08c3bdfSopenharmony_ciint rtpct;
229f08c3bdfSopenharmony_ciunsigned long seed = 0;
230f08c3bdfSopenharmony_ciino_t top_ino;
231f08c3bdfSopenharmony_ciint verbose = 0;
232f08c3bdfSopenharmony_ci#ifndef NO_XFS
233f08c3bdfSopenharmony_ciint no_xfs = 0;
234f08c3bdfSopenharmony_ci#else
235f08c3bdfSopenharmony_ciint no_xfs = 1;
236f08c3bdfSopenharmony_ci#endif
237f08c3bdfSopenharmony_cisig_atomic_t should_stop = 0;
238f08c3bdfSopenharmony_ci
239f08c3bdfSopenharmony_civoid add_to_flist(int, int, int);
240f08c3bdfSopenharmony_civoid append_pathname(pathname_t *, char *);
241f08c3bdfSopenharmony_ci#ifndef NO_XFS
242f08c3bdfSopenharmony_ciint attr_list_path(pathname_t *, char *, const int, int, attrlist_cursor_t *);
243f08c3bdfSopenharmony_ciint attr_remove_path(pathname_t *, const char *, int);
244f08c3bdfSopenharmony_ciint attr_set_path(pathname_t *, const char *, const char *, const int, int);
245f08c3bdfSopenharmony_ci#endif
246f08c3bdfSopenharmony_civoid check_cwd(void);
247f08c3bdfSopenharmony_ciint creat_path(pathname_t *, mode_t);
248f08c3bdfSopenharmony_civoid dcache_enter(int, int);
249f08c3bdfSopenharmony_civoid dcache_init(void);
250f08c3bdfSopenharmony_cifent_t *dcache_lookup(int);
251f08c3bdfSopenharmony_civoid dcache_purge(int);
252f08c3bdfSopenharmony_civoid del_from_flist(int, int);
253f08c3bdfSopenharmony_ciint dirid_to_name(char *, int);
254f08c3bdfSopenharmony_civoid doproc(void);
255f08c3bdfSopenharmony_civoid fent_to_name(pathname_t *, flist_t *, fent_t *);
256f08c3bdfSopenharmony_civoid fix_parent(int, int);
257f08c3bdfSopenharmony_civoid free_pathname(pathname_t *);
258f08c3bdfSopenharmony_ciint generate_fname(fent_t *, int, pathname_t *, int *, int *);
259f08c3bdfSopenharmony_ciint get_fname(int, long, pathname_t *, flist_t **, fent_t **, int *);
260f08c3bdfSopenharmony_civoid init_pathname(pathname_t *);
261f08c3bdfSopenharmony_ciint lchown_path(pathname_t *, uid_t, gid_t);
262f08c3bdfSopenharmony_ciint link_path(pathname_t *, pathname_t *);
263f08c3bdfSopenharmony_ciint lstat64_path(pathname_t *, struct stat64 *);
264f08c3bdfSopenharmony_civoid make_freq_table(void);
265f08c3bdfSopenharmony_ciint mkdir_path(pathname_t *, mode_t);
266f08c3bdfSopenharmony_ciint mknod_path(pathname_t *, mode_t, dev_t);
267f08c3bdfSopenharmony_civoid namerandpad(int, char *, int);
268f08c3bdfSopenharmony_ciint open_path(pathname_t *, int);
269f08c3bdfSopenharmony_ciDIR *opendir_path(pathname_t *);
270f08c3bdfSopenharmony_civoid process_freq(char *);
271f08c3bdfSopenharmony_ciint readlink_path(pathname_t *, char *, size_t);
272f08c3bdfSopenharmony_ciint rename_path(pathname_t *, pathname_t *);
273f08c3bdfSopenharmony_ciint rmdir_path(pathname_t *);
274f08c3bdfSopenharmony_civoid separate_pathname(pathname_t *, char *, pathname_t *);
275f08c3bdfSopenharmony_civoid show_ops(int, char *);
276f08c3bdfSopenharmony_ciint stat64_path(pathname_t *, struct stat64 *);
277f08c3bdfSopenharmony_ciint symlink_path(const char *, pathname_t *);
278f08c3bdfSopenharmony_ciint truncate64_path(pathname_t *, off64_t);
279f08c3bdfSopenharmony_ciint unlink_path(pathname_t *);
280f08c3bdfSopenharmony_civoid usage(void);
281f08c3bdfSopenharmony_civoid write_freq(void);
282f08c3bdfSopenharmony_civoid zero_freq(void);
283f08c3bdfSopenharmony_ci
284f08c3bdfSopenharmony_civoid sg_handler(int signum __attribute__((unused)))
285f08c3bdfSopenharmony_ci{
286f08c3bdfSopenharmony_ci	should_stop = 1;
287f08c3bdfSopenharmony_ci}
288f08c3bdfSopenharmony_ci
289f08c3bdfSopenharmony_ciint main(int argc, char **argv)
290f08c3bdfSopenharmony_ci{
291f08c3bdfSopenharmony_ci	char buf[10];
292f08c3bdfSopenharmony_ci	int c;
293f08c3bdfSopenharmony_ci	char *dirname = NULL;
294f08c3bdfSopenharmony_ci	int fd;
295f08c3bdfSopenharmony_ci	int i;
296f08c3bdfSopenharmony_ci	int cleanup = 0;
297f08c3bdfSopenharmony_ci	int loops = 1;
298f08c3bdfSopenharmony_ci	int loopcntr = 1;
299f08c3bdfSopenharmony_ci	char cmd[256];
300f08c3bdfSopenharmony_ci#ifndef NO_XFS
301f08c3bdfSopenharmony_ci	int j;
302f08c3bdfSopenharmony_ci#endif
303f08c3bdfSopenharmony_ci	char *p;
304f08c3bdfSopenharmony_ci	int stat;
305f08c3bdfSopenharmony_ci	struct timeval t;
306f08c3bdfSopenharmony_ci#ifndef NO_XFS
307f08c3bdfSopenharmony_ci	ptrdiff_t srval;
308f08c3bdfSopenharmony_ci#endif
309f08c3bdfSopenharmony_ci	int nousage = 0;
310f08c3bdfSopenharmony_ci#ifndef NO_XFS
311f08c3bdfSopenharmony_ci	xfs_error_injection_t err_inj;
312f08c3bdfSopenharmony_ci#endif
313f08c3bdfSopenharmony_ci	struct sigaction action;
314f08c3bdfSopenharmony_ci
315f08c3bdfSopenharmony_ci	errrange = errtag = 0;
316f08c3bdfSopenharmony_ci	umask(0);
317f08c3bdfSopenharmony_ci	nops = ARRAY_SIZE(ops);
318f08c3bdfSopenharmony_ci	ops_end = &ops[nops];
319f08c3bdfSopenharmony_ci	myprog = argv[0];
320f08c3bdfSopenharmony_ci	while ((c = getopt(argc, argv, "cd:e:f:i:l:n:p:rs:vwzHSX")) != -1) {
321f08c3bdfSopenharmony_ci		switch (c) {
322f08c3bdfSopenharmony_ci		case 'c':
323f08c3bdfSopenharmony_ci			/*Don't cleanup */
324f08c3bdfSopenharmony_ci			cleanup = 1;
325f08c3bdfSopenharmony_ci			break;
326f08c3bdfSopenharmony_ci		case 'd':
327f08c3bdfSopenharmony_ci			dirname = optarg;
328f08c3bdfSopenharmony_ci			break;
329f08c3bdfSopenharmony_ci		case 'e':
330f08c3bdfSopenharmony_ci			sscanf(optarg, "%d", &errtag);
331f08c3bdfSopenharmony_ci			if (errtag < 0) {
332f08c3bdfSopenharmony_ci				errtag = -errtag;
333f08c3bdfSopenharmony_ci				errrange = 1;
334f08c3bdfSopenharmony_ci			} else if (errtag == 0)
335f08c3bdfSopenharmony_ci				errtag = -1;
336f08c3bdfSopenharmony_ci			if (errtag >= XFS_ERRTAG_MAX) {
337f08c3bdfSopenharmony_ci				fprintf(stderr,
338f08c3bdfSopenharmony_ci					"error tag %d too large (max %d)\n",
339f08c3bdfSopenharmony_ci					errtag, XFS_ERRTAG_MAX - 1);
340f08c3bdfSopenharmony_ci				exit(1);
341f08c3bdfSopenharmony_ci			}
342f08c3bdfSopenharmony_ci			break;
343f08c3bdfSopenharmony_ci		case 'f':
344f08c3bdfSopenharmony_ci			process_freq(optarg);
345f08c3bdfSopenharmony_ci			break;
346f08c3bdfSopenharmony_ci		case 'i':
347f08c3bdfSopenharmony_ci			ilist = realloc(ilist, ++ilistlen * sizeof(*ilist));
348f08c3bdfSopenharmony_ci			ilist[ilistlen - 1] = strtol(optarg, &p, 16);
349f08c3bdfSopenharmony_ci			break;
350f08c3bdfSopenharmony_ci		case 'l':
351f08c3bdfSopenharmony_ci			loops = atoi(optarg);
352f08c3bdfSopenharmony_ci			break;
353f08c3bdfSopenharmony_ci		case 'n':
354f08c3bdfSopenharmony_ci			operations = atoi(optarg);
355f08c3bdfSopenharmony_ci			break;
356f08c3bdfSopenharmony_ci		case 'p':
357f08c3bdfSopenharmony_ci			nproc = atoi(optarg);
358f08c3bdfSopenharmony_ci			break;
359f08c3bdfSopenharmony_ci		case 'r':
360f08c3bdfSopenharmony_ci			namerand = 1;
361f08c3bdfSopenharmony_ci			break;
362f08c3bdfSopenharmony_ci		case 's':
363f08c3bdfSopenharmony_ci			seed = strtoul(optarg, NULL, 0);
364f08c3bdfSopenharmony_ci			break;
365f08c3bdfSopenharmony_ci		case 'v':
366f08c3bdfSopenharmony_ci			verbose = 1;
367f08c3bdfSopenharmony_ci			break;
368f08c3bdfSopenharmony_ci		case 'w':
369f08c3bdfSopenharmony_ci			write_freq();
370f08c3bdfSopenharmony_ci			break;
371f08c3bdfSopenharmony_ci		case 'z':
372f08c3bdfSopenharmony_ci			zero_freq();
373f08c3bdfSopenharmony_ci			break;
374f08c3bdfSopenharmony_ci		case 'S':
375f08c3bdfSopenharmony_ci			show_ops(0, NULL);
376f08c3bdfSopenharmony_ci			printf("\n");
377f08c3bdfSopenharmony_ci			nousage = 1;
378f08c3bdfSopenharmony_ci			break;
379f08c3bdfSopenharmony_ci		case '?':
380f08c3bdfSopenharmony_ci			fprintf(stderr, "%s - invalid parameters\n", myprog);
381f08c3bdfSopenharmony_ci			/* fall through */
382f08c3bdfSopenharmony_ci		case 'H':
383f08c3bdfSopenharmony_ci			usage();
384f08c3bdfSopenharmony_ci			exit(1);
385f08c3bdfSopenharmony_ci		case 'X':
386f08c3bdfSopenharmony_ci			no_xfs = 1;
387f08c3bdfSopenharmony_ci			break;
388f08c3bdfSopenharmony_ci		}
389f08c3bdfSopenharmony_ci	}
390f08c3bdfSopenharmony_ci
391f08c3bdfSopenharmony_ci	if (no_xfs && errtag) {
392f08c3bdfSopenharmony_ci		fprintf(stderr, "error injection only works on XFS\n");
393f08c3bdfSopenharmony_ci		exit(1);
394f08c3bdfSopenharmony_ci	}
395f08c3bdfSopenharmony_ci
396f08c3bdfSopenharmony_ci	if (no_xfs) {
397f08c3bdfSopenharmony_ci		int i;
398f08c3bdfSopenharmony_ci		for (i = 0; ops + i < ops_end; ++i) {
399f08c3bdfSopenharmony_ci			if (ops[i].isxfs)
400f08c3bdfSopenharmony_ci				ops[i].freq = 0;
401f08c3bdfSopenharmony_ci		}
402f08c3bdfSopenharmony_ci	}
403f08c3bdfSopenharmony_ci
404f08c3bdfSopenharmony_ci	make_freq_table();
405f08c3bdfSopenharmony_ci
406f08c3bdfSopenharmony_ci	while (((loopcntr <= loops) || (loops == 0)) && !should_stop) {
407f08c3bdfSopenharmony_ci		if (!dirname) {
408f08c3bdfSopenharmony_ci			/* no directory specified */
409f08c3bdfSopenharmony_ci			if (!nousage)
410f08c3bdfSopenharmony_ci				usage();
411f08c3bdfSopenharmony_ci			exit(1);
412f08c3bdfSopenharmony_ci		}
413f08c3bdfSopenharmony_ci
414f08c3bdfSopenharmony_ci		(void)mkdir(dirname, 0777);
415f08c3bdfSopenharmony_ci		if (chdir(dirname) < 0) {
416f08c3bdfSopenharmony_ci			perror(dirname);
417f08c3bdfSopenharmony_ci			exit(1);
418f08c3bdfSopenharmony_ci		}
419f08c3bdfSopenharmony_ci		sprintf(buf, "fss%x", getpid());
420f08c3bdfSopenharmony_ci		fd = creat(buf, 0666);
421f08c3bdfSopenharmony_ci		if (lseek64(fd, (off64_t) (MAXFSIZE32 + 1ULL), SEEK_SET) < 0)
422f08c3bdfSopenharmony_ci			maxfsize = (off64_t) MAXFSIZE32;
423f08c3bdfSopenharmony_ci		else
424f08c3bdfSopenharmony_ci			maxfsize = (off64_t) MAXFSIZE;
425f08c3bdfSopenharmony_ci		dcache_init();
426f08c3bdfSopenharmony_ci		setlinebuf(stdout);
427f08c3bdfSopenharmony_ci		if (!seed) {
428f08c3bdfSopenharmony_ci			gettimeofday(&t, NULL);
429f08c3bdfSopenharmony_ci			seed = (int)t.tv_sec ^ (int)t.tv_usec;
430f08c3bdfSopenharmony_ci			printf("seed = %ld\n", seed);
431f08c3bdfSopenharmony_ci		}
432f08c3bdfSopenharmony_ci#ifndef NO_XFS
433f08c3bdfSopenharmony_ci		if (!no_xfs) {
434f08c3bdfSopenharmony_ci			memset(&geom, 0, sizeof(geom));
435f08c3bdfSopenharmony_ci			i = ioctl(fd, XFS_IOC_FSGEOMETRY, &geom);
436f08c3bdfSopenharmony_ci			if (i >= 0 && geom.rtblocks)
437f08c3bdfSopenharmony_ci				rtpct = MIN(MAX(geom.rtblocks * 100 /
438f08c3bdfSopenharmony_ci						(geom.rtblocks +
439f08c3bdfSopenharmony_ci						 geom.datablocks), 1), 99);
440f08c3bdfSopenharmony_ci			else
441f08c3bdfSopenharmony_ci				rtpct = 0;
442f08c3bdfSopenharmony_ci		}
443f08c3bdfSopenharmony_ci		if (errtag != 0) {
444f08c3bdfSopenharmony_ci			if (errrange == 0) {
445f08c3bdfSopenharmony_ci				if (errtag <= 0) {
446f08c3bdfSopenharmony_ci					srandom(seed);
447f08c3bdfSopenharmony_ci					j = random() % 100;
448f08c3bdfSopenharmony_ci
449f08c3bdfSopenharmony_ci					for (i = 0; i < j; i++)
450f08c3bdfSopenharmony_ci						(void)random();
451f08c3bdfSopenharmony_ci
452f08c3bdfSopenharmony_ci					errtag =
453f08c3bdfSopenharmony_ci					    (random() % (XFS_ERRTAG_MAX - 1)) +
454f08c3bdfSopenharmony_ci					    1;
455f08c3bdfSopenharmony_ci				}
456f08c3bdfSopenharmony_ci			} else {
457f08c3bdfSopenharmony_ci				srandom(seed);
458f08c3bdfSopenharmony_ci				j = random() % 100;
459f08c3bdfSopenharmony_ci
460f08c3bdfSopenharmony_ci				for (i = 0; i < j; i++)
461f08c3bdfSopenharmony_ci					(void)random();
462f08c3bdfSopenharmony_ci
463f08c3bdfSopenharmony_ci				errtag +=
464f08c3bdfSopenharmony_ci				    (random() % (XFS_ERRTAG_MAX - errtag));
465f08c3bdfSopenharmony_ci			}
466f08c3bdfSopenharmony_ci			printf("Injecting failure on tag #%d\n", errtag);
467f08c3bdfSopenharmony_ci			memset(&err_inj, 0, sizeof(err_inj));
468f08c3bdfSopenharmony_ci			err_inj.errtag = errtag;
469f08c3bdfSopenharmony_ci			err_inj.fd = fd;
470f08c3bdfSopenharmony_ci			srval = ioctl(fd, XFS_IOC_ERROR_INJECTION, &err_inj);
471f08c3bdfSopenharmony_ci			if (srval < -1) {
472f08c3bdfSopenharmony_ci				perror
473f08c3bdfSopenharmony_ci				    ("fsstress - XFS_SYSSGI error injection call");
474f08c3bdfSopenharmony_ci				close(fd);
475f08c3bdfSopenharmony_ci				unlink(buf);
476f08c3bdfSopenharmony_ci				exit(1);
477f08c3bdfSopenharmony_ci			}
478f08c3bdfSopenharmony_ci		} else
479f08c3bdfSopenharmony_ci#endif
480f08c3bdfSopenharmony_ci			close(fd);
481f08c3bdfSopenharmony_ci		unlink(buf);
482f08c3bdfSopenharmony_ci
483f08c3bdfSopenharmony_ci
484f08c3bdfSopenharmony_ci		if (nproc == 1) {
485f08c3bdfSopenharmony_ci			procid = 0;
486f08c3bdfSopenharmony_ci			doproc();
487f08c3bdfSopenharmony_ci		} else {
488f08c3bdfSopenharmony_ci			setpgid(0, 0);
489f08c3bdfSopenharmony_ci			action.sa_handler = sg_handler;
490f08c3bdfSopenharmony_ci			sigemptyset(&action.sa_mask);
491f08c3bdfSopenharmony_ci			action.sa_flags = 0;
492f08c3bdfSopenharmony_ci			if (sigaction(SIGTERM, &action, 0)) {
493f08c3bdfSopenharmony_ci				perror("sigaction failed");
494f08c3bdfSopenharmony_ci				exit(1);
495f08c3bdfSopenharmony_ci			}
496f08c3bdfSopenharmony_ci
497f08c3bdfSopenharmony_ci			for (i = 0; i < nproc; i++) {
498f08c3bdfSopenharmony_ci				if (fork() == 0) {
499f08c3bdfSopenharmony_ci
500f08c3bdfSopenharmony_ci					action.sa_handler = SIG_DFL;
501f08c3bdfSopenharmony_ci					sigemptyset(&action.sa_mask);
502f08c3bdfSopenharmony_ci					if (sigaction(SIGTERM, &action, 0))
503f08c3bdfSopenharmony_ci						return 1;
504f08c3bdfSopenharmony_ci#ifdef HAVE_SYS_PRCTL_H
505f08c3bdfSopenharmony_ci					prctl(PR_SET_PDEATHSIG, SIGKILL);
506f08c3bdfSopenharmony_ci					if (getppid() == 1) /* parent died already? */
507f08c3bdfSopenharmony_ci						return 0;
508f08c3bdfSopenharmony_ci#endif
509f08c3bdfSopenharmony_ci					procid = i;
510f08c3bdfSopenharmony_ci					doproc();
511f08c3bdfSopenharmony_ci					return 0;
512f08c3bdfSopenharmony_ci				}
513f08c3bdfSopenharmony_ci			}
514f08c3bdfSopenharmony_ci			while (wait(&stat) > 0 && !should_stop) {
515f08c3bdfSopenharmony_ci				continue;
516f08c3bdfSopenharmony_ci			}
517f08c3bdfSopenharmony_ci			if (should_stop) {
518f08c3bdfSopenharmony_ci				action.sa_flags = SA_RESTART;
519f08c3bdfSopenharmony_ci				sigaction(SIGTERM, &action, 0);
520f08c3bdfSopenharmony_ci				kill(-getpid(), SIGTERM);
521f08c3bdfSopenharmony_ci				while (wait(&stat) > 0)
522f08c3bdfSopenharmony_ci					continue;
523f08c3bdfSopenharmony_ci			}
524f08c3bdfSopenharmony_ci		}
525f08c3bdfSopenharmony_ci#ifndef NO_XFS
526f08c3bdfSopenharmony_ci		if (errtag != 0) {
527f08c3bdfSopenharmony_ci			memset(&err_inj, 0, sizeof(err_inj));
528f08c3bdfSopenharmony_ci			err_inj.errtag = 0;
529f08c3bdfSopenharmony_ci			err_inj.fd = fd;
530f08c3bdfSopenharmony_ci			if ((srval =
531f08c3bdfSopenharmony_ci			     ioctl(fd, XFS_IOC_ERROR_CLEARALL,
532f08c3bdfSopenharmony_ci				   &err_inj)) != 0) {
533f08c3bdfSopenharmony_ci				fprintf(stderr, "Bad ej clear on %d (%d).\n",
534f08c3bdfSopenharmony_ci					fd, errno);
535f08c3bdfSopenharmony_ci				perror
536f08c3bdfSopenharmony_ci				    ("fsstress - XFS_SYSSGI clear error injection call");
537f08c3bdfSopenharmony_ci				close(fd);
538f08c3bdfSopenharmony_ci				exit(1);
539f08c3bdfSopenharmony_ci			}
540f08c3bdfSopenharmony_ci			close(fd);
541f08c3bdfSopenharmony_ci		}
542f08c3bdfSopenharmony_ci#endif
543f08c3bdfSopenharmony_ci		if (cleanup == 0) {
544f08c3bdfSopenharmony_ci			sprintf(cmd, "rm -rf %s/*", dirname);
545f08c3bdfSopenharmony_ci			system(cmd);
546f08c3bdfSopenharmony_ci			for (i = 0; i < FT_nft; i++) {
547f08c3bdfSopenharmony_ci				flist[i].nslots = 0;
548f08c3bdfSopenharmony_ci				flist[i].nfiles = 0;
549f08c3bdfSopenharmony_ci				free(flist[i].fents);
550f08c3bdfSopenharmony_ci				flist[i].fents = NULL;
551f08c3bdfSopenharmony_ci			}
552f08c3bdfSopenharmony_ci		}
553f08c3bdfSopenharmony_ci		loopcntr++;
554f08c3bdfSopenharmony_ci	}
555f08c3bdfSopenharmony_ci	return 0;
556f08c3bdfSopenharmony_ci}
557f08c3bdfSopenharmony_ci
558f08c3bdfSopenharmony_civoid add_to_flist(int ft, int id, int parent)
559f08c3bdfSopenharmony_ci{
560f08c3bdfSopenharmony_ci	fent_t *fep;
561f08c3bdfSopenharmony_ci	flist_t *ftp;
562f08c3bdfSopenharmony_ci
563f08c3bdfSopenharmony_ci	ftp = &flist[ft];
564f08c3bdfSopenharmony_ci	if (ftp->nfiles == ftp->nslots) {
565f08c3bdfSopenharmony_ci		ftp->nslots += FLIST_SLOT_INCR;
566f08c3bdfSopenharmony_ci		ftp->fents = realloc(ftp->fents, ftp->nslots * sizeof(fent_t));
567f08c3bdfSopenharmony_ci	}
568f08c3bdfSopenharmony_ci	fep = &ftp->fents[ftp->nfiles++];
569f08c3bdfSopenharmony_ci	fep->id = id;
570f08c3bdfSopenharmony_ci	fep->parent = parent;
571f08c3bdfSopenharmony_ci}
572f08c3bdfSopenharmony_ci
573f08c3bdfSopenharmony_civoid append_pathname(pathname_t * name, char *str)
574f08c3bdfSopenharmony_ci{
575f08c3bdfSopenharmony_ci	int len;
576f08c3bdfSopenharmony_ci
577f08c3bdfSopenharmony_ci	len = strlen(str);
578f08c3bdfSopenharmony_ci#ifdef DEBUG
579f08c3bdfSopenharmony_ci	if (len && *str == '/' && name->len == 0) {
580f08c3bdfSopenharmony_ci		fprintf(stderr, "fsstress: append_pathname failure\n");
581f08c3bdfSopenharmony_ci		chdir(homedir);
582f08c3bdfSopenharmony_ci		abort();
583f08c3bdfSopenharmony_ci
584f08c3bdfSopenharmony_ci	}
585f08c3bdfSopenharmony_ci#endif
586f08c3bdfSopenharmony_ci	name->path = realloc(name->path, name->len + 1 + len);
587f08c3bdfSopenharmony_ci	strcpy(&name->path[name->len], str);
588f08c3bdfSopenharmony_ci	name->len += len;
589f08c3bdfSopenharmony_ci}
590f08c3bdfSopenharmony_ci
591f08c3bdfSopenharmony_ci#ifndef NO_XFS
592f08c3bdfSopenharmony_ciint
593f08c3bdfSopenharmony_ciattr_list_path(pathname_t * name, char *buffer, const int buffersize, int flags,
594f08c3bdfSopenharmony_ci	       attrlist_cursor_t * cursor)
595f08c3bdfSopenharmony_ci{
596f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
597f08c3bdfSopenharmony_ci	pathname_t newname;
598f08c3bdfSopenharmony_ci	int rval;
599f08c3bdfSopenharmony_ci
600f08c3bdfSopenharmony_ci	rval = attr_list(name->path, buffer, buffersize, flags, cursor);
601f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
602f08c3bdfSopenharmony_ci		return rval;
603f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
604f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
605f08c3bdfSopenharmony_ci		rval = attr_list_path(&newname, buffer, buffersize, flags,
606f08c3bdfSopenharmony_ci				      cursor);
607f08c3bdfSopenharmony_ci		chdir("..");
608f08c3bdfSopenharmony_ci	}
609f08c3bdfSopenharmony_ci	free_pathname(&newname);
610f08c3bdfSopenharmony_ci	return rval;
611f08c3bdfSopenharmony_ci}
612f08c3bdfSopenharmony_ci
613f08c3bdfSopenharmony_ciint attr_remove_path(pathname_t * name, const char *attrname, int flags)
614f08c3bdfSopenharmony_ci{
615f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
616f08c3bdfSopenharmony_ci	pathname_t newname;
617f08c3bdfSopenharmony_ci	int rval;
618f08c3bdfSopenharmony_ci
619f08c3bdfSopenharmony_ci	rval = attr_remove(name->path, attrname, flags);
620f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
621f08c3bdfSopenharmony_ci		return rval;
622f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
623f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
624f08c3bdfSopenharmony_ci		rval = attr_remove_path(&newname, attrname, flags);
625f08c3bdfSopenharmony_ci		chdir("..");
626f08c3bdfSopenharmony_ci	}
627f08c3bdfSopenharmony_ci	free_pathname(&newname);
628f08c3bdfSopenharmony_ci	return rval;
629f08c3bdfSopenharmony_ci}
630f08c3bdfSopenharmony_ci
631f08c3bdfSopenharmony_ciint
632f08c3bdfSopenharmony_ciattr_set_path(pathname_t * name, const char *attrname, const char *attrvalue,
633f08c3bdfSopenharmony_ci	      const int valuelength, int flags)
634f08c3bdfSopenharmony_ci{
635f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
636f08c3bdfSopenharmony_ci	pathname_t newname;
637f08c3bdfSopenharmony_ci	int rval;
638f08c3bdfSopenharmony_ci
639f08c3bdfSopenharmony_ci	rval = attr_set(name->path, attrname, attrvalue, valuelength, flags);
640f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
641f08c3bdfSopenharmony_ci		return rval;
642f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
643f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
644f08c3bdfSopenharmony_ci		rval = attr_set_path(&newname, attrname, attrvalue, valuelength,
645f08c3bdfSopenharmony_ci				     flags);
646f08c3bdfSopenharmony_ci		chdir("..");
647f08c3bdfSopenharmony_ci	}
648f08c3bdfSopenharmony_ci	free_pathname(&newname);
649f08c3bdfSopenharmony_ci	return rval;
650f08c3bdfSopenharmony_ci}
651f08c3bdfSopenharmony_ci#endif
652f08c3bdfSopenharmony_ci
653f08c3bdfSopenharmony_civoid check_cwd(void)
654f08c3bdfSopenharmony_ci{
655f08c3bdfSopenharmony_ci#ifdef DEBUG
656f08c3bdfSopenharmony_ci	struct stat64 statbuf;
657f08c3bdfSopenharmony_ci
658f08c3bdfSopenharmony_ci	if (stat64(".", &statbuf) == 0 && statbuf.st_ino == top_ino)
659f08c3bdfSopenharmony_ci		return;
660f08c3bdfSopenharmony_ci	chdir(homedir);
661f08c3bdfSopenharmony_ci	fprintf(stderr, "fsstress: check_cwd failure\n");
662f08c3bdfSopenharmony_ci	abort();
663f08c3bdfSopenharmony_ci
664f08c3bdfSopenharmony_ci#endif
665f08c3bdfSopenharmony_ci}
666f08c3bdfSopenharmony_ci
667f08c3bdfSopenharmony_ciint creat_path(pathname_t * name, mode_t mode)
668f08c3bdfSopenharmony_ci{
669f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
670f08c3bdfSopenharmony_ci	pathname_t newname;
671f08c3bdfSopenharmony_ci	int rval;
672f08c3bdfSopenharmony_ci
673f08c3bdfSopenharmony_ci	rval = creat(name->path, mode);
674f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
675f08c3bdfSopenharmony_ci		return rval;
676f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
677f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
678f08c3bdfSopenharmony_ci		rval = creat_path(&newname, mode);
679f08c3bdfSopenharmony_ci		chdir("..");
680f08c3bdfSopenharmony_ci	}
681f08c3bdfSopenharmony_ci	free_pathname(&newname);
682f08c3bdfSopenharmony_ci	return rval;
683f08c3bdfSopenharmony_ci}
684f08c3bdfSopenharmony_ci
685f08c3bdfSopenharmony_civoid dcache_enter(int dirid, int slot)
686f08c3bdfSopenharmony_ci{
687f08c3bdfSopenharmony_ci	dcache[dirid % NDCACHE] = slot;
688f08c3bdfSopenharmony_ci}
689f08c3bdfSopenharmony_ci
690f08c3bdfSopenharmony_civoid dcache_init(void)
691f08c3bdfSopenharmony_ci{
692f08c3bdfSopenharmony_ci	int i;
693f08c3bdfSopenharmony_ci
694f08c3bdfSopenharmony_ci	for (i = 0; i < NDCACHE; i++)
695f08c3bdfSopenharmony_ci		dcache[i] = -1;
696f08c3bdfSopenharmony_ci}
697f08c3bdfSopenharmony_ci
698f08c3bdfSopenharmony_cifent_t *dcache_lookup(int dirid)
699f08c3bdfSopenharmony_ci{
700f08c3bdfSopenharmony_ci	fent_t *fep;
701f08c3bdfSopenharmony_ci	int i;
702f08c3bdfSopenharmony_ci
703f08c3bdfSopenharmony_ci	i = dcache[dirid % NDCACHE];
704f08c3bdfSopenharmony_ci	if (i >= 0 && (fep = &flist[FT_DIR].fents[i])->id == dirid)
705f08c3bdfSopenharmony_ci		return fep;
706f08c3bdfSopenharmony_ci	return NULL;
707f08c3bdfSopenharmony_ci}
708f08c3bdfSopenharmony_ci
709f08c3bdfSopenharmony_civoid dcache_purge(int dirid)
710f08c3bdfSopenharmony_ci{
711f08c3bdfSopenharmony_ci	int *dcp;
712f08c3bdfSopenharmony_ci
713f08c3bdfSopenharmony_ci	dcp = &dcache[dirid % NDCACHE];
714f08c3bdfSopenharmony_ci	if (*dcp >= 0 && flist[FT_DIR].fents[*dcp].id == dirid)
715f08c3bdfSopenharmony_ci		*dcp = -1;
716f08c3bdfSopenharmony_ci}
717f08c3bdfSopenharmony_ci
718f08c3bdfSopenharmony_civoid del_from_flist(int ft, int slot)
719f08c3bdfSopenharmony_ci{
720f08c3bdfSopenharmony_ci	flist_t *ftp;
721f08c3bdfSopenharmony_ci
722f08c3bdfSopenharmony_ci	ftp = &flist[ft];
723f08c3bdfSopenharmony_ci	if (ft == FT_DIR)
724f08c3bdfSopenharmony_ci		dcache_purge(ftp->fents[slot].id);
725f08c3bdfSopenharmony_ci	if (slot != ftp->nfiles - 1) {
726f08c3bdfSopenharmony_ci		if (ft == FT_DIR)
727f08c3bdfSopenharmony_ci			dcache_purge(ftp->fents[ftp->nfiles - 1].id);
728f08c3bdfSopenharmony_ci		ftp->fents[slot] = ftp->fents[--ftp->nfiles];
729f08c3bdfSopenharmony_ci	} else
730f08c3bdfSopenharmony_ci		ftp->nfiles--;
731f08c3bdfSopenharmony_ci}
732f08c3bdfSopenharmony_ci
733f08c3bdfSopenharmony_cifent_t *dirid_to_fent(int dirid)
734f08c3bdfSopenharmony_ci{
735f08c3bdfSopenharmony_ci	fent_t *efep;
736f08c3bdfSopenharmony_ci	fent_t *fep;
737f08c3bdfSopenharmony_ci	flist_t *flp;
738f08c3bdfSopenharmony_ci
739f08c3bdfSopenharmony_ci	if ((fep = dcache_lookup(dirid)))
740f08c3bdfSopenharmony_ci		return fep;
741f08c3bdfSopenharmony_ci	flp = &flist[FT_DIR];
742f08c3bdfSopenharmony_ci	for (fep = flp->fents, efep = &fep[flp->nfiles]; fep < efep; fep++) {
743f08c3bdfSopenharmony_ci		if (fep->id == dirid) {
744f08c3bdfSopenharmony_ci			dcache_enter(dirid, fep - flp->fents);
745f08c3bdfSopenharmony_ci			return fep;
746f08c3bdfSopenharmony_ci		}
747f08c3bdfSopenharmony_ci	}
748f08c3bdfSopenharmony_ci	return NULL;
749f08c3bdfSopenharmony_ci}
750f08c3bdfSopenharmony_ci
751f08c3bdfSopenharmony_civoid doproc(void)
752f08c3bdfSopenharmony_ci{
753f08c3bdfSopenharmony_ci	struct stat64 statbuf;
754f08c3bdfSopenharmony_ci	char buf[10];
755f08c3bdfSopenharmony_ci	int opno;
756f08c3bdfSopenharmony_ci	int rval;
757f08c3bdfSopenharmony_ci	opdesc_t *p;
758f08c3bdfSopenharmony_ci
759f08c3bdfSopenharmony_ci	sprintf(buf, "p%x", procid);
760f08c3bdfSopenharmony_ci	(void)mkdir(buf, 0777);
761f08c3bdfSopenharmony_ci	if (chdir(buf) < 0 || stat64(".", &statbuf) < 0) {
762f08c3bdfSopenharmony_ci		perror(buf);
763f08c3bdfSopenharmony_ci		_exit(1);
764f08c3bdfSopenharmony_ci	}
765f08c3bdfSopenharmony_ci	top_ino = statbuf.st_ino;
766f08c3bdfSopenharmony_ci	homedir = getcwd(NULL, -1);
767f08c3bdfSopenharmony_ci	seed += procid;
768f08c3bdfSopenharmony_ci	srandom(seed);
769f08c3bdfSopenharmony_ci	if (namerand)
770f08c3bdfSopenharmony_ci		namerand = random();
771f08c3bdfSopenharmony_ci	for (opno = 0; opno < operations; opno++) {
772f08c3bdfSopenharmony_ci		p = &ops[freq_table[random() % freq_table_size]];
773f08c3bdfSopenharmony_ci		if ((unsigned long)p->func < 4096)
774f08c3bdfSopenharmony_ci			abort();
775f08c3bdfSopenharmony_ci
776f08c3bdfSopenharmony_ci		p->func(opno, random());
777f08c3bdfSopenharmony_ci		/*
778f08c3bdfSopenharmony_ci		 * test for forced shutdown by stat'ing the test
779f08c3bdfSopenharmony_ci		 * directory.  If this stat returns EIO, assume
780f08c3bdfSopenharmony_ci		 * the forced shutdown happened.
781f08c3bdfSopenharmony_ci		 */
782f08c3bdfSopenharmony_ci		if (errtag != 0 && opno % 100 == 0) {
783f08c3bdfSopenharmony_ci			rval = stat64(".", &statbuf);
784f08c3bdfSopenharmony_ci			if (rval == EIO) {
785f08c3bdfSopenharmony_ci				fprintf(stderr, "Detected EIO\n");
786f08c3bdfSopenharmony_ci				return;
787f08c3bdfSopenharmony_ci			}
788f08c3bdfSopenharmony_ci		}
789f08c3bdfSopenharmony_ci	}
790f08c3bdfSopenharmony_ci}
791f08c3bdfSopenharmony_ci
792f08c3bdfSopenharmony_civoid fent_to_name(pathname_t * name, flist_t * flp, fent_t * fep)
793f08c3bdfSopenharmony_ci{
794f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
795f08c3bdfSopenharmony_ci	int i;
796f08c3bdfSopenharmony_ci	fent_t *pfep;
797f08c3bdfSopenharmony_ci
798f08c3bdfSopenharmony_ci	if (fep == NULL)
799f08c3bdfSopenharmony_ci		return;
800f08c3bdfSopenharmony_ci	if (fep->parent != -1) {
801f08c3bdfSopenharmony_ci		pfep = dirid_to_fent(fep->parent);
802f08c3bdfSopenharmony_ci		fent_to_name(name, &flist[FT_DIR], pfep);
803f08c3bdfSopenharmony_ci		append_pathname(name, "/");
804f08c3bdfSopenharmony_ci	}
805f08c3bdfSopenharmony_ci	i = sprintf(buf, "%c%x", flp->tag, fep->id);
806f08c3bdfSopenharmony_ci	namerandpad(fep->id, buf, i);
807f08c3bdfSopenharmony_ci	append_pathname(name, buf);
808f08c3bdfSopenharmony_ci}
809f08c3bdfSopenharmony_ci
810f08c3bdfSopenharmony_civoid fix_parent(int oldid, int newid)
811f08c3bdfSopenharmony_ci{
812f08c3bdfSopenharmony_ci	fent_t *fep;
813f08c3bdfSopenharmony_ci	flist_t *flp;
814f08c3bdfSopenharmony_ci	int i;
815f08c3bdfSopenharmony_ci	int j;
816f08c3bdfSopenharmony_ci
817f08c3bdfSopenharmony_ci	for (i = 0, flp = flist; i < FT_nft; i++, flp++) {
818f08c3bdfSopenharmony_ci		for (j = 0, fep = flp->fents; j < flp->nfiles; j++, fep++) {
819f08c3bdfSopenharmony_ci			if (fep->parent == oldid)
820f08c3bdfSopenharmony_ci				fep->parent = newid;
821f08c3bdfSopenharmony_ci		}
822f08c3bdfSopenharmony_ci	}
823f08c3bdfSopenharmony_ci}
824f08c3bdfSopenharmony_ci
825f08c3bdfSopenharmony_civoid free_pathname(pathname_t * name)
826f08c3bdfSopenharmony_ci{
827f08c3bdfSopenharmony_ci	if (name->path) {
828f08c3bdfSopenharmony_ci		free(name->path);
829f08c3bdfSopenharmony_ci		name->path = NULL;
830f08c3bdfSopenharmony_ci		name->len = 0;
831f08c3bdfSopenharmony_ci	}
832f08c3bdfSopenharmony_ci}
833f08c3bdfSopenharmony_ci
834f08c3bdfSopenharmony_ciint generate_fname(fent_t * fep, int ft, pathname_t * name, int *idp, int *v)
835f08c3bdfSopenharmony_ci{
836f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
837f08c3bdfSopenharmony_ci	flist_t *flp;
838f08c3bdfSopenharmony_ci	int id;
839f08c3bdfSopenharmony_ci	int j;
840f08c3bdfSopenharmony_ci	int len;
841f08c3bdfSopenharmony_ci
842f08c3bdfSopenharmony_ci	flp = &flist[ft];
843f08c3bdfSopenharmony_ci	len = sprintf(buf, "%c%x", flp->tag, id = nameseq++);
844f08c3bdfSopenharmony_ci	namerandpad(id, buf, len);
845f08c3bdfSopenharmony_ci	if (fep) {
846f08c3bdfSopenharmony_ci		fent_to_name(name, &flist[FT_DIR], fep);
847f08c3bdfSopenharmony_ci		append_pathname(name, "/");
848f08c3bdfSopenharmony_ci	}
849f08c3bdfSopenharmony_ci	append_pathname(name, buf);
850f08c3bdfSopenharmony_ci	*idp = id;
851f08c3bdfSopenharmony_ci	*v = verbose;
852f08c3bdfSopenharmony_ci	for (j = 0; !*v && j < ilistlen; j++) {
853f08c3bdfSopenharmony_ci		if (ilist[j] == id) {
854f08c3bdfSopenharmony_ci			*v = 1;
855f08c3bdfSopenharmony_ci			break;
856f08c3bdfSopenharmony_ci		}
857f08c3bdfSopenharmony_ci	}
858f08c3bdfSopenharmony_ci	return 1;
859f08c3bdfSopenharmony_ci}
860f08c3bdfSopenharmony_ci
861f08c3bdfSopenharmony_ciint
862f08c3bdfSopenharmony_ciget_fname(int which, long r, pathname_t * name, flist_t ** flpp, fent_t ** fepp,
863f08c3bdfSopenharmony_ci	  int *v)
864f08c3bdfSopenharmony_ci{
865f08c3bdfSopenharmony_ci	int c;
866f08c3bdfSopenharmony_ci	fent_t *fep;
867f08c3bdfSopenharmony_ci	flist_t *flp;
868f08c3bdfSopenharmony_ci	int i;
869f08c3bdfSopenharmony_ci	int j;
870f08c3bdfSopenharmony_ci	int x;
871f08c3bdfSopenharmony_ci
872f08c3bdfSopenharmony_ci	for (i = 0, c = 0, flp = flist; i < FT_nft; i++, flp++) {
873f08c3bdfSopenharmony_ci		if (which & (1 << i))
874f08c3bdfSopenharmony_ci			c += flp->nfiles;
875f08c3bdfSopenharmony_ci	}
876f08c3bdfSopenharmony_ci	if (c == 0) {
877f08c3bdfSopenharmony_ci		if (flpp)
878f08c3bdfSopenharmony_ci			*flpp = NULL;
879f08c3bdfSopenharmony_ci		if (fepp)
880f08c3bdfSopenharmony_ci			*fepp = NULL;
881f08c3bdfSopenharmony_ci		*v = verbose;
882f08c3bdfSopenharmony_ci		return 0;
883f08c3bdfSopenharmony_ci	}
884f08c3bdfSopenharmony_ci	x = (int)(r % c);
885f08c3bdfSopenharmony_ci	for (i = 0, c = 0, flp = flist; i < FT_nft; i++, flp++) {
886f08c3bdfSopenharmony_ci		if (which & (1 << i)) {
887f08c3bdfSopenharmony_ci			if (x < c + flp->nfiles) {
888f08c3bdfSopenharmony_ci				fep = &flp->fents[x - c];
889f08c3bdfSopenharmony_ci				if (name)
890f08c3bdfSopenharmony_ci					fent_to_name(name, flp, fep);
891f08c3bdfSopenharmony_ci				if (flpp)
892f08c3bdfSopenharmony_ci					*flpp = flp;
893f08c3bdfSopenharmony_ci				if (fepp)
894f08c3bdfSopenharmony_ci					*fepp = fep;
895f08c3bdfSopenharmony_ci				*v = verbose;
896f08c3bdfSopenharmony_ci				for (j = 0; !*v && j < ilistlen; j++) {
897f08c3bdfSopenharmony_ci					if (ilist[j] == fep->id) {
898f08c3bdfSopenharmony_ci						*v = 1;
899f08c3bdfSopenharmony_ci						break;
900f08c3bdfSopenharmony_ci					}
901f08c3bdfSopenharmony_ci				}
902f08c3bdfSopenharmony_ci				return 1;
903f08c3bdfSopenharmony_ci			}
904f08c3bdfSopenharmony_ci			c += flp->nfiles;
905f08c3bdfSopenharmony_ci		}
906f08c3bdfSopenharmony_ci	}
907f08c3bdfSopenharmony_ci#ifdef DEBUG
908f08c3bdfSopenharmony_ci	fprintf(stderr, "fsstress: get_fname failure\n");
909f08c3bdfSopenharmony_ci	abort();
910f08c3bdfSopenharmony_ci#endif
911f08c3bdfSopenharmony_ci	return -1;
912f08c3bdfSopenharmony_ci
913f08c3bdfSopenharmony_ci}
914f08c3bdfSopenharmony_ci
915f08c3bdfSopenharmony_civoid init_pathname(pathname_t * name)
916f08c3bdfSopenharmony_ci{
917f08c3bdfSopenharmony_ci	name->len = 0;
918f08c3bdfSopenharmony_ci	name->path = NULL;
919f08c3bdfSopenharmony_ci}
920f08c3bdfSopenharmony_ci
921f08c3bdfSopenharmony_ciint lchown_path(pathname_t * name, uid_t owner, gid_t group)
922f08c3bdfSopenharmony_ci{
923f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
924f08c3bdfSopenharmony_ci	pathname_t newname;
925f08c3bdfSopenharmony_ci	int rval;
926f08c3bdfSopenharmony_ci
927f08c3bdfSopenharmony_ci	rval = lchown(name->path, owner, group);
928f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
929f08c3bdfSopenharmony_ci		return rval;
930f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
931f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
932f08c3bdfSopenharmony_ci		rval = lchown_path(&newname, owner, group);
933f08c3bdfSopenharmony_ci		chdir("..");
934f08c3bdfSopenharmony_ci	}
935f08c3bdfSopenharmony_ci	free_pathname(&newname);
936f08c3bdfSopenharmony_ci	return rval;
937f08c3bdfSopenharmony_ci}
938f08c3bdfSopenharmony_ci
939f08c3bdfSopenharmony_ciint link_path(pathname_t * name1, pathname_t * name2)
940f08c3bdfSopenharmony_ci{
941f08c3bdfSopenharmony_ci	char buf1[MAXNAMELEN];
942f08c3bdfSopenharmony_ci	char buf2[MAXNAMELEN];
943f08c3bdfSopenharmony_ci	int down1;
944f08c3bdfSopenharmony_ci	pathname_t newname1;
945f08c3bdfSopenharmony_ci	pathname_t newname2;
946f08c3bdfSopenharmony_ci	int rval;
947f08c3bdfSopenharmony_ci
948f08c3bdfSopenharmony_ci	rval = link(name1->path, name2->path);
949f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
950f08c3bdfSopenharmony_ci		return rval;
951f08c3bdfSopenharmony_ci	separate_pathname(name1, buf1, &newname1);
952f08c3bdfSopenharmony_ci	separate_pathname(name2, buf2, &newname2);
953f08c3bdfSopenharmony_ci	if (strcmp(buf1, buf2) == 0) {
954f08c3bdfSopenharmony_ci		if (chdir(buf1) == 0) {
955f08c3bdfSopenharmony_ci			rval = link_path(&newname1, &newname2);
956f08c3bdfSopenharmony_ci			chdir("..");
957f08c3bdfSopenharmony_ci		}
958f08c3bdfSopenharmony_ci	} else {
959f08c3bdfSopenharmony_ci		if (strcmp(buf1, "..") == 0)
960f08c3bdfSopenharmony_ci			down1 = 0;
961f08c3bdfSopenharmony_ci		else if (strcmp(buf2, "..") == 0)
962f08c3bdfSopenharmony_ci			down1 = 1;
963f08c3bdfSopenharmony_ci		else if (strlen(buf1) == 0)
964f08c3bdfSopenharmony_ci			down1 = 0;
965f08c3bdfSopenharmony_ci		else if (strlen(buf2) == 0)
966f08c3bdfSopenharmony_ci			down1 = 1;
967f08c3bdfSopenharmony_ci		else
968f08c3bdfSopenharmony_ci			down1 = MAX(newname1.len, 3 + name2->len) <=
969f08c3bdfSopenharmony_ci			    MAX(3 + name1->len, newname2.len);
970f08c3bdfSopenharmony_ci		if (down1) {
971f08c3bdfSopenharmony_ci			free_pathname(&newname2);
972f08c3bdfSopenharmony_ci			append_pathname(&newname2, "../");
973f08c3bdfSopenharmony_ci			append_pathname(&newname2, name2->path);
974f08c3bdfSopenharmony_ci			if (chdir(buf1) == 0) {
975f08c3bdfSopenharmony_ci				rval = link_path(&newname1, &newname2);
976f08c3bdfSopenharmony_ci				chdir("..");
977f08c3bdfSopenharmony_ci			}
978f08c3bdfSopenharmony_ci		} else {
979f08c3bdfSopenharmony_ci			free_pathname(&newname1);
980f08c3bdfSopenharmony_ci			append_pathname(&newname1, "../");
981f08c3bdfSopenharmony_ci			append_pathname(&newname1, name1->path);
982f08c3bdfSopenharmony_ci			if (chdir(buf2) == 0) {
983f08c3bdfSopenharmony_ci				rval = link_path(&newname1, &newname2);
984f08c3bdfSopenharmony_ci				chdir("..");
985f08c3bdfSopenharmony_ci			}
986f08c3bdfSopenharmony_ci		}
987f08c3bdfSopenharmony_ci	}
988f08c3bdfSopenharmony_ci	free_pathname(&newname1);
989f08c3bdfSopenharmony_ci	free_pathname(&newname2);
990f08c3bdfSopenharmony_ci	return rval;
991f08c3bdfSopenharmony_ci}
992f08c3bdfSopenharmony_ci
993f08c3bdfSopenharmony_ciint lstat64_path(pathname_t * name, struct stat64 *sbuf)
994f08c3bdfSopenharmony_ci{
995f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
996f08c3bdfSopenharmony_ci	pathname_t newname;
997f08c3bdfSopenharmony_ci	int rval;
998f08c3bdfSopenharmony_ci
999f08c3bdfSopenharmony_ci	rval = lstat64(name->path, sbuf);
1000f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1001f08c3bdfSopenharmony_ci		return rval;
1002f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1003f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1004f08c3bdfSopenharmony_ci		rval = lstat64_path(&newname, sbuf);
1005f08c3bdfSopenharmony_ci		chdir("..");
1006f08c3bdfSopenharmony_ci	}
1007f08c3bdfSopenharmony_ci	free_pathname(&newname);
1008f08c3bdfSopenharmony_ci	return rval;
1009f08c3bdfSopenharmony_ci}
1010f08c3bdfSopenharmony_ci
1011f08c3bdfSopenharmony_civoid make_freq_table(void)
1012f08c3bdfSopenharmony_ci{
1013f08c3bdfSopenharmony_ci	int f;
1014f08c3bdfSopenharmony_ci	int i;
1015f08c3bdfSopenharmony_ci	opdesc_t *p;
1016f08c3bdfSopenharmony_ci
1017f08c3bdfSopenharmony_ci	for (p = ops, f = 0; p < ops_end; p++)
1018f08c3bdfSopenharmony_ci		f += p->freq;
1019f08c3bdfSopenharmony_ci	freq_table = malloc(f * sizeof(*freq_table));
1020f08c3bdfSopenharmony_ci	freq_table_size = f;
1021f08c3bdfSopenharmony_ci	for (p = ops, i = 0; p < ops_end; p++) {
1022f08c3bdfSopenharmony_ci		for (f = 0; f < p->freq; f++, i++)
1023f08c3bdfSopenharmony_ci			freq_table[i] = p->op;
1024f08c3bdfSopenharmony_ci	}
1025f08c3bdfSopenharmony_ci}
1026f08c3bdfSopenharmony_ci
1027f08c3bdfSopenharmony_ciint mkdir_path(pathname_t * name, mode_t mode)
1028f08c3bdfSopenharmony_ci{
1029f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1030f08c3bdfSopenharmony_ci	pathname_t newname;
1031f08c3bdfSopenharmony_ci	int rval;
1032f08c3bdfSopenharmony_ci
1033f08c3bdfSopenharmony_ci	rval = mkdir(name->path, mode);
1034f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1035f08c3bdfSopenharmony_ci		return rval;
1036f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1037f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1038f08c3bdfSopenharmony_ci		rval = mkdir_path(&newname, mode);
1039f08c3bdfSopenharmony_ci		chdir("..");
1040f08c3bdfSopenharmony_ci	}
1041f08c3bdfSopenharmony_ci	free_pathname(&newname);
1042f08c3bdfSopenharmony_ci	return rval;
1043f08c3bdfSopenharmony_ci}
1044f08c3bdfSopenharmony_ci
1045f08c3bdfSopenharmony_ciint mknod_path(pathname_t * name, mode_t mode, dev_t dev)
1046f08c3bdfSopenharmony_ci{
1047f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1048f08c3bdfSopenharmony_ci	pathname_t newname;
1049f08c3bdfSopenharmony_ci	int rval;
1050f08c3bdfSopenharmony_ci
1051f08c3bdfSopenharmony_ci	rval = mknod(name->path, mode, dev);
1052f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1053f08c3bdfSopenharmony_ci		return rval;
1054f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1055f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1056f08c3bdfSopenharmony_ci		rval = mknod_path(&newname, mode, dev);
1057f08c3bdfSopenharmony_ci		chdir("..");
1058f08c3bdfSopenharmony_ci	}
1059f08c3bdfSopenharmony_ci	free_pathname(&newname);
1060f08c3bdfSopenharmony_ci	return rval;
1061f08c3bdfSopenharmony_ci}
1062f08c3bdfSopenharmony_ci
1063f08c3bdfSopenharmony_civoid namerandpad(int id, char *buf, int i)
1064f08c3bdfSopenharmony_ci{
1065f08c3bdfSopenharmony_ci	int bucket;
1066f08c3bdfSopenharmony_ci	static int buckets[] = { 2, 4, 8, 16, 32, 64, 128, MAXNAMELEN - 1 };
1067f08c3bdfSopenharmony_ci	int padlen;
1068f08c3bdfSopenharmony_ci	int padmod;
1069f08c3bdfSopenharmony_ci
1070f08c3bdfSopenharmony_ci	if (namerand == 0)
1071f08c3bdfSopenharmony_ci		return;
1072f08c3bdfSopenharmony_ci	bucket = (id ^ namerand) % ARRAY_SIZE(buckets);
1073f08c3bdfSopenharmony_ci	padmod = buckets[bucket] + 1 - i;
1074f08c3bdfSopenharmony_ci	if (padmod <= 0)
1075f08c3bdfSopenharmony_ci		return;
1076f08c3bdfSopenharmony_ci	padlen = (id ^ namerand) % padmod;
1077f08c3bdfSopenharmony_ci	if (padlen) {
1078f08c3bdfSopenharmony_ci		memset(&buf[i], 'X', padlen);
1079f08c3bdfSopenharmony_ci		buf[i + padlen] = '\0';
1080f08c3bdfSopenharmony_ci	}
1081f08c3bdfSopenharmony_ci}
1082f08c3bdfSopenharmony_ci
1083f08c3bdfSopenharmony_ciint open_path(pathname_t * name, int oflag)
1084f08c3bdfSopenharmony_ci{
1085f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1086f08c3bdfSopenharmony_ci	pathname_t newname;
1087f08c3bdfSopenharmony_ci	int rval;
1088f08c3bdfSopenharmony_ci
1089f08c3bdfSopenharmony_ci	rval = open(name->path, oflag);
1090f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1091f08c3bdfSopenharmony_ci		return rval;
1092f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1093f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1094f08c3bdfSopenharmony_ci		rval = open_path(&newname, oflag);
1095f08c3bdfSopenharmony_ci		chdir("..");
1096f08c3bdfSopenharmony_ci	}
1097f08c3bdfSopenharmony_ci	free_pathname(&newname);
1098f08c3bdfSopenharmony_ci	return rval;
1099f08c3bdfSopenharmony_ci}
1100f08c3bdfSopenharmony_ci
1101f08c3bdfSopenharmony_ciDIR *opendir_path(pathname_t * name)
1102f08c3bdfSopenharmony_ci{
1103f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1104f08c3bdfSopenharmony_ci	pathname_t newname;
1105f08c3bdfSopenharmony_ci	DIR *rval;
1106f08c3bdfSopenharmony_ci
1107f08c3bdfSopenharmony_ci	rval = opendir(name->path);
1108f08c3bdfSopenharmony_ci	if (rval || errno != ENAMETOOLONG)
1109f08c3bdfSopenharmony_ci		return rval;
1110f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1111f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1112f08c3bdfSopenharmony_ci		rval = opendir_path(&newname);
1113f08c3bdfSopenharmony_ci		chdir("..");
1114f08c3bdfSopenharmony_ci	}
1115f08c3bdfSopenharmony_ci	free_pathname(&newname);
1116f08c3bdfSopenharmony_ci	return rval;
1117f08c3bdfSopenharmony_ci}
1118f08c3bdfSopenharmony_ci
1119f08c3bdfSopenharmony_civoid process_freq(char *arg)
1120f08c3bdfSopenharmony_ci{
1121f08c3bdfSopenharmony_ci	opdesc_t *p;
1122f08c3bdfSopenharmony_ci	char *s;
1123f08c3bdfSopenharmony_ci
1124f08c3bdfSopenharmony_ci	s = strchr(arg, '=');
1125f08c3bdfSopenharmony_ci	if (s == NULL) {
1126f08c3bdfSopenharmony_ci		fprintf(stderr, "bad argument '%s'\n", arg);
1127f08c3bdfSopenharmony_ci		exit(1);
1128f08c3bdfSopenharmony_ci	}
1129f08c3bdfSopenharmony_ci	*s++ = '\0';
1130f08c3bdfSopenharmony_ci	for (p = ops; p < ops_end; p++) {
1131f08c3bdfSopenharmony_ci		if (strcmp(arg, p->name) == 0) {
1132f08c3bdfSopenharmony_ci			p->freq = atoi(s);
1133f08c3bdfSopenharmony_ci			return;
1134f08c3bdfSopenharmony_ci		}
1135f08c3bdfSopenharmony_ci	}
1136f08c3bdfSopenharmony_ci	fprintf(stderr, "can't find op type %s for -f\n", arg);
1137f08c3bdfSopenharmony_ci	exit(1);
1138f08c3bdfSopenharmony_ci}
1139f08c3bdfSopenharmony_ci
1140f08c3bdfSopenharmony_ciint readlink_path(pathname_t * name, char *lbuf, size_t lbufsiz)
1141f08c3bdfSopenharmony_ci{
1142f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1143f08c3bdfSopenharmony_ci	pathname_t newname;
1144f08c3bdfSopenharmony_ci	int rval;
1145f08c3bdfSopenharmony_ci
1146f08c3bdfSopenharmony_ci	rval = readlink(name->path, lbuf, lbufsiz-1);
1147f08c3bdfSopenharmony_ci	if (rval >= 0)
1148f08c3bdfSopenharmony_ci		lbuf[rval] = '\0';
1149f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1150f08c3bdfSopenharmony_ci		return rval;
1151f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1152f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1153f08c3bdfSopenharmony_ci		rval = readlink_path(&newname, lbuf, lbufsiz);
1154f08c3bdfSopenharmony_ci		chdir("..");
1155f08c3bdfSopenharmony_ci	}
1156f08c3bdfSopenharmony_ci	free_pathname(&newname);
1157f08c3bdfSopenharmony_ci	return rval;
1158f08c3bdfSopenharmony_ci}
1159f08c3bdfSopenharmony_ci
1160f08c3bdfSopenharmony_ciint rename_path(pathname_t * name1, pathname_t * name2)
1161f08c3bdfSopenharmony_ci{
1162f08c3bdfSopenharmony_ci	char buf1[MAXNAMELEN];
1163f08c3bdfSopenharmony_ci	char buf2[MAXNAMELEN];
1164f08c3bdfSopenharmony_ci	int down1;
1165f08c3bdfSopenharmony_ci	pathname_t newname1;
1166f08c3bdfSopenharmony_ci	pathname_t newname2;
1167f08c3bdfSopenharmony_ci	int rval;
1168f08c3bdfSopenharmony_ci
1169f08c3bdfSopenharmony_ci	rval = rename(name1->path, name2->path);
1170f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1171f08c3bdfSopenharmony_ci		return rval;
1172f08c3bdfSopenharmony_ci	separate_pathname(name1, buf1, &newname1);
1173f08c3bdfSopenharmony_ci	separate_pathname(name2, buf2, &newname2);
1174f08c3bdfSopenharmony_ci	if (strcmp(buf1, buf2) == 0) {
1175f08c3bdfSopenharmony_ci		if (chdir(buf1) == 0) {
1176f08c3bdfSopenharmony_ci			rval = rename_path(&newname1, &newname2);
1177f08c3bdfSopenharmony_ci			chdir("..");
1178f08c3bdfSopenharmony_ci		}
1179f08c3bdfSopenharmony_ci	} else {
1180f08c3bdfSopenharmony_ci		if (strcmp(buf1, "..") == 0)
1181f08c3bdfSopenharmony_ci			down1 = 0;
1182f08c3bdfSopenharmony_ci		else if (strcmp(buf2, "..") == 0)
1183f08c3bdfSopenharmony_ci			down1 = 1;
1184f08c3bdfSopenharmony_ci		else if (strlen(buf1) == 0)
1185f08c3bdfSopenharmony_ci			down1 = 0;
1186f08c3bdfSopenharmony_ci		else if (strlen(buf2) == 0)
1187f08c3bdfSopenharmony_ci			down1 = 1;
1188f08c3bdfSopenharmony_ci		else
1189f08c3bdfSopenharmony_ci			down1 = MAX(newname1.len, 3 + name2->len) <=
1190f08c3bdfSopenharmony_ci			    MAX(3 + name1->len, newname2.len);
1191f08c3bdfSopenharmony_ci		if (down1) {
1192f08c3bdfSopenharmony_ci			free_pathname(&newname2);
1193f08c3bdfSopenharmony_ci			append_pathname(&newname2, "../");
1194f08c3bdfSopenharmony_ci			append_pathname(&newname2, name2->path);
1195f08c3bdfSopenharmony_ci			if (chdir(buf1) == 0) {
1196f08c3bdfSopenharmony_ci				rval = rename_path(&newname1, &newname2);
1197f08c3bdfSopenharmony_ci				chdir("..");
1198f08c3bdfSopenharmony_ci			}
1199f08c3bdfSopenharmony_ci		} else {
1200f08c3bdfSopenharmony_ci			free_pathname(&newname1);
1201f08c3bdfSopenharmony_ci			append_pathname(&newname1, "../");
1202f08c3bdfSopenharmony_ci			append_pathname(&newname1, name1->path);
1203f08c3bdfSopenharmony_ci			if (chdir(buf2) == 0) {
1204f08c3bdfSopenharmony_ci				rval = rename_path(&newname1, &newname2);
1205f08c3bdfSopenharmony_ci				chdir("..");
1206f08c3bdfSopenharmony_ci			}
1207f08c3bdfSopenharmony_ci		}
1208f08c3bdfSopenharmony_ci	}
1209f08c3bdfSopenharmony_ci	free_pathname(&newname1);
1210f08c3bdfSopenharmony_ci	free_pathname(&newname2);
1211f08c3bdfSopenharmony_ci	return rval;
1212f08c3bdfSopenharmony_ci}
1213f08c3bdfSopenharmony_ci
1214f08c3bdfSopenharmony_ciint rmdir_path(pathname_t * name)
1215f08c3bdfSopenharmony_ci{
1216f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1217f08c3bdfSopenharmony_ci	pathname_t newname;
1218f08c3bdfSopenharmony_ci	int rval;
1219f08c3bdfSopenharmony_ci
1220f08c3bdfSopenharmony_ci	rval = rmdir(name->path);
1221f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1222f08c3bdfSopenharmony_ci		return rval;
1223f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1224f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1225f08c3bdfSopenharmony_ci		rval = rmdir_path(&newname);
1226f08c3bdfSopenharmony_ci		chdir("..");
1227f08c3bdfSopenharmony_ci	}
1228f08c3bdfSopenharmony_ci	free_pathname(&newname);
1229f08c3bdfSopenharmony_ci	return rval;
1230f08c3bdfSopenharmony_ci}
1231f08c3bdfSopenharmony_ci
1232f08c3bdfSopenharmony_civoid separate_pathname(pathname_t * name, char *buf, pathname_t * newname)
1233f08c3bdfSopenharmony_ci{
1234f08c3bdfSopenharmony_ci	char *slash;
1235f08c3bdfSopenharmony_ci
1236f08c3bdfSopenharmony_ci	init_pathname(newname);
1237f08c3bdfSopenharmony_ci	slash = strchr(name->path, '/');
1238f08c3bdfSopenharmony_ci	if (slash == NULL) {
1239f08c3bdfSopenharmony_ci		buf[0] = '\0';
1240f08c3bdfSopenharmony_ci		return;
1241f08c3bdfSopenharmony_ci	}
1242f08c3bdfSopenharmony_ci	*slash = '\0';
1243f08c3bdfSopenharmony_ci	strcpy(buf, name->path);
1244f08c3bdfSopenharmony_ci	*slash = '/';
1245f08c3bdfSopenharmony_ci	append_pathname(newname, slash + 1);
1246f08c3bdfSopenharmony_ci}
1247f08c3bdfSopenharmony_ci
1248f08c3bdfSopenharmony_ci#define WIDTH 80
1249f08c3bdfSopenharmony_ci
1250f08c3bdfSopenharmony_civoid show_ops(int flag, char *lead_str)
1251f08c3bdfSopenharmony_ci{
1252f08c3bdfSopenharmony_ci	opdesc_t *p;
1253f08c3bdfSopenharmony_ci
1254f08c3bdfSopenharmony_ci	if (flag < 0) {
1255f08c3bdfSopenharmony_ci		/* print in list form */
1256f08c3bdfSopenharmony_ci		int x = WIDTH;
1257f08c3bdfSopenharmony_ci
1258f08c3bdfSopenharmony_ci		for (p = ops; p < ops_end; p++) {
1259f08c3bdfSopenharmony_ci			if (lead_str != NULL
1260f08c3bdfSopenharmony_ci			    && x + strlen(p->name) >= WIDTH - 5)
1261f08c3bdfSopenharmony_ci				x = printf("%s%s", (p == ops) ? "" : "\n",
1262f08c3bdfSopenharmony_ci					   lead_str);
1263f08c3bdfSopenharmony_ci			x += printf("%s ", p->name);
1264f08c3bdfSopenharmony_ci		}
1265f08c3bdfSopenharmony_ci		printf("\n");
1266f08c3bdfSopenharmony_ci	} else {
1267f08c3bdfSopenharmony_ci		int f;
1268f08c3bdfSopenharmony_ci		for (f = 0, p = ops; p < ops_end; p++)
1269f08c3bdfSopenharmony_ci			f += p->freq;
1270f08c3bdfSopenharmony_ci
1271f08c3bdfSopenharmony_ci		if (f == 0)
1272f08c3bdfSopenharmony_ci			flag = 1;
1273f08c3bdfSopenharmony_ci
1274f08c3bdfSopenharmony_ci		for (p = ops; p < ops_end; p++) {
1275f08c3bdfSopenharmony_ci			if (flag != 0 || p->freq > 0) {
1276f08c3bdfSopenharmony_ci				if (lead_str != NULL)
1277f08c3bdfSopenharmony_ci					printf("%s", lead_str);
1278f08c3bdfSopenharmony_ci				printf("%20s %d/%d %s\n",
1279f08c3bdfSopenharmony_ci				       p->name, p->freq, f,
1280f08c3bdfSopenharmony_ci				       (p->iswrite == 0) ? " " : "write op");
1281f08c3bdfSopenharmony_ci			}
1282f08c3bdfSopenharmony_ci		}
1283f08c3bdfSopenharmony_ci	}
1284f08c3bdfSopenharmony_ci}
1285f08c3bdfSopenharmony_ci
1286f08c3bdfSopenharmony_ciint stat64_path(pathname_t * name, struct stat64 *sbuf)
1287f08c3bdfSopenharmony_ci{
1288f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1289f08c3bdfSopenharmony_ci	pathname_t newname;
1290f08c3bdfSopenharmony_ci	int rval;
1291f08c3bdfSopenharmony_ci
1292f08c3bdfSopenharmony_ci	rval = stat64(name->path, sbuf);
1293f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1294f08c3bdfSopenharmony_ci		return rval;
1295f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1296f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1297f08c3bdfSopenharmony_ci		rval = stat64_path(&newname, sbuf);
1298f08c3bdfSopenharmony_ci		chdir("..");
1299f08c3bdfSopenharmony_ci	}
1300f08c3bdfSopenharmony_ci	free_pathname(&newname);
1301f08c3bdfSopenharmony_ci	return rval;
1302f08c3bdfSopenharmony_ci}
1303f08c3bdfSopenharmony_ci
1304f08c3bdfSopenharmony_ciint symlink_path(const char *name1, pathname_t * name)
1305f08c3bdfSopenharmony_ci{
1306f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1307f08c3bdfSopenharmony_ci	pathname_t newname;
1308f08c3bdfSopenharmony_ci	int rval;
1309f08c3bdfSopenharmony_ci
1310f08c3bdfSopenharmony_ci	if (!strcmp(name1, name->path)) {
1311f08c3bdfSopenharmony_ci		printf("yikes! %s %s\n", name1, name->path);
1312f08c3bdfSopenharmony_ci		return 0;
1313f08c3bdfSopenharmony_ci	}
1314f08c3bdfSopenharmony_ci
1315f08c3bdfSopenharmony_ci	rval = symlink(name1, name->path);
1316f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1317f08c3bdfSopenharmony_ci		return rval;
1318f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1319f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1320f08c3bdfSopenharmony_ci		rval = symlink_path(name1, &newname);
1321f08c3bdfSopenharmony_ci		chdir("..");
1322f08c3bdfSopenharmony_ci	}
1323f08c3bdfSopenharmony_ci	free_pathname(&newname);
1324f08c3bdfSopenharmony_ci	return rval;
1325f08c3bdfSopenharmony_ci}
1326f08c3bdfSopenharmony_ci
1327f08c3bdfSopenharmony_ciint truncate64_path(pathname_t * name, off64_t length)
1328f08c3bdfSopenharmony_ci{
1329f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1330f08c3bdfSopenharmony_ci	pathname_t newname;
1331f08c3bdfSopenharmony_ci	int rval;
1332f08c3bdfSopenharmony_ci
1333f08c3bdfSopenharmony_ci	rval = truncate64(name->path, length);
1334f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1335f08c3bdfSopenharmony_ci		return rval;
1336f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1337f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1338f08c3bdfSopenharmony_ci		rval = truncate64_path(&newname, length);
1339f08c3bdfSopenharmony_ci		chdir("..");
1340f08c3bdfSopenharmony_ci	}
1341f08c3bdfSopenharmony_ci	free_pathname(&newname);
1342f08c3bdfSopenharmony_ci	return rval;
1343f08c3bdfSopenharmony_ci}
1344f08c3bdfSopenharmony_ci
1345f08c3bdfSopenharmony_ciint unlink_path(pathname_t * name)
1346f08c3bdfSopenharmony_ci{
1347f08c3bdfSopenharmony_ci	char buf[MAXNAMELEN];
1348f08c3bdfSopenharmony_ci	pathname_t newname;
1349f08c3bdfSopenharmony_ci	int rval;
1350f08c3bdfSopenharmony_ci
1351f08c3bdfSopenharmony_ci	rval = unlink(name->path);
1352f08c3bdfSopenharmony_ci	if (rval >= 0 || errno != ENAMETOOLONG)
1353f08c3bdfSopenharmony_ci		return rval;
1354f08c3bdfSopenharmony_ci	separate_pathname(name, buf, &newname);
1355f08c3bdfSopenharmony_ci	if (chdir(buf) == 0) {
1356f08c3bdfSopenharmony_ci		rval = unlink_path(&newname);
1357f08c3bdfSopenharmony_ci		chdir("..");
1358f08c3bdfSopenharmony_ci	}
1359f08c3bdfSopenharmony_ci	free_pathname(&newname);
1360f08c3bdfSopenharmony_ci	return rval;
1361f08c3bdfSopenharmony_ci}
1362f08c3bdfSopenharmony_ci
1363f08c3bdfSopenharmony_civoid usage(void)
1364f08c3bdfSopenharmony_ci{
1365f08c3bdfSopenharmony_ci	printf("Usage: %s -H   or\n", myprog);
1366f08c3bdfSopenharmony_ci	printf
1367f08c3bdfSopenharmony_ci	    ("       %s [-c][-d dir][-e errtg][-f op_name=freq][-l loops][-n nops]\n",
1368f08c3bdfSopenharmony_ci	     myprog);
1369f08c3bdfSopenharmony_ci	printf("          [-p nproc][-r len][-s seed][-v][-w][-z][-S]\n");
1370f08c3bdfSopenharmony_ci	printf("where\n");
1371f08c3bdfSopenharmony_ci	printf
1372f08c3bdfSopenharmony_ci	    ("   -c               specifies not to remove files(cleanup) after execution\n");
1373f08c3bdfSopenharmony_ci	printf
1374f08c3bdfSopenharmony_ci	    ("   -d dir           specifies the base directory for operations\n");
1375f08c3bdfSopenharmony_ci	printf("   -e errtg         specifies error injection stuff\n");
1376f08c3bdfSopenharmony_ci	printf
1377f08c3bdfSopenharmony_ci	    ("   -f op_name=freq  changes the frequency of option name to freq\n");
1378f08c3bdfSopenharmony_ci	printf("                    the valid operation names are:\n");
1379f08c3bdfSopenharmony_ci	show_ops(-1, "                        ");
1380f08c3bdfSopenharmony_ci	printf
1381f08c3bdfSopenharmony_ci	    ("   -l loops         specifies the no. of times the testrun should loop.\n");
1382f08c3bdfSopenharmony_ci	printf("                     *use 0 for infinite (default 1)\n");
1383f08c3bdfSopenharmony_ci	printf
1384f08c3bdfSopenharmony_ci	    ("   -n nops          specifies the no. of operations per process (default 1)\n");
1385f08c3bdfSopenharmony_ci	printf
1386f08c3bdfSopenharmony_ci	    ("   -p nproc         specifies the no. of processes (default 1)\n");
1387f08c3bdfSopenharmony_ci	printf("   -r               specifies random name padding\n");
1388f08c3bdfSopenharmony_ci	printf
1389f08c3bdfSopenharmony_ci	    ("   -s seed          specifies the seed for the random generator (default random)\n");
1390f08c3bdfSopenharmony_ci	printf("   -v               specifies verbose mode\n");
1391f08c3bdfSopenharmony_ci	printf
1392f08c3bdfSopenharmony_ci	    ("   -w               zeros frequencies of non-write operations\n");
1393f08c3bdfSopenharmony_ci	printf("   -z               zeros frequencies of all operations\n");
1394f08c3bdfSopenharmony_ci	printf
1395f08c3bdfSopenharmony_ci	    ("   -S               prints the table of operations (omitting zero frequency)\n");
1396f08c3bdfSopenharmony_ci	printf("   -H               prints usage and exits\n");
1397f08c3bdfSopenharmony_ci	printf
1398f08c3bdfSopenharmony_ci	    ("   -X               don't do anything XFS specific (default with -DNO_XFS)\n");
1399f08c3bdfSopenharmony_ci}
1400f08c3bdfSopenharmony_ci
1401f08c3bdfSopenharmony_civoid write_freq(void)
1402f08c3bdfSopenharmony_ci{
1403f08c3bdfSopenharmony_ci	opdesc_t *p;
1404f08c3bdfSopenharmony_ci
1405f08c3bdfSopenharmony_ci	for (p = ops; p < ops_end; p++) {
1406f08c3bdfSopenharmony_ci		if (!p->iswrite)
1407f08c3bdfSopenharmony_ci			p->freq = 0;
1408f08c3bdfSopenharmony_ci	}
1409f08c3bdfSopenharmony_ci}
1410f08c3bdfSopenharmony_ci
1411f08c3bdfSopenharmony_civoid zero_freq(void)
1412f08c3bdfSopenharmony_ci{
1413f08c3bdfSopenharmony_ci	opdesc_t *p;
1414f08c3bdfSopenharmony_ci
1415f08c3bdfSopenharmony_ci	for (p = ops; p < ops_end; p++)
1416f08c3bdfSopenharmony_ci		p->freq = 0;
1417f08c3bdfSopenharmony_ci}
1418f08c3bdfSopenharmony_ci
1419f08c3bdfSopenharmony_ci#ifndef NO_XFS
1420f08c3bdfSopenharmony_ci
1421f08c3bdfSopenharmony_civoid allocsp_f(int opno, long r)
1422f08c3bdfSopenharmony_ci{
1423f08c3bdfSopenharmony_ci	int e;
1424f08c3bdfSopenharmony_ci	pathname_t f;
1425f08c3bdfSopenharmony_ci	int fd;
1426f08c3bdfSopenharmony_ci	struct xfs_flock64 fl;
1427f08c3bdfSopenharmony_ci	__s64 lr;
1428f08c3bdfSopenharmony_ci	__s64 off;
1429f08c3bdfSopenharmony_ci	struct stat64 stb;
1430f08c3bdfSopenharmony_ci	int v;
1431f08c3bdfSopenharmony_ci
1432f08c3bdfSopenharmony_ci	init_pathname(&f);
1433f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
1434f08c3bdfSopenharmony_ci		if (v)
1435f08c3bdfSopenharmony_ci			printf("%d/%d: allocsp - no filename\n", procid, opno);
1436f08c3bdfSopenharmony_ci		free_pathname(&f);
1437f08c3bdfSopenharmony_ci		return;
1438f08c3bdfSopenharmony_ci	}
1439f08c3bdfSopenharmony_ci	fd = open_path(&f, O_RDWR);
1440f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
1441f08c3bdfSopenharmony_ci	check_cwd();
1442f08c3bdfSopenharmony_ci	if (fd < 0) {
1443f08c3bdfSopenharmony_ci		if (v)
1444f08c3bdfSopenharmony_ci			printf("%d/%d: allocsp - open %s failed %d\n",
1445f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
1446f08c3bdfSopenharmony_ci		free_pathname(&f);
1447f08c3bdfSopenharmony_ci		return;
1448f08c3bdfSopenharmony_ci	}
1449f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
1450f08c3bdfSopenharmony_ci		if (v)
1451f08c3bdfSopenharmony_ci			printf("%d/%d: allocsp - fstat64 %s failed %d\n",
1452f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
1453f08c3bdfSopenharmony_ci		free_pathname(&f);
1454f08c3bdfSopenharmony_ci		close(fd);
1455f08c3bdfSopenharmony_ci		return;
1456f08c3bdfSopenharmony_ci	}
1457f08c3bdfSopenharmony_ci	lr = ((__s64) random() << 32) + random();
1458f08c3bdfSopenharmony_ci	off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE);
1459f08c3bdfSopenharmony_ci	off %= maxfsize;
1460f08c3bdfSopenharmony_ci	memset(&fl, 0, sizeof(fl));
1461f08c3bdfSopenharmony_ci	fl.l_whence = SEEK_SET;
1462f08c3bdfSopenharmony_ci	fl.l_start = off;
1463f08c3bdfSopenharmony_ci	fl.l_len = 0;
1464f08c3bdfSopenharmony_ci	e = ioctl(fd, XFS_IOC_ALLOCSP64, &fl) < 0 ? errno : 0;
1465f08c3bdfSopenharmony_ci	if (v)
1466f08c3bdfSopenharmony_ci		printf("%d/%d: ioctl(XFS_IOC_ALLOCSP64) %s %lld 0 %d\n",
1467f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long)off, e);
1468f08c3bdfSopenharmony_ci	free_pathname(&f);
1469f08c3bdfSopenharmony_ci	close(fd);
1470f08c3bdfSopenharmony_ci}
1471f08c3bdfSopenharmony_ci
1472f08c3bdfSopenharmony_civoid attr_remove_f(int opno, long r)
1473f08c3bdfSopenharmony_ci{
1474f08c3bdfSopenharmony_ci	attrlist_ent_t *aep;
1475f08c3bdfSopenharmony_ci	attrlist_t *alist;
1476f08c3bdfSopenharmony_ci	char *aname;
1477f08c3bdfSopenharmony_ci	char buf[4096];
1478f08c3bdfSopenharmony_ci	attrlist_cursor_t cursor;
1479f08c3bdfSopenharmony_ci	int e;
1480f08c3bdfSopenharmony_ci	int ent;
1481f08c3bdfSopenharmony_ci	pathname_t f;
1482f08c3bdfSopenharmony_ci	int total;
1483f08c3bdfSopenharmony_ci	int v;
1484f08c3bdfSopenharmony_ci	int which;
1485f08c3bdfSopenharmony_ci
1486f08c3bdfSopenharmony_ci	init_pathname(&f);
1487f08c3bdfSopenharmony_ci	if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v))
1488f08c3bdfSopenharmony_ci		append_pathname(&f, ".");
1489f08c3bdfSopenharmony_ci	total = 0;
1490f08c3bdfSopenharmony_ci	memset(&cursor, 0x00, sizeof(cursor));
1491f08c3bdfSopenharmony_ci	do {
1492f08c3bdfSopenharmony_ci		e = attr_list_path(&f, buf, sizeof(buf), ATTR_DONTFOLLOW,
1493f08c3bdfSopenharmony_ci				   &cursor);
1494f08c3bdfSopenharmony_ci		check_cwd();
1495f08c3bdfSopenharmony_ci		if (e)
1496f08c3bdfSopenharmony_ci			break;
1497f08c3bdfSopenharmony_ci		alist = (attrlist_t *) buf;
1498f08c3bdfSopenharmony_ci		total += alist->al_count;
1499f08c3bdfSopenharmony_ci	} while (alist->al_more);
1500f08c3bdfSopenharmony_ci	if (total == 0) {
1501f08c3bdfSopenharmony_ci		if (v)
1502f08c3bdfSopenharmony_ci			printf("%d/%d: attr_remove - no attrs for %s\n",
1503f08c3bdfSopenharmony_ci			       procid, opno, f.path);
1504f08c3bdfSopenharmony_ci		free_pathname(&f);
1505f08c3bdfSopenharmony_ci		return;
1506f08c3bdfSopenharmony_ci	}
1507f08c3bdfSopenharmony_ci	which = (int)(random() % total);
1508f08c3bdfSopenharmony_ci	memset(&cursor, 0x00, sizeof(cursor));
1509f08c3bdfSopenharmony_ci	ent = 0;
1510f08c3bdfSopenharmony_ci	aname = NULL;
1511f08c3bdfSopenharmony_ci	do {
1512f08c3bdfSopenharmony_ci		e = attr_list_path(&f, buf, sizeof(buf), ATTR_DONTFOLLOW,
1513f08c3bdfSopenharmony_ci				   &cursor);
1514f08c3bdfSopenharmony_ci		check_cwd();
1515f08c3bdfSopenharmony_ci		if (e)
1516f08c3bdfSopenharmony_ci			break;
1517f08c3bdfSopenharmony_ci		alist = (attrlist_t *) buf;
1518f08c3bdfSopenharmony_ci		if (which < ent + alist->al_count) {
1519f08c3bdfSopenharmony_ci			aep = (attrlist_ent_t *)
1520f08c3bdfSopenharmony_ci			    & buf[alist->al_offset[which - ent]];
1521f08c3bdfSopenharmony_ci			aname = aep->a_name;
1522f08c3bdfSopenharmony_ci			break;
1523f08c3bdfSopenharmony_ci		}
1524f08c3bdfSopenharmony_ci		ent += alist->al_count;
1525f08c3bdfSopenharmony_ci	} while (alist->al_more);
1526f08c3bdfSopenharmony_ci	if (aname == NULL) {
1527f08c3bdfSopenharmony_ci		if (v)
1528f08c3bdfSopenharmony_ci			printf("%d/%d: attr_remove - name %d not found at %s\n",
1529f08c3bdfSopenharmony_ci			       procid, opno, which, f.path);
1530f08c3bdfSopenharmony_ci		free_pathname(&f);
1531f08c3bdfSopenharmony_ci		return;
1532f08c3bdfSopenharmony_ci	}
1533f08c3bdfSopenharmony_ci	e = attr_remove_path(&f, aname, ATTR_DONTFOLLOW) < 0 ? errno : 0;
1534f08c3bdfSopenharmony_ci	check_cwd();
1535f08c3bdfSopenharmony_ci	if (v)
1536f08c3bdfSopenharmony_ci		printf("%d/%d: attr_remove %s %s %d\n",
1537f08c3bdfSopenharmony_ci		       procid, opno, f.path, aname, e);
1538f08c3bdfSopenharmony_ci	free_pathname(&f);
1539f08c3bdfSopenharmony_ci}
1540f08c3bdfSopenharmony_ci
1541f08c3bdfSopenharmony_civoid attr_set_f(int opno, long r)
1542f08c3bdfSopenharmony_ci{
1543f08c3bdfSopenharmony_ci	char aname[10];
1544f08c3bdfSopenharmony_ci	char *aval;
1545f08c3bdfSopenharmony_ci	int e;
1546f08c3bdfSopenharmony_ci	pathname_t f;
1547f08c3bdfSopenharmony_ci	int len;
1548f08c3bdfSopenharmony_ci	static int lengths[] = { 10, 100, 1000, 10000 };
1549f08c3bdfSopenharmony_ci	int li;
1550f08c3bdfSopenharmony_ci	int v;
1551f08c3bdfSopenharmony_ci
1552f08c3bdfSopenharmony_ci	init_pathname(&f);
1553f08c3bdfSopenharmony_ci	if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v))
1554f08c3bdfSopenharmony_ci		append_pathname(&f, ".");
1555f08c3bdfSopenharmony_ci	sprintf(aname, "a%x", nameseq++);
1556f08c3bdfSopenharmony_ci	li = (int)(random() % ARRAY_SIZE(lengths));
1557f08c3bdfSopenharmony_ci	len = (int)(random() % lengths[li]);
1558f08c3bdfSopenharmony_ci	if (len == 0)
1559f08c3bdfSopenharmony_ci		len = 1;
1560f08c3bdfSopenharmony_ci	aval = malloc(len);
1561f08c3bdfSopenharmony_ci	memset(aval, nameseq & 0xff, len);
1562f08c3bdfSopenharmony_ci	e = attr_set_path(&f, aname, aval, len, ATTR_DONTFOLLOW) < 0 ?
1563f08c3bdfSopenharmony_ci	    errno : 0;
1564f08c3bdfSopenharmony_ci	check_cwd();
1565f08c3bdfSopenharmony_ci	free(aval);
1566f08c3bdfSopenharmony_ci	if (v)
1567f08c3bdfSopenharmony_ci		printf("%d/%d: attr_set %s %s %d\n", procid, opno, f.path,
1568f08c3bdfSopenharmony_ci		       aname, e);
1569f08c3bdfSopenharmony_ci	free_pathname(&f);
1570f08c3bdfSopenharmony_ci}
1571f08c3bdfSopenharmony_ci
1572f08c3bdfSopenharmony_civoid bulkstat_f(int opno, long r)
1573f08c3bdfSopenharmony_ci{
1574f08c3bdfSopenharmony_ci	__s32 count;
1575f08c3bdfSopenharmony_ci	int fd;
1576f08c3bdfSopenharmony_ci	__u64 last;
1577f08c3bdfSopenharmony_ci	__s32 nent;
1578f08c3bdfSopenharmony_ci	xfs_bstat_t *t;
1579f08c3bdfSopenharmony_ci	int64_t total;
1580f08c3bdfSopenharmony_ci	xfs_fsop_bulkreq_t bsr;
1581f08c3bdfSopenharmony_ci
1582f08c3bdfSopenharmony_ci	last = 0;
1583f08c3bdfSopenharmony_ci	nent = (r % 999) + 2;
1584f08c3bdfSopenharmony_ci	t = malloc(nent * sizeof(*t));
1585f08c3bdfSopenharmony_ci	fd = open(".", O_RDONLY);
1586f08c3bdfSopenharmony_ci	total = 0;
1587f08c3bdfSopenharmony_ci
1588f08c3bdfSopenharmony_ci	memset(&bsr, 0, sizeof(bsr));
1589f08c3bdfSopenharmony_ci	bsr.lastip = &last;
1590f08c3bdfSopenharmony_ci	bsr.icount = nent;
1591f08c3bdfSopenharmony_ci	bsr.ubuffer = t;
1592f08c3bdfSopenharmony_ci	bsr.ocount = &count;
1593f08c3bdfSopenharmony_ci
1594f08c3bdfSopenharmony_ci	while (ioctl(fd, XFS_IOC_FSBULKSTAT, &bsr) == 0 && count > 0)
1595f08c3bdfSopenharmony_ci		total += count;
1596f08c3bdfSopenharmony_ci	free(t);
1597f08c3bdfSopenharmony_ci	if (verbose)
1598f08c3bdfSopenharmony_ci		printf("%d/%d: bulkstat nent %d total %lld\n",
1599f08c3bdfSopenharmony_ci		       procid, opno, (int)nent, (long long)total);
1600f08c3bdfSopenharmony_ci	close(fd);
1601f08c3bdfSopenharmony_ci}
1602f08c3bdfSopenharmony_ci
1603f08c3bdfSopenharmony_civoid bulkstat1_f(int opno, long r)
1604f08c3bdfSopenharmony_ci{
1605f08c3bdfSopenharmony_ci	int e;
1606f08c3bdfSopenharmony_ci	pathname_t f;
1607f08c3bdfSopenharmony_ci	int fd;
1608f08c3bdfSopenharmony_ci	int good;
1609f08c3bdfSopenharmony_ci	__u64 ino;
1610f08c3bdfSopenharmony_ci	struct stat64 s;
1611f08c3bdfSopenharmony_ci	xfs_bstat_t t;
1612f08c3bdfSopenharmony_ci	int v;
1613f08c3bdfSopenharmony_ci	xfs_fsop_bulkreq_t bsr;
1614f08c3bdfSopenharmony_ci
1615f08c3bdfSopenharmony_ci	good = random() & 1;
1616f08c3bdfSopenharmony_ci	if (good) {
1617f08c3bdfSopenharmony_ci		/* use an inode we know exists */
1618f08c3bdfSopenharmony_ci		init_pathname(&f);
1619f08c3bdfSopenharmony_ci		if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v))
1620f08c3bdfSopenharmony_ci			append_pathname(&f, ".");
1621f08c3bdfSopenharmony_ci		ino = stat64_path(&f, &s) < 0 ? (ino64_t) r : s.st_ino;
1622f08c3bdfSopenharmony_ci		check_cwd();
1623f08c3bdfSopenharmony_ci		free_pathname(&f);
1624f08c3bdfSopenharmony_ci	} else {
1625f08c3bdfSopenharmony_ci		/*
1626f08c3bdfSopenharmony_ci		 * pick a random inode
1627f08c3bdfSopenharmony_ci		 *
1628f08c3bdfSopenharmony_ci		 * note this can generate kernel warning messages
1629f08c3bdfSopenharmony_ci		 * since bulkstat_one will read the disk block that
1630f08c3bdfSopenharmony_ci		 * would contain a given inode even if that disk
1631f08c3bdfSopenharmony_ci		 * block doesn't contain inodes.
1632f08c3bdfSopenharmony_ci		 *
1633f08c3bdfSopenharmony_ci		 * this is detected later, but not until after the
1634f08c3bdfSopenharmony_ci		 * warning is displayed.
1635f08c3bdfSopenharmony_ci		 *
1636f08c3bdfSopenharmony_ci		 * "XFS: device 0x825- bad inode magic/vsn daddr 0x0 #0"
1637f08c3bdfSopenharmony_ci		 *
1638f08c3bdfSopenharmony_ci		 */
1639f08c3bdfSopenharmony_ci		ino = (ino64_t) r;
1640f08c3bdfSopenharmony_ci		v = verbose;
1641f08c3bdfSopenharmony_ci	}
1642f08c3bdfSopenharmony_ci	fd = open(".", O_RDONLY);
1643f08c3bdfSopenharmony_ci
1644f08c3bdfSopenharmony_ci	memset(&bsr, 0, sizeof(bsr));
1645f08c3bdfSopenharmony_ci	bsr.lastip = &ino;
1646f08c3bdfSopenharmony_ci	bsr.icount = 1;
1647f08c3bdfSopenharmony_ci	bsr.ubuffer = &t;
1648f08c3bdfSopenharmony_ci	bsr.ocount = NULL;
1649f08c3bdfSopenharmony_ci
1650f08c3bdfSopenharmony_ci	e = ioctl(fd, XFS_IOC_FSBULKSTAT_SINGLE, &bsr) < 0 ? errno : 0;
1651f08c3bdfSopenharmony_ci	if (v)
1652f08c3bdfSopenharmony_ci		printf("%d/%d: bulkstat1 %s ino %lld %d\n",
1653f08c3bdfSopenharmony_ci		       procid, opno, good ? "real" : "random",
1654f08c3bdfSopenharmony_ci		       (long long)ino, e);
1655f08c3bdfSopenharmony_ci	close(fd);
1656f08c3bdfSopenharmony_ci}
1657f08c3bdfSopenharmony_ci
1658f08c3bdfSopenharmony_ci#endif
1659f08c3bdfSopenharmony_ci
1660f08c3bdfSopenharmony_civoid chown_f(int opno, long r)
1661f08c3bdfSopenharmony_ci{
1662f08c3bdfSopenharmony_ci	int e;
1663f08c3bdfSopenharmony_ci	pathname_t f;
1664f08c3bdfSopenharmony_ci	int nbits;
1665f08c3bdfSopenharmony_ci	uid_t u;
1666f08c3bdfSopenharmony_ci	int v;
1667f08c3bdfSopenharmony_ci
1668f08c3bdfSopenharmony_ci	init_pathname(&f);
1669f08c3bdfSopenharmony_ci	if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v))
1670f08c3bdfSopenharmony_ci		append_pathname(&f, ".");
1671f08c3bdfSopenharmony_ci	u = (uid_t) random();
1672f08c3bdfSopenharmony_ci	nbits = (int)(random() % 32);
1673f08c3bdfSopenharmony_ci	u &= (1 << nbits) - 1;
1674f08c3bdfSopenharmony_ci	e = lchown_path(&f, u, -1) < 0 ? errno : 0;
1675f08c3bdfSopenharmony_ci	check_cwd();
1676f08c3bdfSopenharmony_ci	if (v)
1677f08c3bdfSopenharmony_ci		printf("%d/%d: chown %s %d %d\n", procid, opno, f.path, u, e);
1678f08c3bdfSopenharmony_ci	free_pathname(&f);
1679f08c3bdfSopenharmony_ci}
1680f08c3bdfSopenharmony_ci
1681f08c3bdfSopenharmony_civoid creat_f(int opno, long r)
1682f08c3bdfSopenharmony_ci{
1683f08c3bdfSopenharmony_ci	int e;
1684f08c3bdfSopenharmony_ci	int e1;
1685f08c3bdfSopenharmony_ci	int extsize;
1686f08c3bdfSopenharmony_ci	pathname_t f;
1687f08c3bdfSopenharmony_ci	int fd;
1688f08c3bdfSopenharmony_ci	fent_t *fep;
1689f08c3bdfSopenharmony_ci	int id;
1690f08c3bdfSopenharmony_ci	int parid;
1691f08c3bdfSopenharmony_ci	int type;
1692f08c3bdfSopenharmony_ci	int v;
1693f08c3bdfSopenharmony_ci	int v1;
1694f08c3bdfSopenharmony_ci	int esz = 0;
1695f08c3bdfSopenharmony_ci
1696f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v1))
1697f08c3bdfSopenharmony_ci		parid = -1;
1698f08c3bdfSopenharmony_ci	else
1699f08c3bdfSopenharmony_ci		parid = fep->id;
1700f08c3bdfSopenharmony_ci	init_pathname(&f);
1701f08c3bdfSopenharmony_ci	type = rtpct ? ((random() % 100) > rtpct ? FT_REG : FT_RTF) : FT_REG;
1702f08c3bdfSopenharmony_ci	if (type == FT_RTF)
1703f08c3bdfSopenharmony_ci		extsize = (random() % 10) + 1;
1704f08c3bdfSopenharmony_ci	else
1705f08c3bdfSopenharmony_ci		extsize = 0;
1706f08c3bdfSopenharmony_ci	e = generate_fname(fep, type, &f, &id, &v);
1707f08c3bdfSopenharmony_ci	v |= v1;
1708f08c3bdfSopenharmony_ci	if (!e) {
1709f08c3bdfSopenharmony_ci		if (v) {
1710f08c3bdfSopenharmony_ci			fent_to_name(&f, &flist[FT_DIR], fep);
1711f08c3bdfSopenharmony_ci			printf("%d/%d: creat - no filename from %s\n",
1712f08c3bdfSopenharmony_ci			       procid, opno, f.path);
1713f08c3bdfSopenharmony_ci		}
1714f08c3bdfSopenharmony_ci		free_pathname(&f);
1715f08c3bdfSopenharmony_ci		return;
1716f08c3bdfSopenharmony_ci	}
1717f08c3bdfSopenharmony_ci	fd = creat_path(&f, 0666);
1718f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
1719f08c3bdfSopenharmony_ci	e1 = 0;
1720f08c3bdfSopenharmony_ci	check_cwd();
1721f08c3bdfSopenharmony_ci	esz = 0;
1722f08c3bdfSopenharmony_ci	if (fd >= 0) {
1723f08c3bdfSopenharmony_ci#ifndef NO_XFS
1724f08c3bdfSopenharmony_ci		struct fsxattr a;
1725f08c3bdfSopenharmony_ci		memset(&a, 0, sizeof(a));
1726f08c3bdfSopenharmony_ci		if (extsize && ioctl(fd, XFS_IOC_FSGETXATTR, &a) >= 0) {
1727f08c3bdfSopenharmony_ci			a.fsx_xflags |= XFS_XFLAG_REALTIME;
1728f08c3bdfSopenharmony_ci			a.fsx_extsize =
1729f08c3bdfSopenharmony_ci			    geom.rtextsize * geom.blocksize * extsize;
1730f08c3bdfSopenharmony_ci			if (ioctl(fd, XFS_IOC_FSSETXATTR, &a) < 0)
1731f08c3bdfSopenharmony_ci				e1 = errno;
1732f08c3bdfSopenharmony_ci			esz = a.fsx_extsize;
1733f08c3bdfSopenharmony_ci
1734f08c3bdfSopenharmony_ci		}
1735f08c3bdfSopenharmony_ci#endif
1736f08c3bdfSopenharmony_ci		add_to_flist(type, id, parid);
1737f08c3bdfSopenharmony_ci		close(fd);
1738f08c3bdfSopenharmony_ci	}
1739f08c3bdfSopenharmony_ci	if (v)
1740f08c3bdfSopenharmony_ci		printf("%d/%d: creat %s x:%d %d %d\n", procid, opno, f.path,
1741f08c3bdfSopenharmony_ci		       esz, e, e1);
1742f08c3bdfSopenharmony_ci	free_pathname(&f);
1743f08c3bdfSopenharmony_ci}
1744f08c3bdfSopenharmony_ci
1745f08c3bdfSopenharmony_ciint setdirect(int fd)
1746f08c3bdfSopenharmony_ci{
1747f08c3bdfSopenharmony_ci	static int no_direct;
1748f08c3bdfSopenharmony_ci	int flags;
1749f08c3bdfSopenharmony_ci
1750f08c3bdfSopenharmony_ci	if (no_direct)
1751f08c3bdfSopenharmony_ci		return 0;
1752f08c3bdfSopenharmony_ci
1753f08c3bdfSopenharmony_ci	flags = fcntl(fd, F_GETFL, 0);
1754f08c3bdfSopenharmony_ci	if (flags < 0)
1755f08c3bdfSopenharmony_ci		return 0;
1756f08c3bdfSopenharmony_ci
1757f08c3bdfSopenharmony_ci	if (fcntl(fd, F_SETFL, flags | O_DIRECT) < 0) {
1758f08c3bdfSopenharmony_ci		if (no_xfs) {
1759f08c3bdfSopenharmony_ci			no_direct = 1;
1760f08c3bdfSopenharmony_ci			return 0;
1761f08c3bdfSopenharmony_ci		}
1762f08c3bdfSopenharmony_ci		printf("cannot set O_DIRECT: %s\n", strerror(errno));
1763f08c3bdfSopenharmony_ci		return 0;
1764f08c3bdfSopenharmony_ci	}
1765f08c3bdfSopenharmony_ci
1766f08c3bdfSopenharmony_ci	return 1;
1767f08c3bdfSopenharmony_ci}
1768f08c3bdfSopenharmony_ci
1769f08c3bdfSopenharmony_civoid dread_f(int opno, long r)
1770f08c3bdfSopenharmony_ci{
1771f08c3bdfSopenharmony_ci	int64_t align;
1772f08c3bdfSopenharmony_ci	char *buf = NULL;
1773f08c3bdfSopenharmony_ci	struct dioattr diob;
1774f08c3bdfSopenharmony_ci	int e;
1775f08c3bdfSopenharmony_ci	pathname_t f;
1776f08c3bdfSopenharmony_ci	int fd;
1777f08c3bdfSopenharmony_ci	size_t len;
1778f08c3bdfSopenharmony_ci	int64_t lr;
1779f08c3bdfSopenharmony_ci	off64_t off;
1780f08c3bdfSopenharmony_ci	struct stat64 stb;
1781f08c3bdfSopenharmony_ci	int v;
1782f08c3bdfSopenharmony_ci
1783f08c3bdfSopenharmony_ci	init_pathname(&f);
1784f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
1785f08c3bdfSopenharmony_ci		if (v)
1786f08c3bdfSopenharmony_ci			printf("%d/%d: dread - no filename\n", procid, opno);
1787f08c3bdfSopenharmony_ci		free_pathname(&f);
1788f08c3bdfSopenharmony_ci		return;
1789f08c3bdfSopenharmony_ci	}
1790f08c3bdfSopenharmony_ci	fd = open_path(&f, O_RDONLY);
1791f08c3bdfSopenharmony_ci
1792f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
1793f08c3bdfSopenharmony_ci	check_cwd();
1794f08c3bdfSopenharmony_ci	if (fd < 0) {
1795f08c3bdfSopenharmony_ci		if (v)
1796f08c3bdfSopenharmony_ci			printf("%d/%d: dread - open %s failed %d\n",
1797f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
1798f08c3bdfSopenharmony_ci		free_pathname(&f);
1799f08c3bdfSopenharmony_ci		return;
1800f08c3bdfSopenharmony_ci	}
1801f08c3bdfSopenharmony_ci
1802f08c3bdfSopenharmony_ci	if (!setdirect(fd)) {
1803f08c3bdfSopenharmony_ci		close(fd);
1804f08c3bdfSopenharmony_ci		free_pathname(&f);
1805f08c3bdfSopenharmony_ci		return;
1806f08c3bdfSopenharmony_ci	}
1807f08c3bdfSopenharmony_ci
1808f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
1809f08c3bdfSopenharmony_ci		if (v)
1810f08c3bdfSopenharmony_ci			printf("%d/%d: dread - fstat64 %s failed %d\n",
1811f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
1812f08c3bdfSopenharmony_ci		free_pathname(&f);
1813f08c3bdfSopenharmony_ci		close(fd);
1814f08c3bdfSopenharmony_ci		return;
1815f08c3bdfSopenharmony_ci	}
1816f08c3bdfSopenharmony_ci	if (stb.st_size == 0) {
1817f08c3bdfSopenharmony_ci		if (v)
1818f08c3bdfSopenharmony_ci			printf("%d/%d: dread - %s zero size\n", procid, opno,
1819f08c3bdfSopenharmony_ci			       f.path);
1820f08c3bdfSopenharmony_ci		free_pathname(&f);
1821f08c3bdfSopenharmony_ci		close(fd);
1822f08c3bdfSopenharmony_ci		return;
1823f08c3bdfSopenharmony_ci	}
1824f08c3bdfSopenharmony_ci
1825f08c3bdfSopenharmony_ci	memset(&diob, 0, sizeof(diob));
1826f08c3bdfSopenharmony_ci	if (no_xfs) {
1827f08c3bdfSopenharmony_ci		diob.d_miniosz = stb.st_blksize;
1828f08c3bdfSopenharmony_ci		diob.d_maxiosz = stb.st_blksize * 256;	/* good number ? */
1829f08c3bdfSopenharmony_ci		diob.d_mem = stb.st_blksize;
1830f08c3bdfSopenharmony_ci	}
1831f08c3bdfSopenharmony_ci#ifndef NO_XFS
1832f08c3bdfSopenharmony_ci	else if (ioctl(fd, XFS_IOC_DIOINFO, &diob) < 0) {
1833f08c3bdfSopenharmony_ci		if (v)
1834f08c3bdfSopenharmony_ci			printf
1835f08c3bdfSopenharmony_ci			    ("%d/%d: dread - ioctl(fd, XFS_IOC_DIOINFO) %s failed %d\n",
1836f08c3bdfSopenharmony_ci			     procid, opno, f.path, errno);
1837f08c3bdfSopenharmony_ci		free_pathname(&f);
1838f08c3bdfSopenharmony_ci		close(fd);
1839f08c3bdfSopenharmony_ci		return;
1840f08c3bdfSopenharmony_ci	}
1841f08c3bdfSopenharmony_ci#endif
1842f08c3bdfSopenharmony_ci	align = (int64_t) diob.d_miniosz;
1843f08c3bdfSopenharmony_ci	lr = ((int64_t) random() << 32) + random();
1844f08c3bdfSopenharmony_ci	off = (off64_t) (lr % stb.st_size);
1845f08c3bdfSopenharmony_ci	off -= (off % align);
1846f08c3bdfSopenharmony_ci	lseek64(fd, off, SEEK_SET);
1847f08c3bdfSopenharmony_ci	len = (random() % (getpagesize() * 32)) + 1;
1848f08c3bdfSopenharmony_ci	len -= (len % align);
1849f08c3bdfSopenharmony_ci	if (len <= 0)
1850f08c3bdfSopenharmony_ci		len = align;
1851f08c3bdfSopenharmony_ci	else if (len > diob.d_maxiosz)
1852f08c3bdfSopenharmony_ci		len = diob.d_maxiosz;
1853f08c3bdfSopenharmony_ci	if ((e = posix_memalign((void **)&buf, diob.d_mem, len)) != 0) {
1854f08c3bdfSopenharmony_ci		fprintf(stderr, "posix_memalign: %s\n", strerror(e));
1855f08c3bdfSopenharmony_ci		exit(1);
1856f08c3bdfSopenharmony_ci	}
1857f08c3bdfSopenharmony_ci	if (buf == NULL) {
1858f08c3bdfSopenharmony_ci		fprintf(stderr, "posix_memalign: buf is NULL\n");
1859f08c3bdfSopenharmony_ci		exit(1);
1860f08c3bdfSopenharmony_ci	}
1861f08c3bdfSopenharmony_ci	e = read(fd, buf, len) < 0 ? errno : 0;
1862f08c3bdfSopenharmony_ci	free(buf);
1863f08c3bdfSopenharmony_ci	if (v)
1864f08c3bdfSopenharmony_ci		printf("%d/%d: dread %s [%lld,%ld] %d\n",
1865f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long int)off, (long)len, e);
1866f08c3bdfSopenharmony_ci	free_pathname(&f);
1867f08c3bdfSopenharmony_ci	close(fd);
1868f08c3bdfSopenharmony_ci}
1869f08c3bdfSopenharmony_ci
1870f08c3bdfSopenharmony_civoid dwrite_f(int opno, long r)
1871f08c3bdfSopenharmony_ci{
1872f08c3bdfSopenharmony_ci	int64_t align;
1873f08c3bdfSopenharmony_ci	char *buf = NULL;
1874f08c3bdfSopenharmony_ci	struct dioattr diob;
1875f08c3bdfSopenharmony_ci	int e;
1876f08c3bdfSopenharmony_ci	pathname_t f;
1877f08c3bdfSopenharmony_ci	int fd;
1878f08c3bdfSopenharmony_ci	size_t len;
1879f08c3bdfSopenharmony_ci	int64_t lr;
1880f08c3bdfSopenharmony_ci	off64_t off;
1881f08c3bdfSopenharmony_ci	struct stat64 stb;
1882f08c3bdfSopenharmony_ci	int v;
1883f08c3bdfSopenharmony_ci
1884f08c3bdfSopenharmony_ci	init_pathname(&f);
1885f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
1886f08c3bdfSopenharmony_ci		if (v)
1887f08c3bdfSopenharmony_ci			printf("%d/%d: dwrite - no filename\n", procid, opno);
1888f08c3bdfSopenharmony_ci		free_pathname(&f);
1889f08c3bdfSopenharmony_ci		return;
1890f08c3bdfSopenharmony_ci	}
1891f08c3bdfSopenharmony_ci	fd = open_path(&f, O_WRONLY);
1892f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
1893f08c3bdfSopenharmony_ci	check_cwd();
1894f08c3bdfSopenharmony_ci	if (fd < 0) {
1895f08c3bdfSopenharmony_ci		if (v)
1896f08c3bdfSopenharmony_ci			printf("%d/%d: dwrite - open %s failed %d\n",
1897f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
1898f08c3bdfSopenharmony_ci		free_pathname(&f);
1899f08c3bdfSopenharmony_ci		return;
1900f08c3bdfSopenharmony_ci	}
1901f08c3bdfSopenharmony_ci
1902f08c3bdfSopenharmony_ci	if (!setdirect(fd)) {
1903f08c3bdfSopenharmony_ci		close(fd);
1904f08c3bdfSopenharmony_ci		free_pathname(&f);
1905f08c3bdfSopenharmony_ci		return;
1906f08c3bdfSopenharmony_ci	}
1907f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
1908f08c3bdfSopenharmony_ci		if (v)
1909f08c3bdfSopenharmony_ci			printf("%d/%d: dwrite - fstat64 %s failed %d\n",
1910f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
1911f08c3bdfSopenharmony_ci		free_pathname(&f);
1912f08c3bdfSopenharmony_ci		close(fd);
1913f08c3bdfSopenharmony_ci		return;
1914f08c3bdfSopenharmony_ci	}
1915f08c3bdfSopenharmony_ci	memset(&diob, 0, sizeof(diob));
1916f08c3bdfSopenharmony_ci	if (no_xfs) {
1917f08c3bdfSopenharmony_ci		diob.d_miniosz = stb.st_blksize;
1918f08c3bdfSopenharmony_ci		diob.d_maxiosz = stb.st_blksize * 256;	/* good number ? */
1919f08c3bdfSopenharmony_ci		diob.d_mem = stb.st_blksize;
1920f08c3bdfSopenharmony_ci	}
1921f08c3bdfSopenharmony_ci#ifndef NO_XFS
1922f08c3bdfSopenharmony_ci	else if (ioctl(fd, XFS_IOC_DIOINFO, &diob) < 0) {
1923f08c3bdfSopenharmony_ci		if (v)
1924f08c3bdfSopenharmony_ci			printf
1925f08c3bdfSopenharmony_ci			    ("%d/%d: dwrite - ioctl(fd, XFS_IOC_DIOINFO) %s failed %d\n",
1926f08c3bdfSopenharmony_ci			     procid, opno, f.path, errno);
1927f08c3bdfSopenharmony_ci		free_pathname(&f);
1928f08c3bdfSopenharmony_ci		close(fd);
1929f08c3bdfSopenharmony_ci		return;
1930f08c3bdfSopenharmony_ci	}
1931f08c3bdfSopenharmony_ci#endif
1932f08c3bdfSopenharmony_ci	align = (int64_t) diob.d_miniosz;
1933f08c3bdfSopenharmony_ci	lr = ((int64_t) random() << 32) + random();
1934f08c3bdfSopenharmony_ci	off = (off64_t) (lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE));
1935f08c3bdfSopenharmony_ci	off -= (off % align);
1936f08c3bdfSopenharmony_ci	lseek64(fd, off, SEEK_SET);
1937f08c3bdfSopenharmony_ci	len = (random() % (getpagesize() * 32)) + 1;
1938f08c3bdfSopenharmony_ci	len -= (len % align);
1939f08c3bdfSopenharmony_ci	if (len <= 0)
1940f08c3bdfSopenharmony_ci		len = align;
1941f08c3bdfSopenharmony_ci	else if (len > diob.d_maxiosz)
1942f08c3bdfSopenharmony_ci		len = diob.d_maxiosz;
1943f08c3bdfSopenharmony_ci	if ((e = posix_memalign((void **)&buf, diob.d_mem, len)) != 0) {
1944f08c3bdfSopenharmony_ci		fprintf(stderr, "posix_memalign: %s\n", strerror(e));
1945f08c3bdfSopenharmony_ci		exit(1);
1946f08c3bdfSopenharmony_ci	}
1947f08c3bdfSopenharmony_ci	if (buf == NULL) {
1948f08c3bdfSopenharmony_ci		fprintf(stderr, "posix_memalign: buf is NULL\n");
1949f08c3bdfSopenharmony_ci		exit(1);
1950f08c3bdfSopenharmony_ci	}
1951f08c3bdfSopenharmony_ci	off %= maxfsize;
1952f08c3bdfSopenharmony_ci	lseek64(fd, off, SEEK_SET);
1953f08c3bdfSopenharmony_ci	memset(buf, nameseq & 0xff, len);
1954f08c3bdfSopenharmony_ci	e = write(fd, buf, len) < 0 ? errno : 0;
1955f08c3bdfSopenharmony_ci	free(buf);
1956f08c3bdfSopenharmony_ci	if (v)
1957f08c3bdfSopenharmony_ci		printf("%d/%d: dwrite %s [%lld,%ld] %d\n",
1958f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long)off, (long int)len, e);
1959f08c3bdfSopenharmony_ci	free_pathname(&f);
1960f08c3bdfSopenharmony_ci	close(fd);
1961f08c3bdfSopenharmony_ci}
1962f08c3bdfSopenharmony_ci
1963f08c3bdfSopenharmony_civoid fdatasync_f(int opno, long r)
1964f08c3bdfSopenharmony_ci{
1965f08c3bdfSopenharmony_ci	int e;
1966f08c3bdfSopenharmony_ci	pathname_t f;
1967f08c3bdfSopenharmony_ci	int fd;
1968f08c3bdfSopenharmony_ci	int v;
1969f08c3bdfSopenharmony_ci
1970f08c3bdfSopenharmony_ci	init_pathname(&f);
1971f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
1972f08c3bdfSopenharmony_ci		if (v)
1973f08c3bdfSopenharmony_ci			printf("%d/%d: fdatasync - no filename\n",
1974f08c3bdfSopenharmony_ci			       procid, opno);
1975f08c3bdfSopenharmony_ci		free_pathname(&f);
1976f08c3bdfSopenharmony_ci		return;
1977f08c3bdfSopenharmony_ci	}
1978f08c3bdfSopenharmony_ci	fd = open_path(&f, O_WRONLY);
1979f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
1980f08c3bdfSopenharmony_ci	check_cwd();
1981f08c3bdfSopenharmony_ci	if (fd < 0) {
1982f08c3bdfSopenharmony_ci		if (v)
1983f08c3bdfSopenharmony_ci			printf("%d/%d: fdatasync - open %s failed %d\n",
1984f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
1985f08c3bdfSopenharmony_ci		free_pathname(&f);
1986f08c3bdfSopenharmony_ci		return;
1987f08c3bdfSopenharmony_ci	}
1988f08c3bdfSopenharmony_ci	e = fdatasync(fd) < 0 ? errno : 0;
1989f08c3bdfSopenharmony_ci	if (v)
1990f08c3bdfSopenharmony_ci		printf("%d/%d: fdatasync %s %d\n", procid, opno, f.path, e);
1991f08c3bdfSopenharmony_ci	free_pathname(&f);
1992f08c3bdfSopenharmony_ci	close(fd);
1993f08c3bdfSopenharmony_ci}
1994f08c3bdfSopenharmony_ci
1995f08c3bdfSopenharmony_ci#ifndef NO_XFS
1996f08c3bdfSopenharmony_civoid freesp_f(int opno, long r)
1997f08c3bdfSopenharmony_ci{
1998f08c3bdfSopenharmony_ci	int e;
1999f08c3bdfSopenharmony_ci	pathname_t f;
2000f08c3bdfSopenharmony_ci	int fd;
2001f08c3bdfSopenharmony_ci	struct xfs_flock64 fl;
2002f08c3bdfSopenharmony_ci	__s64 lr;
2003f08c3bdfSopenharmony_ci	__s64 off;
2004f08c3bdfSopenharmony_ci	struct stat64 stb;
2005f08c3bdfSopenharmony_ci	int v;
2006f08c3bdfSopenharmony_ci
2007f08c3bdfSopenharmony_ci	init_pathname(&f);
2008f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
2009f08c3bdfSopenharmony_ci		if (v)
2010f08c3bdfSopenharmony_ci			printf("%d/%d: freesp - no filename\n", procid, opno);
2011f08c3bdfSopenharmony_ci		free_pathname(&f);
2012f08c3bdfSopenharmony_ci		return;
2013f08c3bdfSopenharmony_ci	}
2014f08c3bdfSopenharmony_ci	fd = open_path(&f, O_RDWR);
2015f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
2016f08c3bdfSopenharmony_ci	check_cwd();
2017f08c3bdfSopenharmony_ci	if (fd < 0) {
2018f08c3bdfSopenharmony_ci		if (v)
2019f08c3bdfSopenharmony_ci			printf("%d/%d: freesp - open %s failed %d\n",
2020f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
2021f08c3bdfSopenharmony_ci		free_pathname(&f);
2022f08c3bdfSopenharmony_ci		return;
2023f08c3bdfSopenharmony_ci	}
2024f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
2025f08c3bdfSopenharmony_ci		if (v)
2026f08c3bdfSopenharmony_ci			printf("%d/%d: freesp - fstat64 %s failed %d\n",
2027f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
2028f08c3bdfSopenharmony_ci		free_pathname(&f);
2029f08c3bdfSopenharmony_ci		close(fd);
2030f08c3bdfSopenharmony_ci		return;
2031f08c3bdfSopenharmony_ci	}
2032f08c3bdfSopenharmony_ci	lr = ((__s64) random() << 32) + random();
2033f08c3bdfSopenharmony_ci	off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE);
2034f08c3bdfSopenharmony_ci	off %= maxfsize;
2035f08c3bdfSopenharmony_ci	memset(&fl, 0, sizeof(fl));
2036f08c3bdfSopenharmony_ci	fl.l_whence = SEEK_SET;
2037f08c3bdfSopenharmony_ci	fl.l_start = off;
2038f08c3bdfSopenharmony_ci	fl.l_len = 0;
2039f08c3bdfSopenharmony_ci	e = ioctl(fd, XFS_IOC_FREESP64, &fl) < 0 ? errno : 0;
2040f08c3bdfSopenharmony_ci	if (v)
2041f08c3bdfSopenharmony_ci		printf("%d/%d: ioctl(XFS_IOC_FREESP64) %s %lld 0 %d\n",
2042f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long)off, e);
2043f08c3bdfSopenharmony_ci	free_pathname(&f);
2044f08c3bdfSopenharmony_ci	close(fd);
2045f08c3bdfSopenharmony_ci}
2046f08c3bdfSopenharmony_ci
2047f08c3bdfSopenharmony_ci#endif
2048f08c3bdfSopenharmony_ci
2049f08c3bdfSopenharmony_civoid fsync_f(int opno, long r)
2050f08c3bdfSopenharmony_ci{
2051f08c3bdfSopenharmony_ci	int e;
2052f08c3bdfSopenharmony_ci	pathname_t f;
2053f08c3bdfSopenharmony_ci	int fd;
2054f08c3bdfSopenharmony_ci	int v;
2055f08c3bdfSopenharmony_ci
2056f08c3bdfSopenharmony_ci	init_pathname(&f);
2057f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
2058f08c3bdfSopenharmony_ci		if (v)
2059f08c3bdfSopenharmony_ci			printf("%d/%d: fsync - no filename\n", procid, opno);
2060f08c3bdfSopenharmony_ci		free_pathname(&f);
2061f08c3bdfSopenharmony_ci		return;
2062f08c3bdfSopenharmony_ci	}
2063f08c3bdfSopenharmony_ci	fd = open_path(&f, O_WRONLY);
2064f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
2065f08c3bdfSopenharmony_ci	check_cwd();
2066f08c3bdfSopenharmony_ci	if (fd < 0) {
2067f08c3bdfSopenharmony_ci		if (v)
2068f08c3bdfSopenharmony_ci			printf("%d/%d: fsync - open %s failed %d\n",
2069f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
2070f08c3bdfSopenharmony_ci		free_pathname(&f);
2071f08c3bdfSopenharmony_ci		return;
2072f08c3bdfSopenharmony_ci	}
2073f08c3bdfSopenharmony_ci	e = fsync(fd) < 0 ? errno : 0;
2074f08c3bdfSopenharmony_ci	if (v)
2075f08c3bdfSopenharmony_ci		printf("%d/%d: fsync %s %d\n", procid, opno, f.path, e);
2076f08c3bdfSopenharmony_ci	free_pathname(&f);
2077f08c3bdfSopenharmony_ci	close(fd);
2078f08c3bdfSopenharmony_ci}
2079f08c3bdfSopenharmony_ci
2080f08c3bdfSopenharmony_civoid getdents_f(int opno, long r)
2081f08c3bdfSopenharmony_ci{
2082f08c3bdfSopenharmony_ci	DIR *dir;
2083f08c3bdfSopenharmony_ci	pathname_t f;
2084f08c3bdfSopenharmony_ci	int v;
2085f08c3bdfSopenharmony_ci
2086f08c3bdfSopenharmony_ci	init_pathname(&f);
2087f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, r, &f, NULL, NULL, &v))
2088f08c3bdfSopenharmony_ci		append_pathname(&f, ".");
2089f08c3bdfSopenharmony_ci	dir = opendir_path(&f);
2090f08c3bdfSopenharmony_ci	check_cwd();
2091f08c3bdfSopenharmony_ci	if (dir == NULL) {
2092f08c3bdfSopenharmony_ci		if (v)
2093f08c3bdfSopenharmony_ci			printf("%d/%d: getdents - can't open %s\n",
2094f08c3bdfSopenharmony_ci			       procid, opno, f.path);
2095f08c3bdfSopenharmony_ci		free_pathname(&f);
2096f08c3bdfSopenharmony_ci		return;
2097f08c3bdfSopenharmony_ci	}
2098f08c3bdfSopenharmony_ci	while (readdir64(dir) != NULL)
2099f08c3bdfSopenharmony_ci		continue;
2100f08c3bdfSopenharmony_ci	if (v)
2101f08c3bdfSopenharmony_ci		printf("%d/%d: getdents %s 0\n", procid, opno, f.path);
2102f08c3bdfSopenharmony_ci	free_pathname(&f);
2103f08c3bdfSopenharmony_ci	closedir(dir);
2104f08c3bdfSopenharmony_ci}
2105f08c3bdfSopenharmony_ci
2106f08c3bdfSopenharmony_civoid link_f(int opno, long r)
2107f08c3bdfSopenharmony_ci{
2108f08c3bdfSopenharmony_ci	int e;
2109f08c3bdfSopenharmony_ci	pathname_t f;
2110f08c3bdfSopenharmony_ci	fent_t *fep;
2111f08c3bdfSopenharmony_ci	flist_t *flp;
2112f08c3bdfSopenharmony_ci	int id;
2113f08c3bdfSopenharmony_ci	pathname_t l;
2114f08c3bdfSopenharmony_ci	int parid;
2115f08c3bdfSopenharmony_ci	int v;
2116f08c3bdfSopenharmony_ci	int v1;
2117f08c3bdfSopenharmony_ci
2118f08c3bdfSopenharmony_ci	init_pathname(&f);
2119f08c3bdfSopenharmony_ci	if (!get_fname(FT_NOTDIR, r, &f, &flp, NULL, &v1)) {
2120f08c3bdfSopenharmony_ci		if (v1)
2121f08c3bdfSopenharmony_ci			printf("%d/%d: link - no file\n", procid, opno);
2122f08c3bdfSopenharmony_ci		free_pathname(&f);
2123f08c3bdfSopenharmony_ci		return;
2124f08c3bdfSopenharmony_ci	}
2125f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, random(), NULL, NULL, &fep, &v))
2126f08c3bdfSopenharmony_ci		parid = -1;
2127f08c3bdfSopenharmony_ci	else
2128f08c3bdfSopenharmony_ci		parid = fep->id;
2129f08c3bdfSopenharmony_ci	v |= v1;
2130f08c3bdfSopenharmony_ci	init_pathname(&l);
2131f08c3bdfSopenharmony_ci	e = generate_fname(fep, flp - flist, &l, &id, &v1);
2132f08c3bdfSopenharmony_ci	v |= v1;
2133f08c3bdfSopenharmony_ci	if (!e) {
2134f08c3bdfSopenharmony_ci		if (v) {
2135f08c3bdfSopenharmony_ci			fent_to_name(&l, &flist[FT_DIR], fep);
2136f08c3bdfSopenharmony_ci			printf("%d/%d: link - no filename from %s\n",
2137f08c3bdfSopenharmony_ci			       procid, opno, l.path);
2138f08c3bdfSopenharmony_ci		}
2139f08c3bdfSopenharmony_ci		free_pathname(&l);
2140f08c3bdfSopenharmony_ci		free_pathname(&f);
2141f08c3bdfSopenharmony_ci		return;
2142f08c3bdfSopenharmony_ci	}
2143f08c3bdfSopenharmony_ci	e = link_path(&f, &l) < 0 ? errno : 0;
2144f08c3bdfSopenharmony_ci	check_cwd();
2145f08c3bdfSopenharmony_ci	if (e == 0)
2146f08c3bdfSopenharmony_ci		add_to_flist(flp - flist, id, parid);
2147f08c3bdfSopenharmony_ci	if (v)
2148f08c3bdfSopenharmony_ci		printf("%d/%d: link %s %s %d\n", procid, opno, f.path, l.path,
2149f08c3bdfSopenharmony_ci		       e);
2150f08c3bdfSopenharmony_ci	free_pathname(&l);
2151f08c3bdfSopenharmony_ci	free_pathname(&f);
2152f08c3bdfSopenharmony_ci}
2153f08c3bdfSopenharmony_ci
2154f08c3bdfSopenharmony_civoid mkdir_f(int opno, long r)
2155f08c3bdfSopenharmony_ci{
2156f08c3bdfSopenharmony_ci	int e;
2157f08c3bdfSopenharmony_ci	pathname_t f;
2158f08c3bdfSopenharmony_ci	fent_t *fep;
2159f08c3bdfSopenharmony_ci	int id;
2160f08c3bdfSopenharmony_ci	int parid;
2161f08c3bdfSopenharmony_ci	int v;
2162f08c3bdfSopenharmony_ci	int v1;
2163f08c3bdfSopenharmony_ci
2164f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v))
2165f08c3bdfSopenharmony_ci		parid = -1;
2166f08c3bdfSopenharmony_ci	else
2167f08c3bdfSopenharmony_ci		parid = fep->id;
2168f08c3bdfSopenharmony_ci	init_pathname(&f);
2169f08c3bdfSopenharmony_ci	e = generate_fname(fep, FT_DIR, &f, &id, &v1);
2170f08c3bdfSopenharmony_ci	v |= v1;
2171f08c3bdfSopenharmony_ci	if (!e) {
2172f08c3bdfSopenharmony_ci		if (v) {
2173f08c3bdfSopenharmony_ci			fent_to_name(&f, &flist[FT_DIR], fep);
2174f08c3bdfSopenharmony_ci			printf("%d/%d: mkdir - no filename from %s\n",
2175f08c3bdfSopenharmony_ci			       procid, opno, f.path);
2176f08c3bdfSopenharmony_ci		}
2177f08c3bdfSopenharmony_ci		free_pathname(&f);
2178f08c3bdfSopenharmony_ci		return;
2179f08c3bdfSopenharmony_ci	}
2180f08c3bdfSopenharmony_ci	e = mkdir_path(&f, 0777) < 0 ? errno : 0;
2181f08c3bdfSopenharmony_ci	check_cwd();
2182f08c3bdfSopenharmony_ci	if (e == 0)
2183f08c3bdfSopenharmony_ci		add_to_flist(FT_DIR, id, parid);
2184f08c3bdfSopenharmony_ci	if (v)
2185f08c3bdfSopenharmony_ci		printf("%d/%d: mkdir %s %d\n", procid, opno, f.path, e);
2186f08c3bdfSopenharmony_ci	free_pathname(&f);
2187f08c3bdfSopenharmony_ci}
2188f08c3bdfSopenharmony_ci
2189f08c3bdfSopenharmony_civoid mknod_f(int opno, long r)
2190f08c3bdfSopenharmony_ci{
2191f08c3bdfSopenharmony_ci	int e;
2192f08c3bdfSopenharmony_ci	pathname_t f;
2193f08c3bdfSopenharmony_ci	fent_t *fep;
2194f08c3bdfSopenharmony_ci	int id;
2195f08c3bdfSopenharmony_ci	int parid;
2196f08c3bdfSopenharmony_ci	int v;
2197f08c3bdfSopenharmony_ci	int v1;
2198f08c3bdfSopenharmony_ci
2199f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v))
2200f08c3bdfSopenharmony_ci		parid = -1;
2201f08c3bdfSopenharmony_ci	else
2202f08c3bdfSopenharmony_ci		parid = fep->id;
2203f08c3bdfSopenharmony_ci	init_pathname(&f);
2204f08c3bdfSopenharmony_ci	e = generate_fname(fep, FT_DEV, &f, &id, &v1);
2205f08c3bdfSopenharmony_ci	v |= v1;
2206f08c3bdfSopenharmony_ci	if (!e) {
2207f08c3bdfSopenharmony_ci		if (v) {
2208f08c3bdfSopenharmony_ci			fent_to_name(&f, &flist[FT_DIR], fep);
2209f08c3bdfSopenharmony_ci			printf("%d/%d: mknod - no filename from %s\n",
2210f08c3bdfSopenharmony_ci			       procid, opno, f.path);
2211f08c3bdfSopenharmony_ci		}
2212f08c3bdfSopenharmony_ci		free_pathname(&f);
2213f08c3bdfSopenharmony_ci		return;
2214f08c3bdfSopenharmony_ci	}
2215f08c3bdfSopenharmony_ci	e = mknod_path(&f, S_IFCHR | 0444, 0) < 0 ? errno : 0;
2216f08c3bdfSopenharmony_ci	check_cwd();
2217f08c3bdfSopenharmony_ci	if (e == 0)
2218f08c3bdfSopenharmony_ci		add_to_flist(FT_DEV, id, parid);
2219f08c3bdfSopenharmony_ci	if (v)
2220f08c3bdfSopenharmony_ci		printf("%d/%d: mknod %s %d\n", procid, opno, f.path, e);
2221f08c3bdfSopenharmony_ci	free_pathname(&f);
2222f08c3bdfSopenharmony_ci}
2223f08c3bdfSopenharmony_ci
2224f08c3bdfSopenharmony_civoid read_f(int opno, long r)
2225f08c3bdfSopenharmony_ci{
2226f08c3bdfSopenharmony_ci	char *buf;
2227f08c3bdfSopenharmony_ci	int e;
2228f08c3bdfSopenharmony_ci	pathname_t f;
2229f08c3bdfSopenharmony_ci	int fd;
2230f08c3bdfSopenharmony_ci	size_t len;
2231f08c3bdfSopenharmony_ci	int64_t lr;
2232f08c3bdfSopenharmony_ci	off64_t off;
2233f08c3bdfSopenharmony_ci	struct stat64 stb;
2234f08c3bdfSopenharmony_ci	int v;
2235f08c3bdfSopenharmony_ci
2236f08c3bdfSopenharmony_ci	init_pathname(&f);
2237f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
2238f08c3bdfSopenharmony_ci		if (v)
2239f08c3bdfSopenharmony_ci			printf("%d/%d: read - no filename\n", procid, opno);
2240f08c3bdfSopenharmony_ci		free_pathname(&f);
2241f08c3bdfSopenharmony_ci		return;
2242f08c3bdfSopenharmony_ci	}
2243f08c3bdfSopenharmony_ci	fd = open_path(&f, O_RDONLY);
2244f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
2245f08c3bdfSopenharmony_ci	check_cwd();
2246f08c3bdfSopenharmony_ci	if (fd < 0) {
2247f08c3bdfSopenharmony_ci		if (v)
2248f08c3bdfSopenharmony_ci			printf("%d/%d: read - open %s failed %d\n",
2249f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
2250f08c3bdfSopenharmony_ci		free_pathname(&f);
2251f08c3bdfSopenharmony_ci		return;
2252f08c3bdfSopenharmony_ci	}
2253f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
2254f08c3bdfSopenharmony_ci		if (v)
2255f08c3bdfSopenharmony_ci			printf("%d/%d: read - fstat64 %s failed %d\n",
2256f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
2257f08c3bdfSopenharmony_ci		free_pathname(&f);
2258f08c3bdfSopenharmony_ci		close(fd);
2259f08c3bdfSopenharmony_ci		return;
2260f08c3bdfSopenharmony_ci	}
2261f08c3bdfSopenharmony_ci	if (stb.st_size == 0) {
2262f08c3bdfSopenharmony_ci		if (v)
2263f08c3bdfSopenharmony_ci			printf("%d/%d: read - %s zero size\n", procid, opno,
2264f08c3bdfSopenharmony_ci			       f.path);
2265f08c3bdfSopenharmony_ci		free_pathname(&f);
2266f08c3bdfSopenharmony_ci		close(fd);
2267f08c3bdfSopenharmony_ci		return;
2268f08c3bdfSopenharmony_ci	}
2269f08c3bdfSopenharmony_ci	lr = ((int64_t) random() << 32) + random();
2270f08c3bdfSopenharmony_ci	off = (off64_t) (lr % stb.st_size);
2271f08c3bdfSopenharmony_ci	lseek64(fd, off, SEEK_SET);
2272f08c3bdfSopenharmony_ci	len = (random() % (getpagesize() * 32)) + 1;
2273f08c3bdfSopenharmony_ci	buf = malloc(len);
2274f08c3bdfSopenharmony_ci	e = read(fd, buf, len) < 0 ? errno : 0;
2275f08c3bdfSopenharmony_ci	free(buf);
2276f08c3bdfSopenharmony_ci	if (v)
2277f08c3bdfSopenharmony_ci		printf("%d/%d: read %s [%lld,%ld] %d\n",
2278f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long)off, (long int)len, e);
2279f08c3bdfSopenharmony_ci	free_pathname(&f);
2280f08c3bdfSopenharmony_ci	close(fd);
2281f08c3bdfSopenharmony_ci}
2282f08c3bdfSopenharmony_ci
2283f08c3bdfSopenharmony_civoid readlink_f(int opno, long r)
2284f08c3bdfSopenharmony_ci{
2285f08c3bdfSopenharmony_ci	char buf[PATH_MAX];
2286f08c3bdfSopenharmony_ci	int e;
2287f08c3bdfSopenharmony_ci	pathname_t f;
2288f08c3bdfSopenharmony_ci	int v;
2289f08c3bdfSopenharmony_ci
2290f08c3bdfSopenharmony_ci	init_pathname(&f);
2291f08c3bdfSopenharmony_ci	if (!get_fname(FT_SYMm, r, &f, NULL, NULL, &v)) {
2292f08c3bdfSopenharmony_ci		if (v)
2293f08c3bdfSopenharmony_ci			printf("%d/%d: readlink - no filename\n", procid, opno);
2294f08c3bdfSopenharmony_ci		free_pathname(&f);
2295f08c3bdfSopenharmony_ci		return;
2296f08c3bdfSopenharmony_ci	}
2297f08c3bdfSopenharmony_ci	e = readlink_path(&f, buf, PATH_MAX) < 0 ? errno : 0;
2298f08c3bdfSopenharmony_ci	check_cwd();
2299f08c3bdfSopenharmony_ci	if (v)
2300f08c3bdfSopenharmony_ci		printf("%d/%d: readlink %s %d\n", procid, opno, f.path, e);
2301f08c3bdfSopenharmony_ci	free_pathname(&f);
2302f08c3bdfSopenharmony_ci}
2303f08c3bdfSopenharmony_ci
2304f08c3bdfSopenharmony_civoid rename_f(int opno, long r)
2305f08c3bdfSopenharmony_ci{
2306f08c3bdfSopenharmony_ci	fent_t *dfep;
2307f08c3bdfSopenharmony_ci	int e;
2308f08c3bdfSopenharmony_ci	pathname_t f;
2309f08c3bdfSopenharmony_ci	fent_t *fep;
2310f08c3bdfSopenharmony_ci	flist_t *flp;
2311f08c3bdfSopenharmony_ci	int id;
2312f08c3bdfSopenharmony_ci	pathname_t newf;
2313f08c3bdfSopenharmony_ci	int oldid;
2314f08c3bdfSopenharmony_ci	int parid;
2315f08c3bdfSopenharmony_ci	int v;
2316f08c3bdfSopenharmony_ci	int v1;
2317f08c3bdfSopenharmony_ci
2318f08c3bdfSopenharmony_ci	init_pathname(&f);
2319f08c3bdfSopenharmony_ci	if (!get_fname(FT_ANYm, r, &f, &flp, &fep, &v1)) {
2320f08c3bdfSopenharmony_ci		if (v1)
2321f08c3bdfSopenharmony_ci			printf("%d/%d: rename - no filename\n", procid, opno);
2322f08c3bdfSopenharmony_ci		free_pathname(&f);
2323f08c3bdfSopenharmony_ci		return;
2324f08c3bdfSopenharmony_ci	}
2325f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, random(), NULL, NULL, &dfep, &v))
2326f08c3bdfSopenharmony_ci		parid = -1;
2327f08c3bdfSopenharmony_ci	else
2328f08c3bdfSopenharmony_ci		parid = dfep->id;
2329f08c3bdfSopenharmony_ci	v |= v1;
2330f08c3bdfSopenharmony_ci	init_pathname(&newf);
2331f08c3bdfSopenharmony_ci	e = generate_fname(dfep, flp - flist, &newf, &id, &v1);
2332f08c3bdfSopenharmony_ci	v |= v1;
2333f08c3bdfSopenharmony_ci	if (!e) {
2334f08c3bdfSopenharmony_ci		if (v) {
2335f08c3bdfSopenharmony_ci			fent_to_name(&f, &flist[FT_DIR], dfep);
2336f08c3bdfSopenharmony_ci			printf("%d/%d: rename - no filename from %s\n",
2337f08c3bdfSopenharmony_ci			       procid, opno, f.path);
2338f08c3bdfSopenharmony_ci		}
2339f08c3bdfSopenharmony_ci		free_pathname(&newf);
2340f08c3bdfSopenharmony_ci		free_pathname(&f);
2341f08c3bdfSopenharmony_ci		return;
2342f08c3bdfSopenharmony_ci	}
2343f08c3bdfSopenharmony_ci	e = rename_path(&f, &newf) < 0 ? errno : 0;
2344f08c3bdfSopenharmony_ci	check_cwd();
2345f08c3bdfSopenharmony_ci	if (e == 0) {
2346f08c3bdfSopenharmony_ci		if (flp - flist == FT_DIR) {
2347f08c3bdfSopenharmony_ci			oldid = fep->id;
2348f08c3bdfSopenharmony_ci			fix_parent(oldid, id);
2349f08c3bdfSopenharmony_ci		}
2350f08c3bdfSopenharmony_ci		del_from_flist(flp - flist, fep - flp->fents);
2351f08c3bdfSopenharmony_ci		add_to_flist(flp - flist, id, parid);
2352f08c3bdfSopenharmony_ci	}
2353f08c3bdfSopenharmony_ci	if (v)
2354f08c3bdfSopenharmony_ci		printf("%d/%d: rename %s to %s %d\n", procid, opno, f.path,
2355f08c3bdfSopenharmony_ci		       newf.path, e);
2356f08c3bdfSopenharmony_ci	free_pathname(&newf);
2357f08c3bdfSopenharmony_ci	free_pathname(&f);
2358f08c3bdfSopenharmony_ci}
2359f08c3bdfSopenharmony_ci
2360f08c3bdfSopenharmony_ci#ifndef NO_XFS
2361f08c3bdfSopenharmony_civoid resvsp_f(int opno, long r)
2362f08c3bdfSopenharmony_ci{
2363f08c3bdfSopenharmony_ci	int e;
2364f08c3bdfSopenharmony_ci	pathname_t f;
2365f08c3bdfSopenharmony_ci	int fd;
2366f08c3bdfSopenharmony_ci	struct xfs_flock64 fl;
2367f08c3bdfSopenharmony_ci	__s64 lr;
2368f08c3bdfSopenharmony_ci	__s64 off;
2369f08c3bdfSopenharmony_ci	struct stat64 stb;
2370f08c3bdfSopenharmony_ci	int v;
2371f08c3bdfSopenharmony_ci
2372f08c3bdfSopenharmony_ci	init_pathname(&f);
2373f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
2374f08c3bdfSopenharmony_ci		if (v)
2375f08c3bdfSopenharmony_ci			printf("%d/%d: resvsp - no filename\n", procid, opno);
2376f08c3bdfSopenharmony_ci		free_pathname(&f);
2377f08c3bdfSopenharmony_ci		return;
2378f08c3bdfSopenharmony_ci	}
2379f08c3bdfSopenharmony_ci	fd = open_path(&f, O_RDWR);
2380f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
2381f08c3bdfSopenharmony_ci	check_cwd();
2382f08c3bdfSopenharmony_ci	if (fd < 0) {
2383f08c3bdfSopenharmony_ci		if (v)
2384f08c3bdfSopenharmony_ci			printf("%d/%d: resvsp - open %s failed %d\n",
2385f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
2386f08c3bdfSopenharmony_ci		free_pathname(&f);
2387f08c3bdfSopenharmony_ci		return;
2388f08c3bdfSopenharmony_ci	}
2389f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
2390f08c3bdfSopenharmony_ci		if (v)
2391f08c3bdfSopenharmony_ci			printf("%d/%d: resvsp - fstat64 %s failed %d\n",
2392f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
2393f08c3bdfSopenharmony_ci		free_pathname(&f);
2394f08c3bdfSopenharmony_ci		close(fd);
2395f08c3bdfSopenharmony_ci		return;
2396f08c3bdfSopenharmony_ci	}
2397f08c3bdfSopenharmony_ci	lr = ((__s64) random() << 32) + random();
2398f08c3bdfSopenharmony_ci	off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE);
2399f08c3bdfSopenharmony_ci	off %= maxfsize;
2400f08c3bdfSopenharmony_ci	memset(&fl, 0, sizeof(fl));
2401f08c3bdfSopenharmony_ci	fl.l_whence = SEEK_SET;
2402f08c3bdfSopenharmony_ci	fl.l_start = off;
2403f08c3bdfSopenharmony_ci	fl.l_len = (__s64) (random() % (1024 * 1024));
2404f08c3bdfSopenharmony_ci	e = ioctl(fd, XFS_IOC_RESVSP64, &fl) < 0 ? errno : 0;
2405f08c3bdfSopenharmony_ci	if (v)
2406f08c3bdfSopenharmony_ci		printf("%d/%d: ioctl(XFS_IOC_RESVSP64) %s %lld %lld %d\n",
2407f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long)off,
2408f08c3bdfSopenharmony_ci		       (long long)fl.l_len, e);
2409f08c3bdfSopenharmony_ci	free_pathname(&f);
2410f08c3bdfSopenharmony_ci	close(fd);
2411f08c3bdfSopenharmony_ci}
2412f08c3bdfSopenharmony_ci#endif
2413f08c3bdfSopenharmony_ci
2414f08c3bdfSopenharmony_civoid rmdir_f(int opno, long r)
2415f08c3bdfSopenharmony_ci{
2416f08c3bdfSopenharmony_ci	int e;
2417f08c3bdfSopenharmony_ci	pathname_t f;
2418f08c3bdfSopenharmony_ci	fent_t *fep;
2419f08c3bdfSopenharmony_ci	int v;
2420f08c3bdfSopenharmony_ci
2421f08c3bdfSopenharmony_ci	init_pathname(&f);
2422f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, r, &f, NULL, &fep, &v)) {
2423f08c3bdfSopenharmony_ci		if (v)
2424f08c3bdfSopenharmony_ci			printf("%d/%d: rmdir - no directory\n", procid, opno);
2425f08c3bdfSopenharmony_ci		free_pathname(&f);
2426f08c3bdfSopenharmony_ci		return;
2427f08c3bdfSopenharmony_ci	}
2428f08c3bdfSopenharmony_ci	e = rmdir_path(&f) < 0 ? errno : 0;
2429f08c3bdfSopenharmony_ci	check_cwd();
2430f08c3bdfSopenharmony_ci	if (e == 0)
2431f08c3bdfSopenharmony_ci		del_from_flist(FT_DIR, fep - flist[FT_DIR].fents);
2432f08c3bdfSopenharmony_ci	if (v)
2433f08c3bdfSopenharmony_ci		printf("%d/%d: rmdir %s %d\n", procid, opno, f.path, e);
2434f08c3bdfSopenharmony_ci	free_pathname(&f);
2435f08c3bdfSopenharmony_ci}
2436f08c3bdfSopenharmony_ci
2437f08c3bdfSopenharmony_civoid stat_f(int opno, long r)
2438f08c3bdfSopenharmony_ci{
2439f08c3bdfSopenharmony_ci	int e;
2440f08c3bdfSopenharmony_ci	pathname_t f;
2441f08c3bdfSopenharmony_ci	struct stat64 stb;
2442f08c3bdfSopenharmony_ci	int v;
2443f08c3bdfSopenharmony_ci
2444f08c3bdfSopenharmony_ci	init_pathname(&f);
2445f08c3bdfSopenharmony_ci	if (!get_fname(FT_ANYm, r, &f, NULL, NULL, &v)) {
2446f08c3bdfSopenharmony_ci		if (v)
2447f08c3bdfSopenharmony_ci			printf("%d/%d: stat - no entries\n", procid, opno);
2448f08c3bdfSopenharmony_ci		free_pathname(&f);
2449f08c3bdfSopenharmony_ci		return;
2450f08c3bdfSopenharmony_ci	}
2451f08c3bdfSopenharmony_ci	e = lstat64_path(&f, &stb) < 0 ? errno : 0;
2452f08c3bdfSopenharmony_ci	check_cwd();
2453f08c3bdfSopenharmony_ci	if (v)
2454f08c3bdfSopenharmony_ci		printf("%d/%d: stat %s %d\n", procid, opno, f.path, e);
2455f08c3bdfSopenharmony_ci	free_pathname(&f);
2456f08c3bdfSopenharmony_ci}
2457f08c3bdfSopenharmony_ci
2458f08c3bdfSopenharmony_civoid symlink_f(int opno, long r)
2459f08c3bdfSopenharmony_ci{
2460f08c3bdfSopenharmony_ci	int e;
2461f08c3bdfSopenharmony_ci	pathname_t f;
2462f08c3bdfSopenharmony_ci	fent_t *fep;
2463f08c3bdfSopenharmony_ci	int i;
2464f08c3bdfSopenharmony_ci	int id;
2465f08c3bdfSopenharmony_ci	int len;
2466f08c3bdfSopenharmony_ci	int parid;
2467f08c3bdfSopenharmony_ci	int v;
2468f08c3bdfSopenharmony_ci	int v1;
2469f08c3bdfSopenharmony_ci	char *val;
2470f08c3bdfSopenharmony_ci
2471f08c3bdfSopenharmony_ci	if (!get_fname(FT_DIRm, r, NULL, NULL, &fep, &v))
2472f08c3bdfSopenharmony_ci		parid = -1;
2473f08c3bdfSopenharmony_ci	else
2474f08c3bdfSopenharmony_ci		parid = fep->id;
2475f08c3bdfSopenharmony_ci	init_pathname(&f);
2476f08c3bdfSopenharmony_ci	e = generate_fname(fep, FT_SYM, &f, &id, &v1);
2477f08c3bdfSopenharmony_ci	v |= v1;
2478f08c3bdfSopenharmony_ci	if (!e) {
2479f08c3bdfSopenharmony_ci		if (v) {
2480f08c3bdfSopenharmony_ci			fent_to_name(&f, &flist[FT_DIR], fep);
2481f08c3bdfSopenharmony_ci			printf("%d/%d: symlink - no filename from %s\n",
2482f08c3bdfSopenharmony_ci			       procid, opno, f.path);
2483f08c3bdfSopenharmony_ci		}
2484f08c3bdfSopenharmony_ci		free_pathname(&f);
2485f08c3bdfSopenharmony_ci		return;
2486f08c3bdfSopenharmony_ci	}
2487f08c3bdfSopenharmony_ci	len = (int)(random() % PATH_MAX);
2488f08c3bdfSopenharmony_ci	val = malloc(len + 1);
2489f08c3bdfSopenharmony_ci	if (len)
2490f08c3bdfSopenharmony_ci		memset(val, 'x', len);
2491f08c3bdfSopenharmony_ci	val[len] = '\0';
2492f08c3bdfSopenharmony_ci	for (i = 10; i < len - 1; i += 10)
2493f08c3bdfSopenharmony_ci		val[i] = '/';
2494f08c3bdfSopenharmony_ci	e = symlink_path(val, &f) < 0 ? errno : 0;
2495f08c3bdfSopenharmony_ci	check_cwd();
2496f08c3bdfSopenharmony_ci	if (e == 0)
2497f08c3bdfSopenharmony_ci		add_to_flist(FT_SYM, id, parid);
2498f08c3bdfSopenharmony_ci	free(val);
2499f08c3bdfSopenharmony_ci	if (v)
2500f08c3bdfSopenharmony_ci		printf("%d/%d: symlink %s %d\n", procid, opno, f.path, e);
2501f08c3bdfSopenharmony_ci	free_pathname(&f);
2502f08c3bdfSopenharmony_ci}
2503f08c3bdfSopenharmony_ci
2504f08c3bdfSopenharmony_ci/* ARGSUSED */
2505f08c3bdfSopenharmony_civoid sync_f(int opno, long r __attribute__((unused)))
2506f08c3bdfSopenharmony_ci{
2507f08c3bdfSopenharmony_ci	sync();
2508f08c3bdfSopenharmony_ci	if (verbose)
2509f08c3bdfSopenharmony_ci		printf("%d/%d: sync\n", procid, opno);
2510f08c3bdfSopenharmony_ci}
2511f08c3bdfSopenharmony_ci
2512f08c3bdfSopenharmony_civoid truncate_f(int opno, long r)
2513f08c3bdfSopenharmony_ci{
2514f08c3bdfSopenharmony_ci	int e;
2515f08c3bdfSopenharmony_ci	pathname_t f;
2516f08c3bdfSopenharmony_ci	int64_t lr;
2517f08c3bdfSopenharmony_ci	off64_t off;
2518f08c3bdfSopenharmony_ci	struct stat64 stb;
2519f08c3bdfSopenharmony_ci	int v;
2520f08c3bdfSopenharmony_ci
2521f08c3bdfSopenharmony_ci	init_pathname(&f);
2522f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
2523f08c3bdfSopenharmony_ci		if (v)
2524f08c3bdfSopenharmony_ci			printf("%d/%d: truncate - no filename\n", procid, opno);
2525f08c3bdfSopenharmony_ci		free_pathname(&f);
2526f08c3bdfSopenharmony_ci		return;
2527f08c3bdfSopenharmony_ci	}
2528f08c3bdfSopenharmony_ci	e = stat64_path(&f, &stb) < 0 ? errno : 0;
2529f08c3bdfSopenharmony_ci	check_cwd();
2530f08c3bdfSopenharmony_ci	if (e > 0) {
2531f08c3bdfSopenharmony_ci		if (v)
2532f08c3bdfSopenharmony_ci			printf("%d/%d: truncate - stat64 %s failed %d\n",
2533f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
2534f08c3bdfSopenharmony_ci		free_pathname(&f);
2535f08c3bdfSopenharmony_ci		return;
2536f08c3bdfSopenharmony_ci	}
2537f08c3bdfSopenharmony_ci	lr = ((int64_t) random() << 32) + random();
2538f08c3bdfSopenharmony_ci	off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE);
2539f08c3bdfSopenharmony_ci	off %= maxfsize;
2540f08c3bdfSopenharmony_ci	e = truncate64_path(&f, off) < 0 ? errno : 0;
2541f08c3bdfSopenharmony_ci	check_cwd();
2542f08c3bdfSopenharmony_ci	if (v)
2543f08c3bdfSopenharmony_ci		printf("%d/%d: truncate %s %lld %d\n", procid, opno, f.path,
2544f08c3bdfSopenharmony_ci		       (long long)off, e);
2545f08c3bdfSopenharmony_ci	free_pathname(&f);
2546f08c3bdfSopenharmony_ci}
2547f08c3bdfSopenharmony_ci
2548f08c3bdfSopenharmony_civoid unlink_f(int opno, long r)
2549f08c3bdfSopenharmony_ci{
2550f08c3bdfSopenharmony_ci	int e;
2551f08c3bdfSopenharmony_ci	pathname_t f;
2552f08c3bdfSopenharmony_ci	fent_t *fep;
2553f08c3bdfSopenharmony_ci	flist_t *flp;
2554f08c3bdfSopenharmony_ci	int v;
2555f08c3bdfSopenharmony_ci
2556f08c3bdfSopenharmony_ci	init_pathname(&f);
2557f08c3bdfSopenharmony_ci	if (!get_fname(FT_NOTDIR, r, &f, &flp, &fep, &v)) {
2558f08c3bdfSopenharmony_ci		if (v)
2559f08c3bdfSopenharmony_ci			printf("%d/%d: unlink - no file\n", procid, opno);
2560f08c3bdfSopenharmony_ci		free_pathname(&f);
2561f08c3bdfSopenharmony_ci		return;
2562f08c3bdfSopenharmony_ci	}
2563f08c3bdfSopenharmony_ci	e = unlink_path(&f) < 0 ? errno : 0;
2564f08c3bdfSopenharmony_ci	check_cwd();
2565f08c3bdfSopenharmony_ci	if (e == 0)
2566f08c3bdfSopenharmony_ci		del_from_flist(flp - flist, fep - flp->fents);
2567f08c3bdfSopenharmony_ci	if (v)
2568f08c3bdfSopenharmony_ci		printf("%d/%d: unlink %s %d\n", procid, opno, f.path, e);
2569f08c3bdfSopenharmony_ci	free_pathname(&f);
2570f08c3bdfSopenharmony_ci}
2571f08c3bdfSopenharmony_ci
2572f08c3bdfSopenharmony_ci#ifndef NO_XFS
2573f08c3bdfSopenharmony_civoid unresvsp_f(int opno, long r)
2574f08c3bdfSopenharmony_ci{
2575f08c3bdfSopenharmony_ci	int e;
2576f08c3bdfSopenharmony_ci	pathname_t f;
2577f08c3bdfSopenharmony_ci	int fd;
2578f08c3bdfSopenharmony_ci	struct xfs_flock64 fl;
2579f08c3bdfSopenharmony_ci	__s64 lr;
2580f08c3bdfSopenharmony_ci	__s64 off;
2581f08c3bdfSopenharmony_ci	struct stat64 stb;
2582f08c3bdfSopenharmony_ci	int v;
2583f08c3bdfSopenharmony_ci
2584f08c3bdfSopenharmony_ci	init_pathname(&f);
2585f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) {
2586f08c3bdfSopenharmony_ci		if (v)
2587f08c3bdfSopenharmony_ci			printf("%d/%d: unresvsp - no filename\n", procid, opno);
2588f08c3bdfSopenharmony_ci		free_pathname(&f);
2589f08c3bdfSopenharmony_ci		return;
2590f08c3bdfSopenharmony_ci	}
2591f08c3bdfSopenharmony_ci	fd = open_path(&f, O_RDWR);
2592f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
2593f08c3bdfSopenharmony_ci	check_cwd();
2594f08c3bdfSopenharmony_ci	if (fd < 0) {
2595f08c3bdfSopenharmony_ci		if (v)
2596f08c3bdfSopenharmony_ci			printf("%d/%d: unresvsp - open %s failed %d\n",
2597f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
2598f08c3bdfSopenharmony_ci		free_pathname(&f);
2599f08c3bdfSopenharmony_ci		return;
2600f08c3bdfSopenharmony_ci	}
2601f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
2602f08c3bdfSopenharmony_ci		if (v)
2603f08c3bdfSopenharmony_ci			printf("%d/%d: unresvsp - fstat64 %s failed %d\n",
2604f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
2605f08c3bdfSopenharmony_ci		free_pathname(&f);
2606f08c3bdfSopenharmony_ci		close(fd);
2607f08c3bdfSopenharmony_ci		return;
2608f08c3bdfSopenharmony_ci	}
2609f08c3bdfSopenharmony_ci	lr = ((__s64) random() << 32) + random();
2610f08c3bdfSopenharmony_ci	off = lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE);
2611f08c3bdfSopenharmony_ci	off %= maxfsize;
2612f08c3bdfSopenharmony_ci	memset(&fl, 0, sizeof(fl));
2613f08c3bdfSopenharmony_ci	fl.l_whence = SEEK_SET;
2614f08c3bdfSopenharmony_ci	fl.l_start = off;
2615f08c3bdfSopenharmony_ci	fl.l_len = (__s64) (random() % (1 << 20));
2616f08c3bdfSopenharmony_ci	e = ioctl(fd, XFS_IOC_UNRESVSP64, &fl) < 0 ? errno : 0;
2617f08c3bdfSopenharmony_ci	if (v)
2618f08c3bdfSopenharmony_ci		printf("%d/%d: ioctl(XFS_IOC_UNRESVSP64) %s %lld %lld %d\n",
2619f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long)off,
2620f08c3bdfSopenharmony_ci		       (long long)fl.l_len, e);
2621f08c3bdfSopenharmony_ci	free_pathname(&f);
2622f08c3bdfSopenharmony_ci	close(fd);
2623f08c3bdfSopenharmony_ci}
2624f08c3bdfSopenharmony_ci#endif
2625f08c3bdfSopenharmony_ci
2626f08c3bdfSopenharmony_civoid write_f(int opno, long r)
2627f08c3bdfSopenharmony_ci{
2628f08c3bdfSopenharmony_ci	char *buf;
2629f08c3bdfSopenharmony_ci	int e;
2630f08c3bdfSopenharmony_ci	pathname_t f;
2631f08c3bdfSopenharmony_ci	int fd;
2632f08c3bdfSopenharmony_ci	size_t len;
2633f08c3bdfSopenharmony_ci	int64_t lr;
2634f08c3bdfSopenharmony_ci	off64_t off;
2635f08c3bdfSopenharmony_ci	struct stat64 stb;
2636f08c3bdfSopenharmony_ci	int v;
2637f08c3bdfSopenharmony_ci
2638f08c3bdfSopenharmony_ci	init_pathname(&f);
2639f08c3bdfSopenharmony_ci	if (!get_fname(FT_REGm, r, &f, NULL, NULL, &v)) {
2640f08c3bdfSopenharmony_ci		if (v)
2641f08c3bdfSopenharmony_ci			printf("%d/%d: write - no filename\n", procid, opno);
2642f08c3bdfSopenharmony_ci		free_pathname(&f);
2643f08c3bdfSopenharmony_ci		return;
2644f08c3bdfSopenharmony_ci	}
2645f08c3bdfSopenharmony_ci	fd = open_path(&f, O_WRONLY);
2646f08c3bdfSopenharmony_ci	e = fd < 0 ? errno : 0;
2647f08c3bdfSopenharmony_ci	check_cwd();
2648f08c3bdfSopenharmony_ci	if (fd < 0) {
2649f08c3bdfSopenharmony_ci		if (v)
2650f08c3bdfSopenharmony_ci			printf("%d/%d: write - open %s failed %d\n",
2651f08c3bdfSopenharmony_ci			       procid, opno, f.path, e);
2652f08c3bdfSopenharmony_ci		free_pathname(&f);
2653f08c3bdfSopenharmony_ci		return;
2654f08c3bdfSopenharmony_ci	}
2655f08c3bdfSopenharmony_ci	if (fstat64(fd, &stb) < 0) {
2656f08c3bdfSopenharmony_ci		if (v)
2657f08c3bdfSopenharmony_ci			printf("%d/%d: write - fstat64 %s failed %d\n",
2658f08c3bdfSopenharmony_ci			       procid, opno, f.path, errno);
2659f08c3bdfSopenharmony_ci		free_pathname(&f);
2660f08c3bdfSopenharmony_ci		close(fd);
2661f08c3bdfSopenharmony_ci		return;
2662f08c3bdfSopenharmony_ci	}
2663f08c3bdfSopenharmony_ci	lr = ((int64_t) random() << 32) + random();
2664f08c3bdfSopenharmony_ci	off = (off64_t) (lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE));
2665f08c3bdfSopenharmony_ci	off %= maxfsize;
2666f08c3bdfSopenharmony_ci	lseek64(fd, off, SEEK_SET);
2667f08c3bdfSopenharmony_ci	len = (random() % (getpagesize() * 32)) + 1;
2668f08c3bdfSopenharmony_ci	buf = malloc(len);
2669f08c3bdfSopenharmony_ci	memset(buf, nameseq & 0xff, len);
2670f08c3bdfSopenharmony_ci	e = write(fd, buf, len) < 0 ? errno : 0;
2671f08c3bdfSopenharmony_ci	free(buf);
2672f08c3bdfSopenharmony_ci	if (v)
2673f08c3bdfSopenharmony_ci		printf("%d/%d: write %s [%lld,%ld] %d\n",
2674f08c3bdfSopenharmony_ci		       procid, opno, f.path, (long long)off, (long int)len, e);
2675f08c3bdfSopenharmony_ci	free_pathname(&f);
2676f08c3bdfSopenharmony_ci	close(fd);
2677f08c3bdfSopenharmony_ci}
2678