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