2 static char sfs_3_opsSid[] = "@(#)sfs_3_ops.c 2.1 97/10/23";
6 * Copyright (c) 1992-1997,2001 by Standard Performance Evaluation Corporation
8 * Standard Performance Evaluation Corporation (SPEC)
9 * 6585 Merchant Place, Suite 100
12 * This product contains benchmarks acquired from several sources who
13 * understand and agree with SPEC's goal of creating fair and objective
14 * benchmarks to measure computer performance.
16 * This copyright notice is placed here only to protect SPEC in the
17 * event the source is misused in any manner that is contrary to the
18 * spirit, the goals and the intent of SPEC.
20 * The source code is provided to the user or company under the license
21 * agreement for the SPEC Benchmark Suite for this product.
24 /*****************************************************************
26 * Copyright 1991,1992 Legato Systems, Inc. *
27 * Copyright 1991,1992 Auspex Systems, Inc. *
28 * Copyright 1991,1992 Data General Corporation *
29 * Copyright 1991,1992 Digital Equipment Corporation *
30 * Copyright 1991,1992 Interphase Corporation *
31 * Copyright 1991,1992 Sun Microsystems, Inc. *
33 *****************************************************************/
40 #include <sys/types.h>
44 #include "sfs_c_def.h"
45 #include "rfs_c_def.h"
47 extern fh_map_t * lookup_fh (char * trace_fh);
49 char * lookup_fhandle(char * fhandle)
52 fh = lookup_fh(fhandle);
54 return ((char *)&fh->play_fh);
58 #define setarg_fhandle(fhp) \
60 t = strstr (line, "fh"); \
65 (void) memmove((char *)fhp, &(fh->play_fh), \
69 void setarg_getattr (int index, char * line, GETATTR3args * args)
72 setarg_fhandle(&args->object);
75 struct ladtime * adjust_time (struct timeval tm, int * sec, int * usec)
77 struct ladtime trace_pkt_time;
78 static struct ladtime trace_arg_time;
79 struct timeval curtmp;
82 /* not sure whether sec ==0 means anything special, do not adjust the timestamp for this */
85 RFS_ASSERT (*usec == 0);
86 trace_arg_time.sec = 0;
87 trace_arg_time.usec = 0;
88 return (&trace_arg_time);
90 trace_pkt_time.sec = tm.tv_sec;
91 trace_pkt_time.usec = tm.tv_usec;
93 trace_arg_time.sec = *sec;
94 trace_arg_time.usec = *usec;
96 gettimeofday(&curtmp, NULL);
97 cur.sec = curtmp.tv_sec;
98 cur.usec = curtmp.tv_usec;
100 //fprintf (stderr, "trace_pkt_time %d.%d trace_arg_time %d.%d cur %d.%d\n", trace_pkt_time.sec, trace_pkt_time.usec, trace_arg_time.sec, trace_arg_time.usec, cur.sec, cur.usec);
102 ADDTIME (trace_arg_time, cur);
103 //fprintf(stderr, "after add, %d.%d\n", trace_arg_time.sec, trace_arg_time.usec);
104 RFS_ASSERT (LARGERTIME (trace_arg_time, trace_pkt_time));
105 SUBTIME (trace_arg_time, trace_pkt_time);
106 return (&trace_arg_time);
109 char * parse_create_mode(char * t, createmode3 * mode)
113 /* anyway, we can not get concrete result from the trace, just chose this mode */
117 char * parse_sattr3(char * t, sattr3 * args, sattrguard3 * guard, int index)
122 /* set the default value of SETATTR3args->*/
123 args->mode.set_it = FALSE;
124 args->uid.set_it = FALSE;
125 args->gid.set_it = FALSE;
126 args->size.set_it = FALSE;
127 args->atime.set_it = FALSE;
128 args->mtime.set_it = FALSE;
130 //fprintf(stderr, "parse_sattr: line %s\n", t);
132 if (!strncmp (t, "mode", 4)) {
135 args->mode.set_it = TRUE;
136 args->mode.mode = i; // (uint32_t) 0666;
137 } else if (!strncmp (t, "ctime", 5)) {
140 RFS_ASSERT (strncmp(t, "SERVER", 6));
141 sscanf (t, "%d.%d", &i, &j);
142 tm = adjust_time (dep_tab[index].timestamp, &i, &j);
143 #ifndef IGNORE_SETATTR_CTIME
146 guard->obj_ctime.seconds = tm->sec;
147 guard->obj_ctime.nseconds = tm->usec*1000;
148 } else if (!strncmp (t, "atime", 5)) {
150 if (!strncmp(t, "SERVER", 6)) {
151 args->atime.set_it = SET_TO_SERVER_TIME;
153 args->atime.set_it = SET_TO_CLIENT_TIME;
154 sscanf (t, "%d.%d", &i, &j);
157 args->atime.atime.seconds = 0;
158 args->atime.atime.nseconds = 0;
160 tm = adjust_time (dep_tab[index].timestamp, &i, &j);
161 args->atime.atime.seconds = tm->sec;
162 args->atime.atime.nseconds = tm->usec * 1000;
165 } else if (!strncmp (t, "mtime", 5)) {
167 if (!strncmp(t, "SERVER", 6)) {
168 args->mtime.set_it = SET_TO_SERVER_TIME;
170 args->mtime.set_it = SET_TO_CLIENT_TIME;
171 sscanf (t, "%d.%d", &i, &j);
174 args->mtime.mtime.seconds = 0;
175 args->mtime.mtime.nseconds = 0;
177 tm = adjust_time (dep_tab[index].timestamp, &i, &j);
178 args->mtime.set_it = TRUE;
179 args->mtime.mtime.seconds = tm->sec;
180 args->mtime.mtime.nseconds = tm->usec * 1000;
183 } else if (!strncmp (t, "size", 4)) {
186 args->size.set_it = TRUE;
187 args->size.size._p._u = (uint32_t) 0;
188 args->size.size._p._l = (uint32_t) i;
189 } else if (!strncmp (t, "gid", 3)) {
192 args->gid.set_it = TRUE;
193 #ifdef TAKE_CARE_SETATTR_GID
198 } else if ( !strncmp (t, "uid", 3)) {
201 args->uid.set_it = TRUE;
202 #ifdef TAKE_CARE_SETATTR_UID
207 } else if (!strncmp (t, "con", 3)) {
209 } else if (!strncmp (t, "sdata", 5)) {
212 fprintf(stderr, "parse_sattr t: %s\n", t);
223 char * parse_name (char * t, char * buf)
226 if (!strncmp(t, "fn2", 3))
228 else if (!strncmp(t, "fn", 2))
230 else if (!strncmp(t, "name2", 5))
232 else if (!strncmp(t, "name", 4))
234 else if (!strncmp(t, "sdata", 5))
237 fprintf(stderr, "%s\n", t);
241 RFS_ASSERT (*t=='"');
245 buf[i++] = *t++; // ??? name buffer?
246 RFS_ASSERT ((*t)=='"');
251 char * parse_access_mode (char * line, int * mode)
253 *mode = ACCESS3_READ;
255 /* anyway the information in the trace is not enough, so we just make up something */
258 char * parse_stable_mode (char * line, stable_how * mode)
261 case 'U': *mode = UNSTABLE;
263 case 'F': *mode = FILE_SYNC;
265 case 'D': *mode = DATA_SYNC;
274 void setarg_setattr (int index, char * line, SETATTR3args * args)
279 setarg_fhandle(&args->object);
280 args->guard.check = FALSE;
281 t = parse_sattr3 (t, &(args->new_attributes), &(args->guard), index);
284 void setarg_lookup (int index, char * line, LOOKUP3args * args, char * Cur_filename)
287 setarg_fhandle(&args->what.dir)
288 t = parse_name (t, Cur_filename);
289 args->what.name = Cur_filename;
292 void setarg_access (int index, char * line, ACCESS3args * args)
296 setarg_fhandle (&args->object);
297 parse_access_mode (t, &args->access); //ACCESS3_MODIFY; // ??? the actual parameter can be different
300 void setarg_readlink (int index, char * line, READLINK3args * args)
303 setarg_fhandle (&args->symlink);
306 void setarg_read (int index, char * line, READ3args * args, char * buf)
310 setarg_fhandle (&args->file);
312 if (line[TRACE_VERSION_POS]=='3') {
313 t = strstr (t, "off");
317 t = strstr (t, "offset");
321 sscanf (t, "%x", &i);
323 RFS_ASSERT (i>=0 && i<0x7FFFFFFF)
324 args->offset._p._u = 0;
325 args->offset._p._l = i;
326 t = strstr (t, "count");
329 sscanf (t, "%x", &i);
331 RFS_ASSERT (i <= 32768);
332 if (i > NFS_MAXDATA) {
333 read_data_owe += (i-NFS_MAXDATA);
334 read_data_adjust_times ++;
335 if (read_data_owe > 1073741824) {
336 read_data_owe -= 1073741824;
340 //printf ("adjust read count from %d to %d\n", i, NFS_MAXDATA);
343 read_data_total += i;
344 RFS_ASSERT (read_data_total <1073741824);
349 void setarg_write (int index, char * line, WRITE3args * args, char * buf)
353 setarg_fhandle (&args->file);
355 //fprintf (stderr, "process write: %s\n", line);
356 if (line[TRACE_VERSION_POS]=='3') {
357 t = strstr (t, "off");
361 RFS_ASSERT (line[TRACE_VERSION_POS]=='2');
362 t = strstr (t, "offset");
367 sscanf (t, "%x", &i);
368 RFS_ASSERT (i>=0 && i<0x7FFFFFFF)
369 args->offset._p._u = 0;
370 args->offset._p._l = i;
372 t = strstr (t, "count");
375 sscanf (t, "%x", &i);
376 RFS_ASSERT (i <= 32768);
377 if (i > NFS_MAXDATA) {
378 write_data_owe += (i-NFS_MAXDATA);
379 if (write_data_owe > 1073741824) {
380 write_data_owe -= 1073741824;
381 write_data_owe_GB ++;
383 write_data_adjust_times ++;
384 //printf ("adjust write count from %d to %d\n", i, NFS_MAXDATA);
387 write_data_total += i;
388 RFS_ASSERT (write_data_total <1073741824);
390 RFS_ASSERT (i < MAX_BUF1_SIZE-128); /* 128 is some random safe number to add */
393 if (line[TRACE_VERSION_POS]==3) {
394 t = strstr (t, "stable");
397 parse_stable_mode(t, &args->stable); /* *t can be F, U, etc */
399 args->stable = UNSTABLE;
400 args->data.data_len = args->count;
401 args->data.data_val = buf;
404 void setarg_create (int index, char * line, CREATE3args * args, char * Cur_filename)
407 //fprintf(stderr, "process create %s\n", line);
408 setarg_fhandle (&args->where.dir);
409 t = parse_name (t, Cur_filename);
410 args->where.name = Cur_filename;
411 if (line[TRACE_VERSION_POS]=='3') {
412 RFS_ASSERT (!strncmp(t, "how", 3));
414 t = parse_create_mode (t, &args->how.mode);
416 args->how.mode = UNCHECKED;
417 t = parse_sattr3 (t, &(args->how.createhow3_u.obj_attributes), NULL, index);
420 void setarg_create_old (int index, char * line, CREATE3args * retargs, char * Cur_filename)
424 sprintf(Cur_filename, "%d", index);
426 printf ("create file %s\n", Cur_filename);
428 /* set up the arguments */
429 (void) memmove((char *)&args.where.dir, (char *) &Cur_file_ptr->dir->fh3,
431 args.where.name = Cur_filename; //RFS need a buffer for the name
432 args.how.mode = UNCHECKED;
433 args.how.createhow3_u.obj_attributes.mode.set_it = TRUE;
434 args.how.createhow3_u.obj_attributes.mode.mode = (NFSMODE_REG | 0666);
435 args.how.createhow3_u.obj_attributes.uid.set_it = TRUE;
436 args.how.createhow3_u.obj_attributes.uid.uid = Cur_uid;
437 args.how.createhow3_u.obj_attributes.gid.set_it = TRUE;
438 args.how.createhow3_u.obj_attributes.gid.gid = Cur_gid;
439 args.how.createhow3_u.obj_attributes.atime.set_it = TRUE;
440 args.how.createhow3_u.obj_attributes.atime.atime.seconds = Cur_time.esec;
441 args.how.createhow3_u.obj_attributes.atime.atime.nseconds =
442 Cur_time.usec * 1000;
443 args.how.createhow3_u.obj_attributes.mtime.set_it = TRUE;
444 args.how.createhow3_u.obj_attributes.mtime.mtime.seconds = Cur_time.esec;
445 args.how.createhow3_u.obj_attributes.mtime.mtime.nseconds =
446 Cur_time.usec * 1000;
447 args.how.createhow3_u.obj_attributes.size.set_it = TRUE;
448 args.how.createhow3_u.obj_attributes.size.size._p._u = (uint32_t) 0;
449 args.how.createhow3_u.obj_attributes.size.size._p._l = (uint32_t) 0;
451 memcpy (retargs, &args, sizeof (CREATE3args));
454 void setarg_mkdir (int index, char * line, MKDIR3args * args, char * Cur_filename)
457 setarg_fhandle (&args->where.dir);
458 t = parse_name (t, Cur_filename);
459 args->where.name = Cur_filename;
460 t = parse_sattr3 (t, &(args->attributes), NULL, index);
463 void setarg_symlink(int index, char * line, SYMLINK3args * args, char * Cur_filename, char * sym_data)
466 setarg_fhandle (&args->where.dir);
467 t = parse_name (t, Cur_filename);
468 args->where.name = Cur_filename;
469 if (line[TRACE_VERSION_POS]=='2') {
470 t = parse_name (t, sym_data);
471 t = parse_sattr3 (t, &(args->symlink.symlink_attributes), NULL, index);
473 t = parse_sattr3 (t, &(args->symlink.symlink_attributes), NULL, index);
474 t = parse_name (t, sym_data);
476 args->symlink.symlink_data = sym_data;
479 void setarg_mknod(int index, char * line, MKNOD3args * args, char * Cur_filename)
484 /* set up the arguments */
485 (void) memmove((char *) &args.where.dir, (char *) &Cur_file_ptr->dir->fh3,
487 args.where.name = Cur_filename;
488 args.what.type = NF3FIFO;
489 args.what.mknoddata3_u.pipe_attributes.mode.set_it = TRUE;
490 args.what.mknoddata3_u.pipe_attributes.mode.mode = (NFSMODE_FIFO | 0777);
491 args.what.mknoddata3_u.pipe_attributes.uid.set_it = TRUE;
492 args.what.mknoddata3_u.pipe_attributes.uid.uid = Cur_uid;
493 args.what.mknoddata3_u.pipe_attributes.gid.set_it = TRUE;
494 args.what.mknoddata3_u.pipe_attributes.gid.gid = Cur_gid;
495 args.what.mknoddata3_u.pipe_attributes.size.set_it = TRUE;
496 args.what.mknoddata3_u.pipe_attributes.size.size._p._u = (uint32_t) 0;
497 args.what.mknoddata3_u.pipe_attributes.size.size._p._l =
499 args.what.mknoddata3_u.pipe_attributes.atime.set_it = TRUE;
500 args.what.mknoddata3_u.pipe_attributes.atime.atime.seconds =
502 args.what.mknoddata3_u.pipe_attributes.atime.atime.nseconds =
503 Cur_time.usec * 1000;
504 args.what.mknoddata3_u.pipe_attributes.mtime.set_it = TRUE;
505 args.what.mknoddata3_u.pipe_attributes.mtime.mtime.seconds =
507 args.what.mknoddata3_u.pipe_attributes.mtime.mtime.nseconds =
508 Cur_time.usec * 1000;
512 void setarg_remove (int index, char * line, REMOVE3args * args, char * Cur_filename)
515 setarg_fhandle(&args->object.dir)
516 t = parse_name (t, Cur_filename);
517 args->object.name = Cur_filename;
520 void setarg_rmdir (int index, char * line, RMDIR3args * args, char * Cur_filename)
523 setarg_fhandle(&args->object.dir)
524 t = parse_name (t, Cur_filename);
525 args->object.name = Cur_filename;
528 void setarg_rename (int index, char * line, RENAME3args * args, char * fromname, char * toname)
531 setarg_fhandle(&args->from.dir)
532 t = parse_name (t, fromname);
533 args->from.name = fromname;
535 t = strstr (t, "fh2");
538 memmove((char *)&args->to.dir, lookup_fhandle(t), sizeof (nfs_fh3));
541 t = parse_name (t, toname);
542 args->to.name = toname;
545 void setarg_link (int index, char * line, LINK3args * args, char * Cur_filename)
549 setarg_fhandle(&args->file)
551 t = strstr (t, "fh2");
554 memmove((char *)&args->link.dir, lookup_fhandle(t), sizeof (nfs_fh3));
557 t = parse_name (t, Cur_filename);
558 args->link.name = Cur_filename;
561 void setarg_readdir (int index, char * line, READDIR3args * args)
565 setarg_fhandle(&args->dir);
566 /* args->cookieverf is notset, it is not implemented in the linux-2.4.7 */
567 sscanf(t, "cookie %d count %d", &args->cookie._p._l, &args->count);
568 (void) memset((char *) args->cookieverf, '\0', NFS3_COOKIEVERFSIZE);
569 args->cookie._p._u = (uint32_t) 0;
572 void setarg_readdirplus (int index, char * line, READDIRPLUS3args * args)
576 setarg_fhandle(&args->dir);
577 /* args->cookieverf is notset, it is not implemented in the linux-2.4.7 */
578 sscanf(t, "cookie %d count %d maxcnt", &args->cookie._p._l, &args->dircount, &args->maxcount);
579 (void) memset((char *) args->cookieverf, '\0', NFS3_COOKIEVERFSIZE);
580 args->cookie._p._u = (uint32_t) 0;
583 /* set up the arguments */
584 (void) memmove((char *) &args.dir, (char *) &Cur_file_ptr->dir->fh3,
586 args.cookie._p._l = args.cookie._p._u = (uint32_t) 0;
587 (void) memset((char *) args.cookieverf, '\0', NFS3_COOKIEVERFSIZE);
588 args.dircount = DEFAULT_MAX_BUFSIZE;
589 args.maxcount = DEFAULT_MAX_BUFSIZE;
593 void setarg_fsstat (int index, char * line, FSSTAT3args * args)
596 setarg_fhandle(&args->fsroot);
599 void setarg_fsinfo (int index, char * line, FSINFO3args * args)
602 setarg_fhandle(&args->fsroot);
605 void setarg_pathconf (int index, char * line, PATHCONF3args * args)
608 setarg_fhandle(&args->object);
611 void setarg_commit (int index, char * line, COMMIT3args * args)
616 /* set up the arguments */
617 (void) memmove((char *) &args.file, (char *) &Cur_file_ptr->fh3,
619 args.offset._p._u = args.offset._p._l = (uint32_t) 0;
620 args.count = Cur_file_ptr->attributes3.size._p._l;
624 void setbuf_void (char * buf)
629 void setbuf_invalid (char * buf)
634 void setres_lookup (LOOKUP3res * reply)
636 (void) memset((char *) &(reply->resok.object), '\0', sizeof (nfs_fh3));
639 void setres_readlink (READLINK3res * reply, char * sym_data)
641 /* Have lower layers fill in the data directly. */
642 reply->resok.data = sym_data;
645 void setres_read (READ3res * reply, char * buf)
647 /* Have lower layers fill in the data directly. */
648 reply->resok.data.data_len = 0;
649 reply->resok.data.data_val = buf;
652 void setres_readdir (READDIR3res * reply, entry3 * entry_stream)
654 /* Have lower layers fill in the data directly. */
655 (void) memset((char *) reply, '\0', sizeof (READDIR3res));
656 (void) memset((char *) entry_stream, '\0',
657 sizeof (entry3) * SFS_MAXDIRENTS);
658 reply->resok.count = SFS_MAXDIRENTS;
659 reply->resok.reply.entries = entry_stream;
662 void setres_readdirplus (READDIRPLUS3res * reply, entryplus3 * entry_stream)
664 (void) memset((char *) reply, '\0', sizeof (READDIRPLUS3res));
665 //printf ("sizeof(entryplus3) %d SFS_MAXDIRENT %d\n", sizeof (entryplus3), SFS_MAXDIRENTS);
666 (void) memset((char *) entry_stream, '\0',
667 sizeof (entryplus3) * SFS_MAXDIRENTS);
668 reply->resok.count = SFS_MAXDIRENTS;
669 reply->resok.reply.entries = entry_stream;
672 #define NFSPROC3_INVALID -1
673 /* the array is indexed by sfs operation number */
674 rfs_op_type rfs_Ops[TOTAL] = {
675 {NFSPROC3_NULL, setbuf_void, setbuf_void, xdr_void, xdr_void},
676 {NFSPROC3_GETATTR, setarg_getattr, setbuf_void, xdr_GETATTR3args, xdr_GETATTR3res},
677 {NFSPROC3_SETATTR, setarg_setattr, setbuf_void, xdr_SETATTR3args, xdr_SETATTR3res},
678 {NFSPROC3_INVALID, setbuf_invalid, setbuf_invalid, NULL, NULL},
679 {NFSPROC3_LOOKUP, setarg_lookup, setres_lookup, xdr_LOOKUP3args, xdr_LOOKUP3res},
680 {NFSPROC3_READLINK, setarg_readlink, setres_readlink, xdr_READLINK3args, xdr_READLINK3res},
681 {NFSPROC3_READ, setarg_read, setres_read, xdr_READ3args, xdr_READ3res},
682 {NFSPROC3_INVALID, setbuf_invalid, setbuf_invalid, NULL, NULL},
683 {NFSPROC3_WRITE, setarg_write, setbuf_void, xdr_WRITE3args, xdr_WRITE3res},
684 {NFSPROC3_CREATE, setarg_create, setbuf_void, xdr_CREATE3args, xdr_CREATE3res},
685 {NFSPROC3_REMOVE, setarg_remove, setbuf_void, xdr_REMOVE3args, xdr_REMOVE3res},
686 {NFSPROC3_RENAME, setarg_rename, setbuf_void, xdr_RENAME3args, xdr_RENAME3res},
687 {NFSPROC3_LINK, setarg_link, setbuf_void, xdr_LINK3args, xdr_LINK3res},
688 {NFSPROC3_SYMLINK, setarg_symlink, setbuf_void, xdr_SYMLINK3args, xdr_SYMLINK3res},
689 {NFSPROC3_MKDIR, setarg_mkdir, setbuf_void, xdr_MKDIR3args, xdr_MKDIR3res},
690 {NFSPROC3_RMDIR, setarg_rmdir, setbuf_void, xdr_RMDIR3args, xdr_RMDIR3res},
691 {NFSPROC3_READDIR, setarg_readdir, setres_readdir, xdr_READDIR3args, xdr_READDIR3res},
692 {NFSPROC3_FSSTAT, setarg_fsstat, setbuf_void, xdr_FSSTAT3args, xdr_FSSTAT3res},
693 {NFSPROC3_ACCESS, setarg_access, setbuf_void, xdr_ACCESS3args, xdr_ACCESS3res},
694 {NFSPROC3_COMMIT, setarg_commit, setbuf_void, xdr_COMMIT3args, xdr_COMMIT3res},
695 {NFSPROC3_FSINFO, setarg_fsinfo, setbuf_void, xdr_FSINFO3args, xdr_FSINFO3res},
696 {NFSPROC3_MKNOD, setarg_mknod, setbuf_void, xdr_MKNOD3args, xdr_MKNOD3res},
697 {NFSPROC3_PATHCONF, setarg_pathconf, setbuf_void, xdr_PATHCONF3args, xdr_PATHCONF3res},
698 {NFSPROC3_READDIRPLUS, setarg_readdirplus, setres_readdirplus, xdr_READDIRPLUS3args, xdr_READDIRPLUS3res}};
701 * -------------------- NFS ops vector --------------------
704 * per operation information
706 sfs_op_type nfsv3_Ops[] = {
708 /* name mix op call no req req req results */
709 /* pcnt class targ call pcnt cnt targ */
711 { "null", 0, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
712 { "getattr", 11, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
713 { "setattr", 1, Write, 0, 0, 0.0, 0, 0, { 0, }},
714 { "root", 0, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
715 { "lookup", 27, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
716 { "readlink", 7, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
717 { "read", 18, Read, 0, 0, 0.0, 0, 0, { 0, }},
718 { "wrcache", 0, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
719 { "write", 9, Write, 0, 0, 0.0, 0, 0, { 0, }},
720 { "create", 1, Write, 0, 0, 0.0, 0, 0, { 0, }},
721 { "remove", 1, Write, 0, 0, 0.0, 0, 0, { 0, }},
722 { "rename", 0, Write, 0, 0, 0.0, 0, 0, { 0, }},
723 { "link", 0, Write, 0, 0, 0.0, 0, 0, { 0, }},
724 { "symlink", 0, Write, 0, 0, 0.0, 0, 0, { 0, }},
725 { "mkdir", 0, Write, 0, 0, 0.0, 0, 0, { 0, }},
726 { "rmdir", 0, Write, 0, 0, 0.0, 0, 0, { 0, }},
727 { "readdir", 2, Read, 0, 0, 0.0, 0, 0, { 0, }},
728 { "fsstat", 1, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
729 { "access", 7, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
730 { "commit", 5, Write, 0, 0, 0.0, 0, 0, { 0, }},
731 { "fsinfo", 1, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
732 { "mknod", 0, Write, 0, 0, 0.0, 0, 0, { 0, }},
733 { "pathconf", 0, Lookup, 0, 0, 0.0, 0, 0, { 0, }},
734 { "readdirplus", 9, Read, 0, 0, 0.0, 0, 0, { 0, }},
735 { "TOTAL", 100, Lookup, 0, 0, 0.0, 0, 0, { 0, }}