xref: /dragonfly/sys/vfs/udf/udf.h (revision 7ea34faa)
103998195SJoerg Sonnenberger /*-
203998195SJoerg Sonnenberger  * Copyright (c) 2001, 2002 Scott Long <scottl@freebsd.org>
303998195SJoerg Sonnenberger  * All rights reserved.
403998195SJoerg Sonnenberger  *
503998195SJoerg Sonnenberger  * Redistribution and use in source and binary forms, with or without
603998195SJoerg Sonnenberger  * modification, are permitted provided that the following conditions
703998195SJoerg Sonnenberger  * are met:
803998195SJoerg Sonnenberger  * 1. Redistributions of source code must retain the above copyright
903998195SJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer.
1003998195SJoerg Sonnenberger  * 2. Redistributions in binary form must reproduce the above copyright
1103998195SJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer in the
1203998195SJoerg Sonnenberger  *    documentation and/or other materials provided with the distribution.
1303998195SJoerg Sonnenberger  *
1403998195SJoerg Sonnenberger  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1503998195SJoerg Sonnenberger  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1603998195SJoerg Sonnenberger  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1703998195SJoerg Sonnenberger  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1803998195SJoerg Sonnenberger  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1903998195SJoerg Sonnenberger  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2003998195SJoerg Sonnenberger  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2103998195SJoerg Sonnenberger  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2203998195SJoerg Sonnenberger  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2303998195SJoerg Sonnenberger  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2403998195SJoerg Sonnenberger  * SUCH DAMAGE.
2503998195SJoerg Sonnenberger  *
2603998195SJoerg Sonnenberger  * $FreeBSD: src/sys/fs/udf/udf.h,v 1.6 2003/11/05 06:56:08 scottl Exp $
2703998195SJoerg Sonnenberger  */
2803998195SJoerg Sonnenberger 
2903998195SJoerg Sonnenberger #define UDF_HASHTBLSIZE 100
3003998195SJoerg Sonnenberger 
3103998195SJoerg Sonnenberger struct udf_node {
3203998195SJoerg Sonnenberger 	LIST_ENTRY(udf_node)	le;
3303998195SJoerg Sonnenberger 	struct vnode	*i_vnode;
3403998195SJoerg Sonnenberger 	struct vnode	*i_devvp;
3503998195SJoerg Sonnenberger 	struct udf_mnt	*udfmp;
36b13267a5SMatthew Dillon 	cdev_t		i_dev;
3703998195SJoerg Sonnenberger 	ino_t		hash_id;
3803998195SJoerg Sonnenberger 	long		diroff;
3903998195SJoerg Sonnenberger 	struct file_entry *fentry;
4003998195SJoerg Sonnenberger };
4103998195SJoerg Sonnenberger 
4203998195SJoerg Sonnenberger struct udf_mnt {
4303998195SJoerg Sonnenberger 	int			im_flags;
4403998195SJoerg Sonnenberger 	struct mount		*im_mountp;
45b13267a5SMatthew Dillon 	cdev_t			im_dev;
4603998195SJoerg Sonnenberger 	struct vnode		*im_devvp;
4703998195SJoerg Sonnenberger 	struct netexport	im_export;
4803998195SJoerg Sonnenberger 	int			bsize;
4903998195SJoerg Sonnenberger 	int			bshift;
5003998195SJoerg Sonnenberger 	int			bmask;
5103998195SJoerg Sonnenberger 	uint32_t		part_start;
5203998195SJoerg Sonnenberger 	uint32_t		part_len;
5303998195SJoerg Sonnenberger 	uint64_t		root_id;
5403998195SJoerg Sonnenberger 	struct vnode		*root_vp;
5503998195SJoerg Sonnenberger 	struct long_ad		root_icb;
5603998195SJoerg Sonnenberger 	LIST_HEAD(udf_hash_lh, udf_node)	*hashtbl;
5703998195SJoerg Sonnenberger 	u_long			hashsz;
5803998195SJoerg Sonnenberger 	struct lwkt_token	hash_token;
5903998195SJoerg Sonnenberger 	int			p_sectors;
6003998195SJoerg Sonnenberger 	int			s_table_entries;
6103998195SJoerg Sonnenberger 	struct udf_sparing_table *s_table;
6203998195SJoerg Sonnenberger };
6303998195SJoerg Sonnenberger 
6403998195SJoerg Sonnenberger struct udf_dirstream {
6503998195SJoerg Sonnenberger 	struct udf_node	*node;
6603998195SJoerg Sonnenberger 	struct udf_mnt	*udfmp;
6703998195SJoerg Sonnenberger 	struct buf	*bp;
6803998195SJoerg Sonnenberger 	uint8_t		*data;
6903998195SJoerg Sonnenberger 	uint8_t		*buf;
7003998195SJoerg Sonnenberger 	int		fsize;
7103998195SJoerg Sonnenberger 	int		off;
7203998195SJoerg Sonnenberger 	int		this_off;
7303998195SJoerg Sonnenberger 	int		offset;
7403998195SJoerg Sonnenberger 	int		size;
7503998195SJoerg Sonnenberger 	int		error;
7603998195SJoerg Sonnenberger 	int		fid_fragment;
7703998195SJoerg Sonnenberger };
7803998195SJoerg Sonnenberger 
7903998195SJoerg Sonnenberger #define	VFSTOUDFFS(mp)	((struct udf_mnt *)((mp)->mnt_data))
8003998195SJoerg Sonnenberger #define	VTON(vp)	((struct udf_node *)((vp)->v_data))
8103998195SJoerg Sonnenberger 
8203998195SJoerg Sonnenberger /*
8303998195SJoerg Sonnenberger  * The block layer refers to things in terms of 512 byte blocks by default.
8403998195SJoerg Sonnenberger  * btodb() is expensive, so speed things up.
8503998195SJoerg Sonnenberger  * XXX Can the block layer be forced to use a different block size?
8603998195SJoerg Sonnenberger  */
8703998195SJoerg Sonnenberger #define	RDSECTOR(devvp, sector, size, bp) \
8854078292SMatthew Dillon 	bread(devvp, (off_t)(sector) << udfmp->bshift, size, bp)
8903998195SJoerg Sonnenberger 
90*7ea34faaSzrj #ifdef MALLOC_DECLARE
9103998195SJoerg Sonnenberger MALLOC_DECLARE(M_UDFFENTRY);
9203998195SJoerg Sonnenberger MALLOC_DECLARE(M_UDFNODE);
93*7ea34faaSzrj #endif
9403998195SJoerg Sonnenberger 
9503998195SJoerg Sonnenberger static __inline int
udf_readlblks(struct udf_mnt * udfmp,int sector,int size,struct buf ** bp)9603998195SJoerg Sonnenberger udf_readlblks(struct udf_mnt *udfmp, int sector, int size, struct buf **bp)
9703998195SJoerg Sonnenberger {
9803998195SJoerg Sonnenberger 	return (RDSECTOR(udfmp->im_devvp, sector,
9903998195SJoerg Sonnenberger 			 (size + udfmp->bmask) & ~udfmp->bmask, bp));
10003998195SJoerg Sonnenberger }
10103998195SJoerg Sonnenberger 
10203998195SJoerg Sonnenberger static __inline int
udf_readalblks(struct udf_mnt * udfmp,int lsector,int size,struct buf ** bp)10303998195SJoerg Sonnenberger udf_readalblks(struct udf_mnt *udfmp, int lsector, int size, struct buf **bp)
10403998195SJoerg Sonnenberger {
10554078292SMatthew Dillon 	off_t raoffset;
10654078292SMatthew Dillon 	off_t loffset;
10703998195SJoerg Sonnenberger 	int rasize;
10803998195SJoerg Sonnenberger 
10954078292SMatthew Dillon 	loffset = (off_t)(lsector + udfmp->part_start) << udfmp->bshift;
11054078292SMatthew Dillon 	raoffset = loffset + (1 << udfmp->bshift);
11103998195SJoerg Sonnenberger 	rasize = size;
11203998195SJoerg Sonnenberger 
11354078292SMatthew Dillon 	return (breadn(udfmp->im_devvp, loffset,
11403998195SJoerg Sonnenberger 		       (size + udfmp->bmask) & ~udfmp->bmask,
11554078292SMatthew Dillon 		       &raoffset, &rasize, 1, bp));
11603998195SJoerg Sonnenberger }
11703998195SJoerg Sonnenberger 
11803998195SJoerg Sonnenberger /*
11903998195SJoerg Sonnenberger  * Produce a suitable file number from an ICB.
12003998195SJoerg Sonnenberger  * XXX If the fileno resolves to 0, we might be in big trouble.
12103998195SJoerg Sonnenberger  * XXX Assumes the ICB is a long_ad.  This struct is compatible with short_ad,
12203998195SJoerg Sonnenberger  *     but not ext_ad.
12303998195SJoerg Sonnenberger  */
12403998195SJoerg Sonnenberger static __inline ino_t
udf_getid(struct long_ad * icb)12503998195SJoerg Sonnenberger udf_getid(struct long_ad *icb)
12603998195SJoerg Sonnenberger {
12703998195SJoerg Sonnenberger 	return (icb->loc.lb_num);
12803998195SJoerg Sonnenberger }
12903998195SJoerg Sonnenberger 
13003998195SJoerg Sonnenberger int udf_allocv(struct mount *, struct vnode **);
13103998195SJoerg Sonnenberger int udf_hashlookup(struct udf_mnt *, ino_t, struct vnode **);
13203998195SJoerg Sonnenberger int udf_hashins(struct udf_node *);
13303998195SJoerg Sonnenberger int udf_hashrem(struct udf_node *);
13403998195SJoerg Sonnenberger int udf_checktag(struct desc_tag *, uint16_t);
135b9b0a6d0SMatthew Dillon int udf_vget(struct mount *, struct vnode *, ino_t, struct vnode **);
136