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 $ 27b13267a5SMatthew Dillon * $DragonFly: src/sys/vfs/udf/udf.h,v 1.3 2006/09/10 01:26:41 dillon Exp $ 2803998195SJoerg Sonnenberger */ 2903998195SJoerg Sonnenberger 3003998195SJoerg Sonnenberger #define UDF_HASHTBLSIZE 100 3103998195SJoerg Sonnenberger 3203998195SJoerg Sonnenberger struct udf_node { 3303998195SJoerg Sonnenberger LIST_ENTRY(udf_node) le; 3403998195SJoerg Sonnenberger struct vnode *i_vnode; 3503998195SJoerg Sonnenberger struct vnode *i_devvp; 3603998195SJoerg Sonnenberger struct udf_mnt *udfmp; 37b13267a5SMatthew Dillon cdev_t i_dev; 3803998195SJoerg Sonnenberger ino_t hash_id; 3903998195SJoerg Sonnenberger long diroff; 4003998195SJoerg Sonnenberger struct file_entry *fentry; 4103998195SJoerg Sonnenberger }; 4203998195SJoerg Sonnenberger 4303998195SJoerg Sonnenberger struct udf_mnt { 4403998195SJoerg Sonnenberger int im_flags; 4503998195SJoerg Sonnenberger struct mount *im_mountp; 46b13267a5SMatthew Dillon cdev_t im_dev; 4703998195SJoerg Sonnenberger struct vnode *im_devvp; 4803998195SJoerg Sonnenberger struct netexport im_export; 4903998195SJoerg Sonnenberger int bsize; 5003998195SJoerg Sonnenberger int bshift; 5103998195SJoerg Sonnenberger int bmask; 5203998195SJoerg Sonnenberger uint32_t part_start; 5303998195SJoerg Sonnenberger uint32_t part_len; 5403998195SJoerg Sonnenberger uint64_t root_id; 5503998195SJoerg Sonnenberger struct vnode *root_vp; 5603998195SJoerg Sonnenberger struct long_ad root_icb; 5703998195SJoerg Sonnenberger LIST_HEAD(udf_hash_lh, udf_node) *hashtbl; 5803998195SJoerg Sonnenberger u_long hashsz; 5903998195SJoerg Sonnenberger struct lwkt_token hash_token; 6003998195SJoerg Sonnenberger int p_sectors; 6103998195SJoerg Sonnenberger int s_table_entries; 6203998195SJoerg Sonnenberger struct udf_sparing_table *s_table; 6303998195SJoerg Sonnenberger }; 6403998195SJoerg Sonnenberger 6503998195SJoerg Sonnenberger struct udf_dirstream { 6603998195SJoerg Sonnenberger struct udf_node *node; 6703998195SJoerg Sonnenberger struct udf_mnt *udfmp; 6803998195SJoerg Sonnenberger struct buf *bp; 6903998195SJoerg Sonnenberger uint8_t *data; 7003998195SJoerg Sonnenberger uint8_t *buf; 7103998195SJoerg Sonnenberger int fsize; 7203998195SJoerg Sonnenberger int off; 7303998195SJoerg Sonnenberger int this_off; 7403998195SJoerg Sonnenberger int offset; 7503998195SJoerg Sonnenberger int size; 7603998195SJoerg Sonnenberger int error; 7703998195SJoerg Sonnenberger int fid_fragment; 7803998195SJoerg Sonnenberger }; 7903998195SJoerg Sonnenberger 8003998195SJoerg Sonnenberger #define VFSTOUDFFS(mp) ((struct udf_mnt *)((mp)->mnt_data)) 8103998195SJoerg Sonnenberger #define VTON(vp) ((struct udf_node *)((vp)->v_data)) 8203998195SJoerg Sonnenberger 8303998195SJoerg Sonnenberger /* 8403998195SJoerg Sonnenberger * The block layer refers to things in terms of 512 byte blocks by default. 8503998195SJoerg Sonnenberger * btodb() is expensive, so speed things up. 8603998195SJoerg Sonnenberger * XXX Can the block layer be forced to use a different block size? 8703998195SJoerg Sonnenberger */ 8803998195SJoerg Sonnenberger #define RDSECTOR(devvp, sector, size, bp) \ 8954078292SMatthew Dillon bread(devvp, (off_t)(sector) << udfmp->bshift, size, bp) 9003998195SJoerg Sonnenberger 9103998195SJoerg Sonnenberger MALLOC_DECLARE(M_UDFFENTRY); 9203998195SJoerg Sonnenberger MALLOC_DECLARE(M_UDFNODE); 9303998195SJoerg Sonnenberger 9403998195SJoerg Sonnenberger static __inline int 9503998195SJoerg Sonnenberger udf_readlblks(struct udf_mnt *udfmp, int sector, int size, struct buf **bp) 9603998195SJoerg Sonnenberger { 9703998195SJoerg Sonnenberger return (RDSECTOR(udfmp->im_devvp, sector, 9803998195SJoerg Sonnenberger (size + udfmp->bmask) & ~udfmp->bmask, bp)); 9903998195SJoerg Sonnenberger } 10003998195SJoerg Sonnenberger 10103998195SJoerg Sonnenberger static __inline int 10203998195SJoerg Sonnenberger udf_readalblks(struct udf_mnt *udfmp, int lsector, int size, struct buf **bp) 10303998195SJoerg Sonnenberger { 10454078292SMatthew Dillon off_t raoffset; 10554078292SMatthew Dillon off_t loffset; 10603998195SJoerg Sonnenberger int rasize; 10703998195SJoerg Sonnenberger 10854078292SMatthew Dillon loffset = (off_t)(lsector + udfmp->part_start) << udfmp->bshift; 10954078292SMatthew Dillon raoffset = loffset + (1 << udfmp->bshift); 11003998195SJoerg Sonnenberger rasize = size; 11103998195SJoerg Sonnenberger 11254078292SMatthew Dillon return (breadn(udfmp->im_devvp, loffset, 11303998195SJoerg Sonnenberger (size + udfmp->bmask) & ~udfmp->bmask, 11454078292SMatthew Dillon &raoffset, &rasize, 1, bp)); 11503998195SJoerg Sonnenberger } 11603998195SJoerg Sonnenberger 11703998195SJoerg Sonnenberger /* 11803998195SJoerg Sonnenberger * Produce a suitable file number from an ICB. 11903998195SJoerg Sonnenberger * XXX If the fileno resolves to 0, we might be in big trouble. 12003998195SJoerg Sonnenberger * XXX Assumes the ICB is a long_ad. This struct is compatible with short_ad, 12103998195SJoerg Sonnenberger * but not ext_ad. 12203998195SJoerg Sonnenberger */ 12303998195SJoerg Sonnenberger static __inline ino_t 12403998195SJoerg Sonnenberger udf_getid(struct long_ad *icb) 12503998195SJoerg Sonnenberger { 12603998195SJoerg Sonnenberger return (icb->loc.lb_num); 12703998195SJoerg Sonnenberger } 12803998195SJoerg Sonnenberger 12903998195SJoerg Sonnenberger int udf_allocv(struct mount *, struct vnode **); 13003998195SJoerg Sonnenberger int udf_hashlookup(struct udf_mnt *, ino_t, struct vnode **); 13103998195SJoerg Sonnenberger int udf_hashins(struct udf_node *); 13203998195SJoerg Sonnenberger int udf_hashrem(struct udf_node *); 13303998195SJoerg Sonnenberger int udf_checktag(struct desc_tag *, uint16_t); 134*b9b0a6d0SMatthew Dillon int udf_vget(struct mount *, struct vnode *, ino_t, struct vnode **); 135