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