#ifndef _FS_DEVFS_DEVFS_INT_H_
#define _FS_DEVFS_DEVFS_INT_H_
#include <sys/queue.h>
struct devfs_dirent;
struct devfs_mount;
struct cdev_privdata {
struct file *cdpd_fp;
void *cdpd_data;
void (*cdpd_dtr)(void *);
LIST_ENTRY(cdev_privdata) cdpd_list;
};
struct cdev_priv {
struct cdev cdp_c;
TAILQ_ENTRY(cdev_priv) cdp_list;
u_int cdp_inode;
u_int cdp_flags;
#define CDP_ACTIVE (1 << 0)
#define CDP_SCHED_DTR (1 << 1)
#define CDP_UNREF_DTR (1 << 2)
#define CDP_ON_ACTIVE_LIST (1 << 3)
u_int cdp_inuse;
u_int cdp_maxdirent;
struct devfs_dirent **cdp_dirents;
struct devfs_dirent *cdp_dirent0;
TAILQ_ENTRY(cdev_priv) cdp_dtr_list;
void (*cdp_dtr_cb)(void *);
void *cdp_dtr_cb_arg;
LIST_HEAD(, cdev_privdata) cdp_fdpriv;
u_int cdp_fdpriv_dtrc;
struct mtx cdp_threadlock;
};
#define cdev2priv(c) __containerof(c, struct cdev_priv, cdp_c)
#ifdef _KERNEL
struct cdev *devfs_alloc(int);
int devfs_dev_exists(const char *);
void devfs_free(struct cdev *);
void devfs_create(struct cdev *);
void devfs_destroy(struct cdev *);
void devfs_destroy_cdevpriv(struct cdev_privdata *);
int devfs_dir_find(const char *);
void devfs_dir_ref_de(struct devfs_mount *, struct devfs_dirent *);
void devfs_dir_unref_de(struct devfs_mount *, struct devfs_dirent *);
int devfs_pathpath(const char *, const char *);
extern struct unrhdr *devfs_inos;
extern struct mtx devmtx;
extern struct mtx devfs_de_interlock;
extern struct mtx cdevpriv_mtx;
extern TAILQ_HEAD(cdev_priv_list, cdev_priv) cdevp_list;
#define dev_lock_assert_locked() mtx_assert(&devmtx, MA_OWNED)
#define dev_lock_assert_unlocked() mtx_assert(&devmtx, MA_NOTOWNED)
#endif
#endif