#ifndef FS_P9FS_P9FS_H
#define FS_P9FS_P9FS_H
struct p9fs_session;
struct p9fs_qid {
uint8_t qid_mode;
uint32_t qid_version;
uint64_t qid_path;
};
struct p9fs_inode {
uint64_t i_size;
uint16_t i_type;
uint32_t i_dev;
uint32_t i_mode;
uint32_t i_atime;
uint32_t i_mtime;
uint32_t i_ctime;
uint32_t i_atime_nsec;
uint32_t i_mtime_nsec;
uint32_t i_ctime_nsec;
uint64_t i_length;
char *i_name;
char *i_uid;
char *i_gid;
char *i_muid;
char *i_extension;
uid_t n_uid;
gid_t n_gid;
uid_t n_muid;
uint16_t i_links_count;
uint64_t i_qid_path;
uint64_t i_flags;
uint64_t blksize;
uint64_t blocks;
uint64_t gen;
uint64_t data_version;
};
#define P9FS_VFID_MTX(_sc) (&(_sc)->vfid_mtx)
#define P9FS_VFID_LOCK(_sc) mtx_lock(P9FS_VFID_MTX(_sc))
#define P9FS_VFID_UNLOCK(_sc) mtx_unlock(P9FS_VFID_MTX(_sc))
#define P9FS_VFID_LOCK_INIT(_sc) mtx_init(P9FS_VFID_MTX(_sc), \
"VFID List lock", NULL, MTX_DEF)
#define P9FS_VFID_LOCK_DESTROY(_sc) mtx_destroy(P9FS_VFID_MTX(_sc))
#define P9FS_VOFID_MTX(_sc) (&(_sc)->vofid_mtx)
#define P9FS_VOFID_LOCK(_sc) mtx_lock(P9FS_VOFID_MTX(_sc))
#define P9FS_VOFID_UNLOCK(_sc) mtx_unlock(P9FS_VOFID_MTX(_sc))
#define P9FS_VOFID_LOCK_INIT(_sc) mtx_init(P9FS_VOFID_MTX(_sc), \
"VOFID List lock", NULL, MTX_DEF)
#define P9FS_VOFID_LOCK_DESTROY(_sc) mtx_destroy(P9FS_VOFID_MTX(_sc))
#define VFID 0x01
#define VOFID 0x02
struct p9fs_node {
STAILQ_HEAD( ,p9_fid) vfid_list;
struct mtx vfid_mtx;
STAILQ_HEAD( ,p9_fid) vofid_list;
struct mtx vofid_mtx;
struct p9fs_node *parent;
struct p9fs_qid vqid;
struct vnode *v_node;
struct p9fs_inode inode;
struct p9fs_session *p9fs_ses;
STAILQ_ENTRY(p9fs_node) p9fs_node_next;
uint64_t flags;
};
#define P9FS_VTON(vp) ((struct p9fs_node *)(vp)->v_data)
#define P9FS_NTOV(node) ((node)->v_node)
#define VFSTOP9(mp) ((struct p9fs_mount *)(mp)->mnt_data)
#define QEMU_DIRENTRY_SZ 25
#define P9FS_NODE_MODIFIED 0x1
#define P9FS_ROOT 0x2
#define P9FS_NODE_DELETED 0x4
#define P9FS_NODE_IN_SESSION 0x8
#define IS_ROOT(node) (node->flags & P9FS_ROOT)
#define P9FS_SET_LINKS(inode) do { \
(inode)->i_links_count = 1; \
} while (0) \
#define P9FS_INCR_LINKS(inode) do { \
(inode)->i_links_count++; \
} while (0) \
#define P9FS_DECR_LINKS(inode) do { \
(inode)->i_links_count--; \
} while (0) \
#define P9FS_CLR_LINKS(inode) do { \
(inode)->i_links_count = 0; \
} while (0) \
#define P9FS_MTX(_sc) (&(_sc)->p9fs_mtx)
#define P9FS_LOCK(_sc) mtx_lock(P9FS_MTX(_sc))
#define P9FS_UNLOCK(_sc) mtx_unlock(P9FS_MTX(_sc))
#define P9FS_LOCK_INIT(_sc) mtx_init(P9FS_MTX(_sc), \
"P9FS session chain lock", NULL, MTX_DEF)
#define P9FS_LOCK_DESTROY(_sc) mtx_destroy(P9FS_MTX(_sc))
struct p9fs_session {
unsigned char flags;
struct mount *p9fs_mount;
struct p9fs_node rnp;
uid_t uid;
const char *uname;
const char *aname;
struct p9_client *clnt;
struct mtx p9fs_mtx;
STAILQ_HEAD( ,p9fs_node) virt_node_list;
struct p9_fid *mnt_fid;
};
struct p9fs_mount {
struct p9fs_session p9fs_session;
struct mount *p9fs_mountp;
int mount_tag_len;
char *mount_tag;
};
enum virt_session_flags {
P9FS_PROTO_2000U = 0x01,
P9FS_PROTO_2000L = 0x02,
};
#define P9_ACCESS_ANY 0x04
#define P9_ACCESS_SINGLE 0x08
#define P9_ACCESS_USER 0x10
#define P9_ACCESS_MASK (P9_ACCESS_ANY|P9_ACCESS_SINGLE|P9_ACCESS_USER)
u_quad_t p9fs_round_filesize_to_bytes(uint64_t filesize, uint64_t bsize);
u_quad_t p9fs_pow2_filesize_to_bytes(uint64_t filesize, uint64_t bsize);
int p9fs_stat_vnode_l(void);
int p9fs_stat_vnode_dotl(struct p9_stat_dotl *st, struct vnode *vp);
int p9fs_reload_stats_dotl(struct vnode *vp, struct ucred *cred);
int p9fs_proto_dotl(struct p9fs_session *vses);
struct p9_fid *p9fs_init_session(struct mount *mp, int *error);
void p9fs_close_session(struct mount *mp);
void p9fs_prepare_to_close(struct mount *mp);
void p9fs_complete_close(struct mount *mp);
int p9fs_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp);
int p9fs_vget_common(struct mount *mp, struct p9fs_node *np, int flags,
struct p9fs_node *parent, struct p9_fid *fid, struct vnode **vpp,
char *name);
int p9fs_node_cmp(struct vnode *vp, void *arg);
void p9fs_destroy_node(struct p9fs_node **npp);
void p9fs_dispose_node(struct p9fs_node **npp);
void p9fs_cleanup(struct p9fs_node *vp);
void p9fs_fid_remove_all(struct p9fs_node *np, int leave_ofids);
void p9fs_fid_remove(struct p9fs_node *np, struct p9_fid *vfid,
int fid_type);
void p9fs_fid_add(struct p9fs_node *np, struct p9_fid *fid,
int fid_type);
struct p9_fid *p9fs_get_fid(struct p9_client *clnt,
struct p9fs_node *np, struct ucred *cred, int fid_type, int mode, int *error);
#endif