#ifndef _CNODE_H_
#define _CNODE_H_
#include <sys/vnode.h>
#ifdef _KERNEL
#include <sys/malloc.h>
MALLOC_DECLARE(M_CODA);
#endif
#define CODA_CACHESIZE 512
#define CODA_ALLOC(ptr, cast, size) \
do { \
ptr = (cast)malloc((unsigned long) size, M_CODA, M_WAITOK); \
if (ptr == 0) { \
panic("kernel malloc returns 0 at %s:%d\n", __FILE__, __LINE__); \
} \
} while ( 0)
#define CODA_FREE(ptr, size) free((ptr), M_CODA)
extern int coda_nc_use;
extern int codadebug;
extern int coda_nc_debug;
extern int coda_printf_delay;
extern int coda_vnop_print_entry;
extern int coda_psdev_print_entry;
extern int coda_vfsop_print_entry;
#define CODADBGMSK(N) (1 << N)
#define CODADEBUG(N, STMT) { if (codadebug & CODADBGMSK(N)) { STMT } }
#define myprintf(args) \
do { \
if (coda_printf_delay) \
DELAY(coda_printf_delay);\
printf args ; \
} while ( 0)
struct cnode {
struct vnode *c_vnode;
u_short c_flags;
CodaFid c_fid;
struct vnode *c_ovp;
u_short c_ocount;
u_short c_owrite;
struct vattr c_vattr;
char *c_symlink;
u_short c_symlen;
dev_t c_device;
ino_t c_inode;
kmutex_t c_lock;
};
#define VTOC(vp) ((struct cnode *)(vp)->v_data)
#define SET_VTOC(vp) ((vp)->v_data)
#define CTOV(cp) ((struct vnode *)((cp)->c_vnode))
#define C_VATTR 0x01
#define C_SYMLINK 0x02
#define C_UNMOUNTING 0X20
#define C_PURGING 0x40
#define VALID_VATTR(cp) ((cp->c_flags) & C_VATTR)
#define VALID_SYMLINK(cp) ((cp->c_flags) & C_SYMLINK)
#define IS_UNMOUNTING(cp) ((cp)->c_flags & C_UNMOUNTING)
struct vmsg;
struct vcomm {
u_long vc_seq;
int vc_open;
struct selinfo vc_selproc;
TAILQ_HEAD(,vmsg) vc_requests;
TAILQ_HEAD(,vmsg) vc_replies;
};
#define VC_OPEN(vcp) ((vcp)->vc_open == 1)
#define MARK_VC_CLOSED(vcp) ((vcp)->vc_open = 0)
#define MARK_VC_OPEN(vcp) ((vcp)->vc_open = 1)
struct coda_clstat {
int ncalls;
int nbadcalls;
int reqs[CODA_NCALLS];
};
extern struct coda_clstat coda_clstat;
struct coda_mntinfo {
struct vnode *mi_rootvp;
struct mount *mi_vfsp;
struct vcomm mi_vcomm;
int mi_started;
};
extern struct coda_mntinfo coda_mnttbl[];
#define vftomi(vfsp) ((struct coda_mntinfo *)(vfsp->mnt_data))
#define CODA_MOUNTED(vfsp) ((vftomi(vfsp) != (struct coda_mntinfo *)0) \
&& (vftomi(vfsp)->mi_started))
#define vtomi(vp) ((struct coda_mntinfo *)(vp->v_mount->mnt_data))
extern struct vnode *coda_ctlvp;
#define IS_CTL_VP(vp) ((vp) == coda_ctlvp)
#define IS_CTL_NAME(vp, name, l)((l == CODA_CONTROLLEN) \
&& ((vp) == vtomi((vp))->mi_rootvp) \
&& strncmp(name, CODA_CONTROL, l) == 0)
enum dc_status {
IS_DOWNCALL = 6,
NOT_DOWNCALL = 7
};
extern int coda_call(struct coda_mntinfo *, int, int *, void *);
extern int coda_kernel_version;
extern int handleDownCall(int, union outputArgs *);
extern void coda_unmounting(struct mount *);
extern int coda_vmflush(struct cnode *);
extern struct cnode *make_coda_node(CodaFid *, struct mount *, short);
extern int coda_vnodeopstats_init(void);
extern struct mount *devtomp(dev_t);
#define CODA_RDWR ((u_long) 31)
#endif