/*-
 * 
 *             Coda: an Experimental Distributed File System
 *                              Release 3.1
 * 
 *           Copyright (c) 1987-1998 Carnegie Mellon University
 *                          All Rights Reserved
 * 
 * Permission  to  use, copy, modify and distribute this software and its
 * documentation is hereby granted,  provided  that  both  the  copyright
 * notice  and  this  permission  notice  appear  in  all  copies  of the
 * software, derivative works or  modified  versions,  and  any  portions
 * thereof, and that both notices appear in supporting documentation, and
 * that credit is given to Carnegie Mellon University  in  all  documents
 * and publicity pertaining to direct or indirect use of this code or its
 * derivatives.
 * 
 * CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS  KNOWN  TO  HAVE  BUGS,
 * SOME  OF  WHICH MAY HAVE SERIOUS CONSEQUENCES.  CARNEGIE MELLON ALLOWS
 * FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.   CARNEGIE  MELLON
 * DISCLAIMS  ANY  LIABILITY  OF  ANY  KIND  FOR  ANY  DAMAGES WHATSOEVER
 * RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE  OR  OF
 * ANY DERIVATIVE WORK.
 * 
 * Carnegie  Mellon  encourages  users  of  this  software  to return any
 * improvements or extensions that  they  make,  and  to  grant  Carnegie
 * Mellon the rights to redistribute these changes without encumbrance.
 * 
 * 	@(#) src/sys/coda/coda_opstats.h,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $ 
 * $FreeBSD: src/sys/coda/coda_opstats.h,v 1.6 2005/01/05 23:35:00 imp Exp $
 * 
 */

/*
 * operation stats: what the minicache can intercept that
 * *isn't* seen by venus.  These stats are kept to augment
 * the stats maintained by the Volume-Session mechanism.
 */

/* vfsops:
 *          mount: not currently bounced to Venus
 *          umount: nope
 *          root: only first call, rest is cached.
 *          statfs: none (bogus)
 *          sync: none (bogus)
 *          vget: all
 */

#define CODA_MOUNT_STATS  0
#define CODA_UMOUNT_STATS 1
#define CODA_ROOT_STATS   2
#define CODA_STATFS_STATS 3
#define CODA_SYNC_STATS   4
#define CODA_VGET_STATS   5
#define CODA_VFSOPS_SIZE  6

/* vnodeops:
 *            open: all to venus
 *            close: all to venus
 *            rdrw: bogus.  Maybe redirected to UFS.
 *                          May call open/close for internal opens/closes
 *                          (Does exec not call open?)
 *            ioctl: causes a lookupname
 *                   passes through
 *            select: can't get there from here.
 *            getattr: can be satsified by cache
 *            setattr: all go through
 *            access: can be satisfied by cache
 *            readlink: can be satisfied by cache
 *            fsync: passes through
 *            inactive: passes through
 *            lookup: can be satisfied by cache
 *            create: passes through
 *            remove: passes through
 *            link: passes through
 *            rename: passes through
 *            mkdir: passes through
 *            rmdir: passes through
 *            symlink: passes through
 *            readdir: may be redirected to UFS
 *                     may cause an "internal" open/close
 */

#define CODA_OPEN_STATS     0
#define CODA_CLOSE_STATS    1
#define CODA_RDWR_STATS     2
#define CODA_IOCTL_STATS    3
#define CODA_SELECT_STATS   4
#define CODA_GETATTR_STATS  5
#define CODA_SETATTR_STATS  6
#define CODA_ACCESS_STATS   7
#define CODA_READLINK_STATS 8
#define CODA_FSYNC_STATS    9
#define CODA_INACTIVE_STATS 10
#define CODA_LOOKUP_STATS   11
#define CODA_CREATE_STATS   12
#define CODA_REMOVE_STATS   13
#define CODA_LINK_STATS     14
#define CODA_RENAME_STATS   15
#define CODA_MKDIR_STATS    16
#define CODA_RMDIR_STATS    17
#define CODA_SYMLINK_STATS  18
#define CODA_READDIR_STATS  19
#define CODA_VNODEOPS_SIZE  20

/*
 * I propose the following structres:
 */

struct coda_op_stats {
    int opcode;       /* vfs opcode */
    long entries;     /* number of times call attempted */
    long sat_intrn;   /* number of times call satisfied by cache */
    long unsat_intrn; /* number of times call failed in cache, but
                         was not bounced to venus proper. */
    long gen_intrn;   /* number of times call generated internally */
                      /* (do we need that?) */
};

/*
 * With each call to the minicache, we'll bump the counters whenver
 * a call is satisfied internally (through the cache or through a
 * redirect), and whenever an operation is caused internally.
 * Then, we can add the total operations caught by the minicache
 * to the world-wide totals, and leave a caveat for the specific
 * graphs later.
 */
