#ifndef _SYS_UBC_INTERNAL_H_
#define _SYS_UBC_INTERNAL_H_
#include <sys/appleapiopts.h>
#include <sys/types.h>
#include <sys/kernel_types.h>
#include <sys/ucred.h>
#include <sys/vnode.h>
#include <sys/ubc.h>
#include <sys/mman.h>
#include <sys/cdefs.h>
#include <kern/locks.h>
#include <mach/memory_object_types.h>
#define UBC_INFO_NULL ((struct ubc_info *) 0)
extern struct zone *ubc_info_zone;
#define MAX_CLUSTERS 4
struct cl_extent {
daddr64_t b_addr;
daddr64_t e_addr;
};
struct cl_wextent {
daddr64_t b_addr;
daddr64_t e_addr;
int io_nocache;
};
struct cl_readahead {
lck_mtx_t cl_lockr;
daddr64_t cl_lastr;
daddr64_t cl_maxra;
int cl_ralen;
};
struct cl_writebehind {
lck_mtx_t cl_lockw;
int cl_hasbeenpaged;
void * cl_scmap;
int cl_scdirty;
int cl_number;
struct cl_wextent cl_clusters[MAX_CLUSTERS];
};
struct ubc_info {
memory_object_t ui_pager;
memory_object_control_t ui_control;
long ui_flags;
vnode_t *ui_vnode;
ucred_t *ui_ucred;
off_t ui_size;
struct cl_readahead *cl_rahead;
struct cl_writebehind *cl_wbehind;
};
#define UI_NONE 0x00000000
#define UI_HASPAGER 0x00000001
#define UI_INITED 0x00000002
#define UI_HASOBJREF 0x00000004
#define UI_WASMAPPED 0x00000008
#define UI_ISMAPPED 0x00000010
__BEGIN_DECLS
__private_extern__ int ubc_umount(struct mount *mp);
__private_extern__ void ubc_unmountall(void);
__private_extern__ memory_object_t ubc_getpager(struct vnode *);
__private_extern__ int ubc_map(struct vnode *, int);
__private_extern__ int ubc_destroy_named(struct vnode *);
__private_extern__ void cluster_release(struct ubc_info *);
#define UBC_FLAGS_NONE 0x0000
#define UBC_HOLDOBJECT 0x0001
#define UBC_FOR_PAGEOUT 0x0002
memory_object_control_t ubc_getobject(struct vnode *, int);
int ubc_info_init(struct vnode *);
void ubc_info_deallocate (struct ubc_info *);
int ubc_isinuse(struct vnode *, int);
int ubc_page_op(vnode_t, off_t, int, ppnum_t *, int *);
int ubc_range_op(vnode_t, off_t, off_t, int, int *);
int cluster_copy_upl_data(struct uio *, upl_t, int, int);
int cluster_copy_ubc_data(vnode_t, struct uio *, int *, int);
int UBCINFOMISSING(vnode_t);
int UBCINFORECLAIMED(vnode_t);
int UBCINFOEXISTS(vnode_t);
int UBCISVALID(vnode_t);
int UBCINVALID(vnode_t);
int UBCINFOCHECK(const char *, vnode_t);
__END_DECLS
#endif