#ifndef _MISCFS_GENFS_GENFS_NODE_H_
#define _MISCFS_GENFS_GENFS_NODE_H_
#include <sys/rwlock.h>
struct vm_page;
struct kauth_cred;
struct uio;
struct vnode;
struct genfs_ops {
void (*gop_size)(struct vnode *, off_t, off_t *, int);
int (*gop_alloc)(struct vnode *, off_t, off_t, int,
struct kauth_cred *);
int (*gop_write)(struct vnode *, struct vm_page **, int, int);
void (*gop_markupdate)(struct vnode *, int);
void (*gop_putrange)(struct vnode *, off_t, off_t *, off_t *);
};
#define GOP_SIZE(vp, size, eobp, flags) \
(*VTOG(vp)->g_op->gop_size)((vp), (size), (eobp), (flags))
#define GOP_ALLOC(vp, off, len, flags, cred) \
(*VTOG(vp)->g_op->gop_alloc)((vp), (off), (len), (flags), (cred))
#define GOP_WRITE(vp, pgs, npages, flags) \
(*VTOG(vp)->g_op->gop_write)((vp), (pgs), (npages), (flags))
#define GOP_PUTRANGE(vp, off, lop, hip) \
(*VTOG(vp)->g_op->gop_putrange)((vp), (off), (lop), (hip))
#define GOP_MARKUPDATE(vp, flags) \
(VTOG(vp)->g_op->gop_markupdate) ? \
(*VTOG(vp)->g_op->gop_markupdate)((vp), (flags)) : \
(void)0;
#define GOP_SIZE_MEM 0x4
#define GOP_UPDATE_ACCESSED 1
#define GOP_UPDATE_MODIFIED 2
struct genfs_node {
const struct genfs_ops *g_op;
krwlock_t g_glock;
};
#define VTOG(vp) ((struct genfs_node *)(vp)->v_data)
void genfs_size(struct vnode *, off_t, off_t *, int);
void genfs_node_init(struct vnode *, const struct genfs_ops *);
void genfs_node_destroy(struct vnode *);
void genfs_gop_putrange(struct vnode *, off_t, off_t *, off_t *);
int genfs_gop_write(struct vnode *, struct vm_page **, int, int);
int genfs_gop_write_rwmap(struct vnode *, struct vm_page **, int, int);
int genfs_compat_gop_write(struct vnode *, struct vm_page **, int, int);
void genfs_directio(struct vnode *, struct uio *, int);
void genfs_node_wrlock(struct vnode *);
void genfs_node_rdlock(struct vnode *);
int genfs_node_rdtrylock(struct vnode *);
void genfs_node_unlock(struct vnode *);
int genfs_node_wrlocked(struct vnode *);
#endif