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