#define UDF_HASHTBLSIZE 100
struct udf_node {
LIST_ENTRY(udf_node) le;
struct vnode *i_vnode;
struct vnode *i_devvp;
struct udf_mnt *udfmp;
cdev_t i_dev;
ino_t hash_id;
long diroff;
struct file_entry *fentry;
};
struct udf_mnt {
int im_flags;
struct mount *im_mountp;
cdev_t im_dev;
struct vnode *im_devvp;
struct netexport im_export;
int bsize;
int bshift;
int bmask;
uint32_t part_start;
uint32_t part_len;
uint64_t root_id;
struct vnode *root_vp;
struct long_ad root_icb;
LIST_HEAD(udf_hash_lh, udf_node) *hashtbl;
u_long hashsz;
struct lwkt_token hash_token;
int p_sectors;
int s_table_entries;
struct udf_sparing_table *s_table;
};
struct udf_dirstream {
struct udf_node *node;
struct udf_mnt *udfmp;
struct buf *bp;
uint8_t *data;
uint8_t *buf;
int fsize;
int off;
int this_off;
int offset;
int size;
int error;
int fid_fragment;
};
#define VFSTOUDFFS(mp) ((struct udf_mnt *)((mp)->mnt_data))
#define VTON(vp) ((struct udf_node *)((vp)->v_data))
#define RDSECTOR(devvp, sector, size, bp) \
bread(devvp, (off_t)(sector) << udfmp->bshift, size, bp)
#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_UDFFENTRY);
MALLOC_DECLARE(M_UDFNODE);
#endif
static __inline int
udf_readlblks(struct udf_mnt *udfmp, int sector, int size, struct buf **bp)
{
return (RDSECTOR(udfmp->im_devvp, sector,
(size + udfmp->bmask) & ~udfmp->bmask, bp));
}
static __inline int
udf_readalblks(struct udf_mnt *udfmp, int lsector, int size, struct buf **bp)
{
off_t raoffset;
off_t loffset;
int rasize;
loffset = (off_t)(lsector + udfmp->part_start) << udfmp->bshift;
raoffset = loffset + (1 << udfmp->bshift);
rasize = size;
return (breadn(udfmp->im_devvp, loffset,
(size + udfmp->bmask) & ~udfmp->bmask,
&raoffset, &rasize, 1, bp));
}
static __inline ino_t
udf_getid(struct long_ad *icb)
{
return (icb->loc.lb_num);
}
int udf_allocv(struct mount *, struct vnode **);
int udf_hashlookup(struct udf_mnt *, ino_t, struct vnode **);
int udf_hashins(struct udf_node *);
int udf_hashrem(struct udf_node *);
int udf_checktag(struct desc_tag *, uint16_t);
int udf_vget(struct mount *, struct vnode *, ino_t, struct vnode **);