fileop.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281
  1. /*
  2. * Author: Don Capps
  3. * 3/13/2006
  4. *
  5. * Author: Don Capps (capps@iozone.org)
  6. * 7417 Crenshaw
  7. * Plano, TX 75025
  8. *
  9. * Copyright 2006, 2007, 2008, 2009 Don Capps.
  10. *
  11. * License to freely use and distribute this software is hereby granted
  12. * by the author, subject to the condition that this copyright notice
  13. * remains intact. The author retains the exclusive right to publish
  14. * derivative works based on this work, including, but not limited to,
  15. * revised versions of this work",
  16. *
  17. *
  18. fileop [-f X ]|[-l # -u #] [-s Y] [-e] [-b] [-w] [-d <dir>] [-t] [-v] [-h]
  19. -f # Force factor. X^3 files will be created and removed.
  20. -l # Lower limit on the value of the Force factor.
  21. -u # Upper limit on the value of the Force factor.
  22. -s # Optional. Sets filesize for the create/write. May use suffix 'K' or 'M'.
  23. -e Excel importable format.
  24. -b Output best case.
  25. -w Output worst case.
  26. -d <dir> Specify starting directory.
  27. -U <dir> Mount point to remount between tests.
  28. -t Verbose output option.
  29. -n Single byte writes
  30. -v Version information.
  31. -h Help text.
  32. *
  33. * X is a force factor. The total number of files will
  34. * be X * X * X ( X ^ 3 )
  35. * The structure of the file tree is:
  36. * X number of Level 1 directories, with X number of
  37. * level 2 directories, with X number of files in each
  38. * of the level 2 directories.
  39. *
  40. * Example: fileop -f 2
  41. *
  42. * dir_1 dir_2
  43. * / \ / \
  44. * sdir_1 sdir_2 sdir_1 sdir_2
  45. * / \ / \ / \ / \
  46. * file_1 file_2 file_1 file_2 file_1 file_2 file_1 file_2
  47. *
  48. * Each file will be created, and then 1 byte is written to the file.
  49. *
  50. */
  51. #include <u.h>
  52. #include <libc.h>
  53. enum{
  54. pathMax = 255,
  55. statCreate = 0,
  56. statWrite = 1,
  57. statClose = 2,
  58. statDelete = 5,
  59. statStat = 6,
  60. statAccess = 7,
  61. statChmod = 8,
  62. statReaddir = 9,
  63. statDirCreate = 10,
  64. statDirDelete = 11,
  65. statRead = 12,
  66. statOpen = 13,
  67. statDirTraverse=14,
  68. numStats = 15
  69. };
  70. int junk, *junkp;
  71. int x,excel;
  72. int verbose = 0;
  73. int sz = 1;
  74. char *mbuffer;
  75. int incr = 1;
  76. int tinywrite = 0;
  77. struct stat_struct {
  78. double starttime;
  79. double endtime;
  80. double speed;
  81. double best;
  82. double worst;
  83. double dummy;
  84. double total_time;
  85. double dummy1;
  86. long long counter;
  87. } volatile stats[numStats];
  88. static double time_so_far(void);
  89. void dir_create(int);
  90. void dir_traverse(int);
  91. void dir_delete(int);
  92. void file_create(int);
  93. void file_stat(int);
  94. void file_access(int);
  95. void file_chmod(int);
  96. void file_readdir(int);
  97. void file_delete(int);
  98. void file_read(int);
  99. void splash(void);
  100. void usage(void);
  101. void bzero();
  102. void clear_stats();
  103. int validate(char *, int , char );
  104. char *getcwd(char *buf, size_t len);
  105. void rmdir(char *);
  106. void be2vlong(int64_t *, char *);
  107. char version[]=" $Revision: 1.61 $";
  108. char thedir[pathMax]="."; /* Default is to use the current directory */
  109. const char *mountname=nil; /* Default is not to unmount anything between the tests */
  110. const char *servername;
  111. int cret;
  112. int lower, upper,range;
  113. int i;
  114. int best, worst;
  115. int dirlen;
  116. /************************************************************************/
  117. /* Routine to purge the buffer cache by unmounting drive. */
  118. /************************************************************************/
  119. void purge_buffer_cache(){
  120. int fd;
  121. if (!mountname)
  122. return;
  123. char cwd[pathMax];
  124. int ret,i;
  125. junkp=(int *)getcwd(cwd, sizeof(cwd));
  126. junk=chdir("/");
  127. /*
  128. umount might fail if the device is still busy, so
  129. retry unmounting several times with increasing delays
  130. */
  131. for (i = 1; i < 10; ++i) {
  132. ret = unmount(nil, mountname);
  133. if (ret == 0)
  134. break;
  135. sleep(i); /* seconds */
  136. }
  137. fd = open(servername, ORDWR);
  138. if(fd < 0){
  139. fprint(2, "can't open %s", servername);
  140. exits("open");
  141. }
  142. mount(fd, -1, mountname, 0, "", 'M');
  143. junk=chdir(cwd);
  144. }
  145. int main(int argc, char **argv)
  146. {
  147. if(argc == 1)
  148. {
  149. usage();
  150. exits("usage");
  151. }
  152. char *aux;
  153. ARGBEGIN{
  154. case 'h':
  155. usage();
  156. exits(0);
  157. break;
  158. case 'd':
  159. aux=ARGF();
  160. dirlen=strlen(aux);
  161. if (aux[dirlen-1]=='/')
  162. --dirlen;
  163. strncpy(thedir, aux, dirlen);
  164. thedir[dirlen] = 0;
  165. break;
  166. case 'n':
  167. tinywrite = 1;
  168. break;
  169. case 'U':
  170. mountname = ARGF();
  171. break;
  172. case 'i': /* Increment force by */
  173. incr=atoi(ARGF());
  174. if(incr < 0)
  175. incr=1;
  176. break;
  177. case 'f': /* Force factor */
  178. x=atoi(ARGF());
  179. if(x < 0)
  180. x=1;
  181. break;
  182. case 's': /* Size of files */
  183. aux=ARGF();
  184. sz=atoi(aux);
  185. int szl=strlen(aux)-1;
  186. if(aux[szl]=='k' || aux[szl]=='K'){
  187. sz *= 1024;
  188. } else if(aux[szl]=='m' || aux[szl]=='M'){
  189. sz *= 1024 * 1024;
  190. }
  191. if(sz < 0)
  192. sz=1;
  193. break;
  194. case 'l': /* lower force value */
  195. lower=atoi(ARGF());
  196. range=1;
  197. if(lower < 0)
  198. lower=1;
  199. break;
  200. case 'v': /* version */
  201. splash();
  202. exits(0);
  203. break;
  204. case 'u': /* upper force value */
  205. upper=atoi(ARGF());
  206. range=1;
  207. if(upper < 0)
  208. upper=1;
  209. break;
  210. case 't': /* verbose */
  211. verbose=1;
  212. break;
  213. case 'e': /* Excel */
  214. excel=1;
  215. break;
  216. case 'b': /* Best */
  217. best=1;
  218. break;
  219. case 'w': /* Worst */
  220. worst=1;
  221. break;
  222. default:
  223. print("Bad flag: '%c' \n", ARGC());
  224. exits("badflag");
  225. }ARGEND
  226. mbuffer=(char *)malloc(sz);
  227. memset(mbuffer,'a',sz);
  228. if(!excel)
  229. print("\nFileop: Working in %s, File size is %d, Output is in Ops/sec. (A=Avg, B=Best, W=Worst)\n", thedir, sz);
  230. if(!verbose){
  231. print(" . %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %7s %10s\n",
  232. "mkdir","chdir","rmdir","create","open", "read","write","close","stat",
  233. "access","chmod","readdir","delete", " Total_files");
  234. }
  235. junk=chdir(thedir); /* change starting point */
  236. if(x==0)
  237. x=1;
  238. if(range==0)
  239. lower=upper=x;
  240. for(i=lower;i<=upper;i+=incr){
  241. clear_stats();
  242. x=i;
  243. /*
  244. * Dir Create test
  245. */
  246. purge_buffer_cache();
  247. dir_create(x);
  248. if(verbose){
  249. print("mkdir: Dirs = %9lld ",stats[statDirCreate].counter);
  250. print("Total Time = %12.9f seconds\n", stats[statDirCreate].total_time);
  251. print(" Avg mkdir(s)/sec = %12.2f (%12.9f seconds/op)\n",
  252. stats[statDirCreate].counter/stats[statDirCreate].total_time,
  253. stats[statDirCreate].total_time/stats[statDirCreate].counter);
  254. print(" Best mkdir(s)/sec = %12.2f (%12.9f seconds/op)\n",1/stats[statDirCreate].best,stats[statDirCreate].best);
  255. print(" Worst mkdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n",1/stats[statDirCreate].worst,stats[statDirCreate].worst);
  256. }
  257. /*
  258. * Dir Traverse test
  259. */
  260. purge_buffer_cache();
  261. dir_traverse(x);
  262. if(verbose){
  263. print("chdir: Dirs = %9lld ",stats[statDirTraverse].counter);
  264. print("Total Time = %12.9f seconds\n", stats[statDirTraverse].total_time);
  265. print(" Avg chdir(s)/sec = %12.2f (%12.9f seconds/op)\n",
  266. stats[statDirTraverse].counter/stats[statDirTraverse].total_time,
  267. stats[statDirTraverse].total_time/stats[statDirTraverse].counter);
  268. print(" Best chdir(s)/sec = %12.2f (%12.9f seconds/op)\n",1/stats[statDirTraverse].best,stats[statDirTraverse].best);
  269. print(" Worst chdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n",1/stats[statDirTraverse].worst,stats[statDirTraverse].worst);
  270. }
  271. /*
  272. * Dir delete test
  273. */
  274. purge_buffer_cache();
  275. dir_delete(x);
  276. if(verbose){
  277. print("rmdir: Dirs = %9lld ",stats[statDirDelete].counter);
  278. print("Total Time = %12.9f seconds\n",stats[statDirDelete].total_time);
  279. print(" Avg rmdir(s)/sec = %12.2f (%12.9f seconds/op)\n",
  280. stats[statDirDelete].counter/stats[statDirDelete].total_time,
  281. stats[statDirDelete].total_time/stats[statDirDelete].counter);
  282. print(" Best rmdir(s)/sec = %12.2f (%12.9f seconds/op)\n",1/stats[statDirDelete].best,stats[statDirDelete].best);
  283. print(" Worst rmdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n",1/stats[statDirDelete].worst,stats[statDirDelete].worst);
  284. }
  285. /*
  286. * Create test
  287. */
  288. purge_buffer_cache();
  289. file_create(x);
  290. if(verbose){
  291. print("create: Files = %9lld ",stats[statCreate].counter);
  292. print("Total Time = %12.9f seconds\n", stats[statCreate].total_time);
  293. print(" Avg create(s)/sec = %12.2f (%12.9f seconds/op)\n",
  294. stats[statCreate].counter/stats[statCreate].total_time,
  295. stats[statCreate].total_time/stats[statCreate].counter);
  296. print(" Best create(s)/sec = %12.2f (%12.9f seconds/op)\n",
  297. 1/stats[statCreate].best,stats[statCreate].best);
  298. print(" Worst create(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  299. 1/stats[statCreate].worst,stats[statCreate].worst);
  300. print("write: Files = %9lld ",stats[statWrite].counter);
  301. print("Total Time = %12.9f seconds\n", stats[statWrite].total_time);
  302. print(" Avg write(s)/sec = %12.2f (%12.9f seconds/op)\n",
  303. stats[statWrite].counter/stats[statWrite].total_time,
  304. stats[statWrite].total_time/stats[statWrite].counter);
  305. print(" Best write(s)/sec = %12.2f (%12.9f seconds/op)\n",
  306. 1/stats[statWrite].best,stats[statWrite].best);
  307. print(" Worst write(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  308. 1/stats[statWrite].worst,stats[statWrite].worst);
  309. print("close: Files = %9lld ",stats[statClose].counter);
  310. print("Total Time = %12.9f seconds\n", stats[statClose].total_time);
  311. print(" Avg close(s)/sec = %12.2f (%12.9f seconds/op)\n",
  312. stats[statClose].counter/stats[statClose].total_time,
  313. stats[statClose].total_time/stats[statClose].counter);
  314. print(" Best close(s)/sec = %12.2f (%12.9f seconds/op)\n",
  315. 1/stats[statClose].best,stats[statClose].best);
  316. print(" Worst close(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  317. 1/stats[statClose].worst,stats[statClose].worst);
  318. }
  319. /*
  320. * Stat test
  321. */
  322. purge_buffer_cache();
  323. file_stat(x);
  324. if(verbose){
  325. print("stat: Files = %9lld ",stats[statStat].counter);
  326. print("Total Time = %12.9f seconds\n", stats[statStat].total_time);
  327. print(" Avg stat(s)/sec = %12.2f (%12.9f seconds/op)\n",
  328. stats[statStat].counter/stats[statStat].total_time,
  329. stats[statStat].total_time/stats[statStat].counter);
  330. print(" Best stat(s)/sec = %12.2f (%12.9f seconds/op)\n",
  331. 1/stats[statStat].best,stats[statStat].best);
  332. print(" Worst stat(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  333. 1/stats[statStat].worst,stats[statStat].worst);
  334. }
  335. /*
  336. * Read test
  337. */
  338. purge_buffer_cache();
  339. file_read(x);
  340. if(verbose){
  341. print("open: Files = %9lld ",stats[statOpen].counter);
  342. print("Total Time = %12.9f seconds\n", stats[statOpen].total_time);
  343. print(" Avg open(s)/sec = %12.2f (%12.9f seconds/op)\n",
  344. stats[statOpen].counter/stats[statOpen].total_time,
  345. stats[statOpen].total_time/stats[statOpen].counter);
  346. print(" Best open(s)/sec = %12.2f (%12.9f seconds/op)\n",
  347. 1/stats[statOpen].best,stats[statOpen].best);
  348. print(" Worst open(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  349. 1/stats[statOpen].worst,stats[statOpen].worst);
  350. print("read: Files = %9lld ",stats[statRead].counter);
  351. print("Total Time = %12.9f seconds\n", stats[statRead].total_time);
  352. print(" Avg read(s)/sec = %12.2f (%12.9f seconds/op)\n",
  353. stats[statRead].counter/stats[statRead].total_time,
  354. stats[statRead].total_time/stats[statRead].counter);
  355. print(" Best read(s)/sec = %12.2f (%12.9f seconds/op)\n",
  356. 1/stats[statRead].best,stats[statRead].best);
  357. print(" Worst read(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  358. 1/stats[statRead].worst,stats[statRead].worst);
  359. }
  360. /*
  361. * Access test
  362. */
  363. purge_buffer_cache();
  364. file_access(x);
  365. if(verbose){
  366. print("access: Files = %9lld ",stats[statAccess].counter);
  367. print("Total Time = %12.9f seconds\n", stats[statAccess].total_time);
  368. print(" Avg access(s)/sec = %12.2f (%12.9f seconds/op)\n",
  369. stats[statAccess].counter/stats[statAccess].total_time,
  370. stats[statAccess].total_time/stats[statAccess].counter);
  371. print(" Best access(s)/sec = %12.2f (%12.9f seconds/op)\n",
  372. 1/stats[statAccess].best,stats[statAccess].best);
  373. print(" Worst access(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  374. 1/stats[statAccess].worst,stats[statAccess].worst);
  375. }
  376. /*
  377. * Chmod test
  378. */
  379. purge_buffer_cache();
  380. file_chmod(x);
  381. if(verbose){
  382. print("chmod: Files = %9lld ",stats[statChmod].counter);
  383. print("Total Time = %12.9f seconds\n", stats[statChmod].total_time);
  384. print(" Avg chmod(s)/sec = %12.2f (%12.9f seconds/op)\n",
  385. stats[statChmod].counter/stats[statChmod].total_time,
  386. stats[statChmod].total_time/stats[statChmod].counter);
  387. print(" Best chmod(s)/sec = %12.2f (%12.9f seconds/op)\n",
  388. 1/stats[statChmod].best,stats[statChmod].best);
  389. print(" Worst chmod(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  390. 1/stats[statChmod].worst,stats[statChmod].worst);
  391. }
  392. /*
  393. * readdir test
  394. */
  395. purge_buffer_cache();
  396. file_readdir(x);
  397. if(verbose){
  398. print("readdir: Files = %9lld ",stats[statReaddir].counter);
  399. print("Total Time = %12.9f seconds\n", stats[statReaddir].total_time);
  400. print(" Avg readdir(s)/sec = %12.2f (%12.9f seconds/op)\n",
  401. stats[statReaddir].counter/stats[statReaddir].total_time,
  402. stats[statReaddir].total_time/stats[statReaddir].counter);
  403. print(" Best readdir(s)/sec = %12.2f (%12.9f seconds/op)\n",
  404. 1/stats[statReaddir].best,stats[statReaddir].best);
  405. print(" Worst readdir(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  406. 1/stats[statReaddir].worst,stats[statReaddir].worst);
  407. }
  408. /*
  409. * Delete test
  410. */
  411. purge_buffer_cache();
  412. file_delete(x);
  413. if(verbose){
  414. print("delete: Files = %9lld ",stats[statDelete].counter);
  415. print("Total Time = %12.9f seconds\n", stats[statDelete].total_time);
  416. print(" Avg delete(s)/sec = %12.2f (%12.9f seconds/op)\n",
  417. stats[statDelete].counter/stats[statDelete].total_time,
  418. stats[statDelete].total_time/stats[statDelete].counter);
  419. print(" Best delete(s)/sec = %12.2f (%12.9f seconds/op)\n",
  420. 1/stats[statDelete].best,stats[statDelete].best);
  421. print(" Worst delete(s)/sec = %12.2f (%12.9f seconds/op)\n\n",
  422. 1/stats[statDelete].worst,stats[statDelete].worst);
  423. }
  424. if(!verbose){
  425. print("%c %4d %7.0f ",'A',x,stats[statDirCreate].counter/stats[statDirCreate].total_time);
  426. print("%7.0f ",stats[statDirTraverse].counter/stats[statDirTraverse].total_time);
  427. print("%7.0f ",stats[statDirDelete].counter/stats[statDirDelete].total_time);
  428. print("%7.0f ",stats[statCreate].counter/stats[statCreate].total_time);
  429. print("%7.0f ",stats[statOpen].counter/stats[statOpen].total_time);
  430. print("%7.0f ",stats[statRead].counter/stats[statRead].total_time);
  431. print("%7.0f ",stats[statWrite].counter/stats[statWrite].total_time);
  432. print("%7.0f ",stats[statClose].counter/stats[statClose].total_time);
  433. print("%7.0f ",stats[statStat].counter/stats[statStat].total_time);
  434. print("%7.0f ",stats[statAccess].counter/stats[statAccess].total_time);
  435. print("%7.0f ",stats[statChmod].counter/stats[statChmod].total_time);
  436. print("%7.0f ",stats[statReaddir].counter/stats[statReaddir].total_time);
  437. print("%7.0f ",stats[statDelete].counter/stats[statDelete].total_time);
  438. print("%10d ",x*x*x);
  439. print("\n");
  440. if(best){
  441. print("%c %4d %7.0f ",'B',x, 1/stats[statDirCreate].best);
  442. print("%7.0f ",1/stats[statDirTraverse].best);
  443. print("%7.0f ",1/stats[statDirDelete].best);
  444. print("%7.0f ",1/stats[statCreate].best);
  445. print("%7.0f ",1/stats[statOpen].best);
  446. print("%7.0f ",1/stats[statRead].best);
  447. print("%7.0f ",1/stats[statWrite].best);
  448. print("%7.0f ",1/stats[statClose].best);
  449. print("%7.0f ",1/stats[statStat].best);
  450. print("%7.0f ",1/stats[statAccess].best);
  451. print("%7.0f ",1/stats[statChmod].best);
  452. print("%7.0f ",1/stats[statReaddir].best);
  453. print("%7.0f ",1/stats[statDelete].best);
  454. print("%10d ",x*x*x);
  455. print("\n");
  456. //fflush(stdout);
  457. }
  458. if(worst){
  459. print("%c %4d %7.0f ",'W',x, 1/stats[statDirCreate].worst);
  460. print("%7.0f ",1/stats[statDirTraverse].worst);
  461. print("%7.0f ",1/stats[statDirDelete].worst);
  462. print("%7.0f ",1/stats[statCreate].worst);
  463. print("%7.0f ",1/stats[statOpen].worst);
  464. print("%7.0f ",1/stats[statRead].worst);
  465. print("%7.0f ",1/stats[statWrite].worst);
  466. print("%7.0f ",1/stats[statClose].worst);
  467. print("%7.0f ",1/stats[statStat].worst);
  468. print("%7.0f ",1/stats[statAccess].worst);
  469. print("%7.0f ",1/stats[statChmod].worst);
  470. print("%7.0f ",1/stats[statReaddir].worst);
  471. print("%7.0f ",1/stats[statDelete].worst);
  472. print("%10d ",x*x*x);
  473. print("\n");
  474. }
  475. }
  476. }
  477. return(0);
  478. }
  479. void
  480. dir_create(int x)
  481. {
  482. int i,j,k;
  483. int ret;
  484. char buf[100];
  485. stats[statDirCreate].best=(double)99999.9;
  486. stats[statDirCreate].worst=(double)0.00000000;
  487. for(i=0;i<x;i++)
  488. {
  489. sprint(buf,"fileop_L1_%d",i);
  490. stats[statDirCreate].starttime=time_so_far();
  491. ret = create(buf, OREAD, DMDIR | 0777);
  492. if(ret < 0)
  493. {
  494. print("Mkdir %s failed %r\n", buf);
  495. exits("mkdir");
  496. }
  497. close(ret);
  498. stats[statDirCreate].endtime=time_so_far();
  499. stats[statDirCreate].speed=stats[statDirCreate].endtime-stats[statDirCreate].starttime;
  500. if(stats[statDirCreate].speed < (double)0.0)
  501. stats[statDirCreate].speed=(double)0.0;
  502. stats[statDirCreate].total_time+=stats[statDirCreate].speed;
  503. stats[statDirCreate].counter++;
  504. if(stats[statDirCreate].speed < stats[statDirCreate].best)
  505. stats[statDirCreate].best=stats[statDirCreate].speed;
  506. if(stats[statDirCreate].speed > stats[statDirCreate].worst)
  507. stats[statDirCreate].worst=stats[statDirCreate].speed;
  508. junk=chdir(buf);
  509. for(j=0;j<x;j++)
  510. {
  511. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  512. stats[statDirCreate].starttime=time_so_far();
  513. ret = create(buf, OREAD, DMDIR | 0777);
  514. if(ret < 0){
  515. print("Mkdir %s failed %r\n", buf);
  516. exits("mkdir");
  517. }
  518. close(ret);
  519. stats[statDirCreate].endtime=time_so_far();
  520. stats[statDirCreate].speed=stats[statDirCreate].endtime-stats[statDirCreate].starttime;
  521. if(stats[statDirCreate].speed < (double)0.0)
  522. stats[statDirCreate].speed=(double) 0.0;
  523. stats[statDirCreate].total_time+=stats[statDirCreate].speed;
  524. stats[statDirCreate].counter++;
  525. if(stats[statDirCreate].speed < stats[statDirCreate].best)
  526. stats[statDirCreate].best=stats[statDirCreate].speed;
  527. if(stats[statDirCreate].speed > stats[statDirCreate].worst)
  528. stats[statDirCreate].worst=stats[statDirCreate].speed;
  529. junk=chdir(buf);
  530. for(k=0;k<x;k++){
  531. sprint(buf,"fileop_dir_%d_%d_%d",i,j,k);
  532. stats[statDirCreate].starttime=time_so_far();
  533. ret = create(buf, OREAD, DMDIR | 0777);
  534. if(ret < 0){
  535. print("Mkdir %s failed %r\n", buf);
  536. exits("mkdir");
  537. }
  538. close(ret);
  539. stats[statDirCreate].endtime=time_so_far();
  540. stats[statDirCreate].speed=stats[statDirCreate].endtime-stats[statDirCreate].starttime;
  541. if(stats[statDirCreate].speed < (double)0.0)
  542. stats[statDirCreate].speed=(double) 0.0;
  543. stats[statDirCreate].total_time+=stats[statDirCreate].speed;
  544. stats[statDirCreate].counter++;
  545. if(stats[statDirCreate].speed < stats[statDirCreate].best)
  546. stats[statDirCreate].best=stats[statDirCreate].speed;
  547. if(stats[statDirCreate].speed > stats[statDirCreate].worst)
  548. stats[statDirCreate].worst=stats[statDirCreate].speed;
  549. junk=chdir(buf);
  550. junk=chdir("..");
  551. }
  552. junk=chdir("..");
  553. }
  554. junk=chdir("..");
  555. }
  556. }
  557. void
  558. dir_traverse(int x){
  559. int i,j,k;
  560. char buf[100];
  561. double time1, time2;
  562. stats[statDirTraverse].best=(double)99999.9;
  563. stats[statDirTraverse].worst=(double)0.00000000;
  564. for(i=0;i<x;i++){
  565. sprint(buf,"fileop_L1_%d",i);
  566. stats[statDirTraverse].starttime=time_so_far();
  567. junk=chdir(buf);
  568. stats[statDirTraverse].endtime=time_so_far();
  569. time1=stats[statDirTraverse].endtime-stats[statDirTraverse].starttime;
  570. for(j=0;j<x;j++){
  571. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  572. stats[statDirTraverse].starttime=time_so_far();
  573. junk=chdir(buf);
  574. stats[statDirTraverse].endtime=time_so_far();
  575. time2=stats[statDirTraverse].endtime-stats[statDirTraverse].starttime;
  576. for(k=0;k<x;k++){
  577. sprint(buf,"fileop_dir_%d_%d_%d",i,j,k);
  578. stats[statDirTraverse].starttime=time_so_far();
  579. junk=chdir(buf);
  580. junk=chdir("..");
  581. stats[statDirTraverse].endtime=time_so_far();
  582. stats[statDirTraverse].speed=stats[statDirTraverse].endtime-stats[statDirTraverse].starttime;
  583. if(stats[statDirTraverse].speed < (double)0.0)
  584. stats[statDirTraverse].speed=(double) 0.0;
  585. stats[statDirTraverse].total_time+=stats[statDirTraverse].speed;
  586. stats[statDirTraverse].counter++;
  587. if(stats[statDirTraverse].speed < stats[statDirTraverse].best)
  588. stats[statDirTraverse].best=stats[statDirTraverse].speed;
  589. if(stats[statDirTraverse].speed > stats[statDirTraverse].worst)
  590. stats[statDirTraverse].worst=stats[statDirTraverse].speed;
  591. }
  592. stats[statDirTraverse].starttime=time_so_far();
  593. junk=chdir("..");
  594. stats[statDirTraverse].endtime=time_so_far();
  595. stats[statDirTraverse].speed=time2+stats[statDirTraverse].endtime-stats[statDirTraverse].starttime;
  596. if(stats[statDirTraverse].speed < (double)0.0)
  597. stats[statDirTraverse].speed=(double) 0.0;
  598. stats[statDirTraverse].total_time+=stats[statDirTraverse].speed;
  599. stats[statDirTraverse].counter++;
  600. if(stats[statDirTraverse].speed < stats[statDirTraverse].best)
  601. stats[statDirTraverse].best=stats[statDirTraverse].speed;
  602. if(stats[statDirTraverse].speed > stats[statDirTraverse].worst)
  603. stats[statDirTraverse].worst=stats[statDirTraverse].speed;
  604. }
  605. stats[statDirTraverse].starttime=time_so_far();
  606. junk=chdir("..");
  607. stats[statDirTraverse].endtime=time_so_far();
  608. stats[statDirTraverse].speed=time1+stats[statDirTraverse].endtime-stats[statDirTraverse].starttime;
  609. if(stats[statDirTraverse].speed < (double)0.0)
  610. stats[statDirTraverse].speed=(double)0.0;
  611. stats[statDirTraverse].total_time+=stats[statDirTraverse].speed;
  612. stats[statDirTraverse].counter++;
  613. if(stats[statDirTraverse].speed < stats[statDirTraverse].best)
  614. stats[statDirTraverse].best=stats[statDirTraverse].speed;
  615. if(stats[statDirTraverse].speed > stats[statDirTraverse].worst)
  616. stats[statDirTraverse].worst=stats[statDirTraverse].speed;
  617. }
  618. }
  619. void
  620. file_create(int x){
  621. int i,j,k,l;
  622. int fd;
  623. int ret;
  624. char buf[100];
  625. char value;
  626. stats[statCreate].best=(double)999999.9;
  627. stats[statCreate].worst=(double)0.0;
  628. stats[statWrite].best=(double)999999.9;
  629. stats[statWrite].worst=(double)0.0;
  630. stats[statClose].best=(double)999999.9;
  631. stats[statClose].worst=(double)0.0;
  632. for(i=0;i<x;i++){
  633. sprint(buf,"fileop_L1_%d",i);
  634. ret = create(buf, OREAD, DMDIR | 0777);
  635. if(ret < 0){
  636. print("Mkdir %s failed %r\n", buf);
  637. exits("mkdir");
  638. }
  639. close(ret);
  640. junk=chdir(buf);
  641. for(j=0;j<x;j++){
  642. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  643. ret = create(buf, OREAD, DMDIR | 0777);
  644. if(ret < 0){
  645. print("Mkdir %s failed %r\n", buf);
  646. exits("mkdir");
  647. }
  648. close(ret);
  649. junk=chdir(buf);
  650. for(k=0;k<x;k++){
  651. sprint(buf,"fileop_file_%d_%d_%d",i,j,k);
  652. value=(char) ((i^j^k) & 0xff);
  653. memset(mbuffer,value,sz);
  654. stats[statCreate].starttime=time_so_far();
  655. fd=create(buf, ORDWR, 0600);
  656. if(fd < 0){
  657. print("Create failed\n");
  658. exits("createfile");
  659. }
  660. stats[statCreate].endtime=time_so_far();
  661. stats[statCreate].speed=stats[statCreate].endtime-stats[statCreate].starttime;
  662. if(stats[statCreate].speed < (double)0.0)
  663. stats[statCreate].speed=(double)0.0;
  664. stats[statCreate].total_time+=stats[statCreate].speed;
  665. stats[statCreate].counter++;
  666. if(stats[statCreate].speed < stats[statCreate].best)
  667. stats[statCreate].best=stats[statCreate].speed;
  668. if(stats[statCreate].speed > stats[statCreate].worst)
  669. stats[statCreate].worst=stats[statCreate].speed;
  670. stats[statWrite].starttime=time_so_far();
  671. if(tinywrite){
  672. for(l=0;l<sz;l++){
  673. junk=write(fd,&mbuffer[l],1);
  674. }
  675. }else{
  676. junk=write(fd,mbuffer,sz);
  677. }
  678. stats[statWrite].endtime=time_so_far();
  679. stats[statWrite].counter++;
  680. stats[statWrite].speed=stats[statWrite].endtime-stats[statWrite].starttime;
  681. if(stats[statWrite].speed < (double)0.0)
  682. stats[statWrite].speed=(double)0.0;
  683. stats[statWrite].total_time+=stats[statWrite].speed;
  684. if(stats[statWrite].speed < stats[statWrite].best)
  685. stats[statWrite].best=stats[statWrite].speed;
  686. if(stats[statWrite].speed > stats[statWrite].worst)
  687. stats[statWrite].worst=stats[statWrite].speed;
  688. stats[statClose].starttime=time_so_far();
  689. close(fd);
  690. stats[statClose].endtime=time_so_far();
  691. stats[statClose].speed=stats[statClose].endtime-stats[statClose].starttime;
  692. if(stats[statClose].speed < (double)0.0)
  693. stats[statClose].speed=(double)0.0;
  694. stats[statClose].total_time+=stats[statClose].speed;
  695. stats[statClose].counter++;
  696. if(stats[statClose].speed < stats[statClose].best)
  697. stats[statClose].best=stats[statClose].speed;
  698. if(stats[statClose].speed > stats[statClose].worst)
  699. stats[statClose].worst=stats[statClose].speed;
  700. }
  701. junk=chdir("..");
  702. }
  703. junk=chdir("..");
  704. }
  705. }
  706. void
  707. file_stat(int x)
  708. {
  709. int i,j,k;
  710. char buf[100];
  711. Dir *dir;
  712. stats[statStat].best=(double)99999.9;
  713. stats[statStat].worst=(double)0.00000000;
  714. for(i=0;i<x;i++){
  715. sprint(buf,"fileop_L1_%d",i);
  716. junk=chdir(buf);
  717. for(j=0;j<x;j++){
  718. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  719. junk=chdir(buf);
  720. for(k=0;k<x;k++){
  721. sprint(buf,"fileop_file_%d_%d_%d",i,j,k);
  722. stats[statStat].starttime=time_so_far();
  723. dir = dirstat(buf);
  724. if(dir == nil){
  725. fprint(2, "file_stat: can't stat %s: %r\n", buf);
  726. exits("stat");
  727. }
  728. stats[statStat].endtime=time_so_far();
  729. stats[statStat].speed=stats[statStat].endtime-stats[statStat].starttime;
  730. if(stats[statStat].speed < (double)0.0)
  731. stats[statStat].speed=(double)0.0;
  732. stats[statStat].total_time+=stats[statStat].speed;
  733. stats[statStat].counter++;
  734. if(stats[statStat].speed < stats[statStat].best)
  735. stats[statStat].best=stats[statStat].speed;
  736. if(stats[statStat].speed > stats[statStat].worst)
  737. stats[statStat].worst=stats[statStat].speed;
  738. }
  739. junk=chdir("..");
  740. }
  741. junk=chdir("..");
  742. }
  743. }
  744. void
  745. file_access(int x)
  746. {
  747. int i,j,k,y;
  748. char buf[100];
  749. stats[statAccess].best=(double)999999.9;
  750. stats[statAccess].worst=(double)0.0;
  751. for(i=0;i<x;i++){
  752. sprint(buf,"fileop_L1_%d",i);
  753. junk=chdir(buf);
  754. for(j=0;j<x;j++){
  755. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  756. junk=chdir(buf);
  757. for(k=0;k<x;k++){
  758. sprint(buf,"fileop_file_%d_%d_%d",i,j,k);
  759. stats[statAccess].starttime=time_so_far();
  760. y=access(buf,AWRITE);
  761. if(y < 0){
  762. print("access failed\n");
  763. perror("what");
  764. exits("access");
  765. }
  766. stats[statAccess].endtime=time_so_far();
  767. stats[statAccess].speed=stats[statAccess].endtime-stats[statAccess].starttime;
  768. if(stats[statAccess].speed < (double)0.0)
  769. stats[statAccess].speed=(double)0.0;
  770. stats[statAccess].total_time+=stats[statAccess].speed;
  771. stats[statAccess].counter++;
  772. if(stats[statAccess].speed < stats[statAccess].best)
  773. stats[statAccess].best=stats[statAccess].speed;
  774. if(stats[statAccess].speed > stats[statAccess].worst)
  775. stats[statAccess].worst=stats[statAccess].speed;
  776. }
  777. junk=chdir("..");
  778. }
  779. junk=chdir("..");
  780. }
  781. }
  782. void
  783. file_chmod(int x)
  784. {
  785. int i,j,k;
  786. char buf[100];
  787. Dir *dir, ndir;
  788. stats[statChmod].best=(double)999999.9;
  789. stats[statChmod].worst=(double)0.0;
  790. for(i=0;i<x;i++){
  791. sprint(buf,"fileop_L1_%d",i);
  792. junk=chdir(buf);
  793. for(j=0;j<x;j++){
  794. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  795. junk=chdir(buf);
  796. for(k=0;k<x;k++){
  797. sprint(buf,"fileop_file_%d_%d_%d",i,j,k);
  798. stats[statChmod].starttime=time_so_far();
  799. dir = dirstat(buf);
  800. if(dir == nil){
  801. fprint(2, "chmod: can't stat %s: %r\n", buf);
  802. exits("chmod");
  803. }
  804. nulldir(&ndir);
  805. ndir.mode = (dir->mode & 0666);
  806. free(dir);
  807. if(dirwstat(buf, &ndir)==-1){
  808. fprint(2, "chmod: can't wstat %s: %r\n", buf);
  809. exits("chmod");
  810. }
  811. stats[statChmod].endtime=time_so_far();
  812. stats[statChmod].speed=stats[statChmod].endtime-stats[statChmod].starttime;
  813. if(stats[statChmod].speed < (double)0.0)
  814. stats[statChmod].speed=(double)0.0;
  815. stats[statChmod].total_time+=stats[statChmod].speed;
  816. stats[statChmod].counter++;
  817. if(stats[statChmod].speed < stats[statChmod].best)
  818. stats[statChmod].best=stats[statChmod].speed;
  819. if(stats[statChmod].speed > stats[statChmod].worst)
  820. stats[statChmod].worst=stats[statChmod].speed;
  821. }
  822. junk=chdir("..");
  823. }
  824. junk=chdir("..");
  825. }
  826. }
  827. void
  828. file_readdir(int x){
  829. int i,j,ret1, fd;
  830. char buf[100];
  831. Dir *dirbuf;
  832. long y;
  833. stats[statReaddir].best=(double)999999.9;
  834. stats[statReaddir].worst=(double)0.0;
  835. for(i=0;i<x;i++){
  836. sprint(buf,"fileop_L1_%d",i);
  837. junk=chdir(buf);
  838. for(j=0;j<x;j++){
  839. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  840. junk=chdir(buf);
  841. fd = open(".", OREAD);
  842. if(fd<0){
  843. print("opendir failed\n");
  844. exits("opendir");
  845. }
  846. stats[statReaddir].starttime=time_so_far();
  847. if((y = dirreadall(fd, &dirbuf))<0){
  848. print("readdir failed\n");
  849. exits("readdir");
  850. }
  851. stats[statReaddir].endtime=time_so_far();
  852. stats[statReaddir].speed=stats[statReaddir].endtime-stats[statReaddir].starttime;
  853. if(stats[statReaddir].speed < (double)0.0)
  854. stats[statReaddir].speed=(double)0.0;
  855. stats[statReaddir].total_time+=stats[statReaddir].speed;
  856. stats[statReaddir].counter++;
  857. if(stats[statReaddir].speed < stats[statReaddir].best)
  858. stats[statReaddir].best=stats[statReaddir].speed;
  859. if(stats[statReaddir].speed > stats[statReaddir].worst)
  860. stats[statReaddir].worst=stats[statReaddir].speed;
  861. ret1=close(fd);
  862. if(ret1 < 0){
  863. print("closedir failed\n");
  864. exits("closedir");
  865. }
  866. junk=chdir("..");
  867. }
  868. junk=chdir("..");
  869. }
  870. }
  871. void
  872. dir_delete(int x)
  873. {
  874. int i,j,k;
  875. char buf[100];
  876. stats[statDirDelete].best=(double)99999.9;
  877. stats[statDirDelete].worst=(double)0.00000000;
  878. for(i=0;i<x;i++){
  879. sprint(buf,"fileop_L1_%d",i);
  880. junk=chdir(buf);
  881. for(j=0;j<x;j++){
  882. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  883. junk=chdir(buf);
  884. for(k=0;k<x;k++){
  885. sprint(buf,"fileop_dir_%d_%d_%d",i,j,k);
  886. junk=chdir(buf);
  887. junk=chdir("..");
  888. stats[statDirDelete].starttime=time_so_far();
  889. rmdir(buf);
  890. stats[statDirDelete].endtime=time_so_far();
  891. stats[statDirDelete].speed=stats[statDirDelete].endtime-stats[statDirDelete].starttime;
  892. if(stats[statDirDelete].speed < (double)0.0)
  893. stats[statDirDelete].speed=(double)0.0;
  894. stats[statDirDelete].total_time+=stats[statDirDelete].speed;
  895. stats[statDirDelete].counter++;
  896. if(stats[statDirDelete].speed < stats[statDirDelete].best)
  897. stats[statDirDelete].best=stats[statDirDelete].speed;
  898. if(stats[statDirDelete].speed > stats[statDirDelete].worst)
  899. stats[statDirDelete].worst=stats[statDirDelete].speed;
  900. }
  901. junk=chdir("..");
  902. if(junk < 0){
  903. print("%r\n");
  904. }
  905. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  906. stats[statDirDelete].starttime=time_so_far();
  907. rmdir(buf);
  908. stats[statDirDelete].endtime=time_so_far();
  909. stats[statDirDelete].speed=stats[statDirDelete].endtime-stats[statDirDelete].starttime;
  910. if(stats[statDirDelete].speed < (double)0.0)
  911. stats[statDirDelete].speed=(double)0.0;
  912. stats[statDirDelete].total_time+=stats[statDirDelete].speed;
  913. stats[statDirDelete].counter++;
  914. if(stats[statDirDelete].speed < stats[statDirDelete].best)
  915. stats[statDirDelete].best=stats[statDirDelete].speed;
  916. if(stats[statDirDelete].speed > stats[statDirDelete].worst)
  917. stats[statDirDelete].worst=stats[statDirDelete].speed;
  918. }
  919. junk=chdir("..");
  920. sprint(buf,"fileop_L1_%d",i);
  921. stats[statDirDelete].starttime=time_so_far();
  922. rmdir(buf);
  923. stats[statDirDelete].endtime=time_so_far();
  924. stats[statDirDelete].speed=stats[statDirDelete].endtime-stats[statDirDelete].starttime;
  925. if(stats[statDirDelete].speed < (double)0.0)
  926. stats[statDirDelete].speed=(double)0.0;
  927. stats[statDirDelete].total_time+=stats[statDirDelete].speed;
  928. stats[statDirDelete].counter++;
  929. if(stats[statDirDelete].speed < stats[statDirDelete].best)
  930. stats[statDirDelete].best=stats[statDirDelete].speed;
  931. if(stats[statDirDelete].speed > stats[statDirDelete].worst)
  932. stats[statDirDelete].worst=stats[statDirDelete].speed;
  933. }
  934. }
  935. void
  936. file_delete(int x)
  937. {
  938. int i,j,k;
  939. char buf[100];
  940. stats[statDelete].best=(double)999999.9;
  941. stats[statDelete].worst=(double)0.0;
  942. for(i=0;i<x;i++){
  943. sprint(buf,"fileop_L1_%d",i);
  944. junk=chdir(buf);
  945. for(j=0;j<x;j++){
  946. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  947. junk=chdir(buf);
  948. for(k=0;k<x;k++){
  949. sprint(buf,"fileop_file_%d_%d_%d",i,j,k);
  950. stats[statDelete].starttime=time_so_far();
  951. remove(buf);
  952. stats[statDelete].endtime=time_so_far();
  953. stats[statDelete].speed=stats[statDelete].endtime-stats[statDelete].starttime;
  954. if(stats[statDelete].speed < (double)0.0)
  955. stats[statDelete].speed=(double)0.0;
  956. stats[statDelete].total_time+=stats[statDelete].speed;
  957. stats[statDelete].counter++;
  958. if(stats[statDelete].speed < stats[statDelete].best)
  959. stats[statDelete].best=stats[statDelete].speed;
  960. if(stats[statDelete].speed > stats[statDelete].worst)
  961. stats[statDelete].worst=stats[statDelete].speed;
  962. }
  963. junk=chdir("..");
  964. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  965. rmdir(buf);
  966. }
  967. junk=chdir("..");
  968. sprint(buf,"fileop_L1_%d",i);
  969. rmdir(buf);
  970. }
  971. }
  972. void
  973. file_read(int x)
  974. {
  975. int i,j,k,y,fd;
  976. char buf[100];
  977. char value;
  978. stats[statRead].best=(double)99999.9;
  979. stats[statRead].worst=(double)0.00000000;
  980. stats[statOpen].best=(double)99999.9;
  981. stats[statOpen].worst=(double)0.00000000;
  982. for(i=0;i<x;i++){
  983. sprint(buf,"fileop_L1_%d",i);
  984. junk=chdir(buf);
  985. for(j=0;j<x;j++){
  986. sprint(buf,"fileop_L1_%d_L2_%d",i,j);
  987. junk=chdir(buf);
  988. for(k=0;k<x;k++){
  989. sprint(buf,"fileop_file_%d_%d_%d",i,j,k);
  990. value=(char)((i^j^k) &0xff);
  991. stats[statOpen].starttime=time_so_far();
  992. fd=open(buf,OREAD);
  993. if(fd < 0){
  994. print("Open failed\n");
  995. exits("openfile");
  996. }
  997. stats[statOpen].endtime=time_so_far();
  998. stats[statOpen].speed=stats[statOpen].endtime-stats[statOpen].starttime;
  999. if(stats[statOpen].speed < (double)0.0)
  1000. stats[statOpen].speed=(double)0.0;
  1001. stats[statOpen].total_time+=stats[statOpen].speed;
  1002. stats[statOpen].counter++;
  1003. if(stats[statOpen].speed < stats[statOpen].best)
  1004. stats[statOpen].best=stats[statOpen].speed;
  1005. if(stats[statOpen].speed > stats[statOpen].worst)
  1006. stats[statOpen].worst=stats[statOpen].speed;
  1007. stats[statRead].starttime=time_so_far();
  1008. y=read(fd,mbuffer,sz);
  1009. if(y < 0){
  1010. print("Read failed\n");
  1011. exits("read");
  1012. }
  1013. if(validate(mbuffer,sz, value) !=0)
  1014. print("Error: Data Mis-compare\n");;
  1015. stats[statRead].endtime=time_so_far();
  1016. close(fd);
  1017. stats[statRead].speed=stats[statRead].endtime-stats[statRead].starttime;
  1018. if(stats[statRead].speed < (double)0.0)
  1019. stats[statRead].speed=(double)0.0;
  1020. stats[statRead].total_time+=stats[statRead].speed;
  1021. stats[statRead].counter++;
  1022. if(stats[statRead].speed < stats[statRead].best)
  1023. stats[statRead].best=stats[statRead].speed;
  1024. if(stats[statRead].speed > stats[statRead].worst)
  1025. stats[statRead].worst=stats[statRead].speed;
  1026. }
  1027. junk=chdir("..");
  1028. }
  1029. junk=chdir("..");
  1030. }
  1031. }
  1032. /************************************************************************/
  1033. /* Time measurement routines. Thanks to Iozone :-) */
  1034. /************************************************************************/
  1035. static double
  1036. time_so_far(){
  1037. static int fd = -1;
  1038. int tv_sec, tv_usec;
  1039. char b[8];
  1040. int64_t t;
  1041. if(fd <0 )
  1042. if ((fd = open("/dev/bintime", OREAD|OCEXEC)) < 0)
  1043. return 0;
  1044. if(pread(fd, b, sizeof b, 0) != sizeof b){
  1045. close(fd);
  1046. fd=-1;
  1047. return 0;
  1048. }
  1049. be2vlong(&t, b);
  1050. tv_sec = t/1000000000;
  1051. tv_usec = (t/1000)%1000000;
  1052. return ((double) (tv_sec)) + (((double)tv_usec) * 0.000001 );
  1053. }
  1054. void
  1055. be2vlong(int64_t *to, char *f)
  1056. {
  1057. static uint64_t order = 0x0001020304050607ULL;
  1058. char *t, *o;
  1059. int i;
  1060. t = (char*)to;
  1061. o = (char*)&order;
  1062. for(i = 0; i < 8; i++)
  1063. t[o[i]] = f[i];
  1064. }
  1065. void
  1066. splash(void)
  1067. {
  1068. print("\n");
  1069. print(" --------------------------------------\n");
  1070. print(" | Fileop | \n");
  1071. print(" | %s | \n",version);
  1072. print(" | | \n");
  1073. print(" | by |\n");
  1074. print(" | | \n");
  1075. print(" | Don Capps |\n");
  1076. print(" --------------------------------------\n");
  1077. print("\n");
  1078. }
  1079. void
  1080. usage(void)
  1081. {
  1082. splash();
  1083. print(" fileop [-f X ]|[-l # -u #] [-s Y] [-e] [-b] [-w] [-d <dir>] [-t] [-v] [-h]\n");
  1084. print("\n");
  1085. print(" -f # Force factor. X^3 files will be created and removed.\n");
  1086. print(" -l # Lower limit on the value of the Force factor.\n");
  1087. print(" -u # Upper limit on the value of the Force factor.\n");
  1088. print(" -s # Optional. Sets filesize for the create/write. May use suffix 'K' or 'M'.\n");
  1089. print(" -e Excel importable format.\n");
  1090. print(" -b Output best case results.\n");
  1091. print(" -i # Increment force factor by this increment.\n");
  1092. print(" -w Output worst case results.\n");
  1093. print(" -d <dir> Specify starting directory.\n");
  1094. print(" -U <dir> Mount point to remount between tests.\n");
  1095. print(" -t Verbose output option.\n");
  1096. print(" -n Single byte writes\n");
  1097. print(" -v Version information.\n");
  1098. print(" -h Help text.\n");
  1099. print("\n");
  1100. print(" The structure of the file tree is:\n");
  1101. print(" X number of Level 1 directories, with X number of\n");
  1102. print(" level 2 directories, with X number of files in each\n");
  1103. print(" of the level 2 directories.\n");
  1104. print("\n");
  1105. print(" Example: fileop -f 2\n");
  1106. print("\n");
  1107. print(" dir_1 dir_2\n");
  1108. print(" / \\ / \\ \n");
  1109. print(" sdir_1 sdir_2 sdir_1 sdir_2\n");
  1110. print(" / \\ / \\ / \\ / \\ \n");
  1111. print(" file_1 file_2 file_1 file_2 file_1 file_2 file_1 file_2\n");
  1112. print("\n");
  1113. print(" Each file will be created, and then Y bytes is written to the file.\n");
  1114. print("\n");
  1115. }
  1116. void
  1117. clear_stats()
  1118. {
  1119. int i;
  1120. for(i=0;i<numStats;i++)
  1121. bzero((char *)&stats[i],sizeof(struct stat_struct));
  1122. }
  1123. int
  1124. validate(char *buffer, int size, char value)
  1125. {
  1126. register int i;
  1127. register char *cp;
  1128. register char v1;
  1129. v1=value;
  1130. cp = buffer;
  1131. for(i=0;i<size;i++)
  1132. {
  1133. if(*cp++ != v1)
  1134. return(1);
  1135. }
  1136. return(0);
  1137. }
  1138. char*
  1139. getcwd(char *buf, size_t len)
  1140. {
  1141. int fd;
  1142. fd = open(".", OREAD);
  1143. if(fd < 0) {
  1144. return nil;
  1145. }
  1146. if(fd2path(fd, buf, len) < 0) {
  1147. close(fd);
  1148. return nil;
  1149. }
  1150. close(fd);
  1151. return buf;
  1152. }
  1153. void
  1154. rmdir(char *f){
  1155. char *name;
  1156. int fd, i, j, n, ndir, nname;
  1157. Dir *dirbuf;
  1158. fd = open(f, OREAD);
  1159. if(fd < 0){
  1160. print("Error openning '%s'\n", f);
  1161. exits("open");
  1162. }
  1163. n = dirreadall(fd, &dirbuf);
  1164. close(fd);
  1165. if(n < 0){
  1166. print("Error dirreadall\n");
  1167. exits("dirreadall");
  1168. }
  1169. nname = strlen(f)+1+STATMAX+1; /* plenty! */
  1170. name = malloc(nname);
  1171. if(name == 0){
  1172. print("Error memory allocation\n");
  1173. exits("memory allocation");
  1174. }
  1175. ndir = 0;
  1176. for(i=0; i<n; i++){
  1177. snprint(name, nname, "%s/%s", f, dirbuf[i].name);
  1178. if(remove(name) != -1)
  1179. dirbuf[i].qid.type = QTFILE; /* so we won't recurse */
  1180. else{
  1181. if(dirbuf[i].qid.type & QTDIR)
  1182. ndir++;
  1183. else {
  1184. print("Error removing '%s'\n", name);
  1185. exits("remove");
  1186. }
  1187. }
  1188. }
  1189. if(ndir)
  1190. for(j=0; j<n; j++)
  1191. if(dirbuf[j].qid.type & QTDIR){
  1192. snprint(name, nname, "%s/%s", f, dirbuf[j].name);
  1193. rmdir(name);
  1194. }
  1195. if(remove(f) == -1) {
  1196. print("Error removing '%s'\n", name);
  1197. exits("remove");
  1198. }
  1199. free(name);
  1200. free(dirbuf);
  1201. }
  1202. void
  1203. bzero(void *a, size_t n)
  1204. {
  1205. memset(a, 0, n);
  1206. }