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