sys/vfs/udf/udf.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | /*- * Copyright (c) 2001, 2002 Scott Long <scottl@freebsd.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: src/sys/fs/udf/udf.h,v 1.6 2003/11/05 06:56:08 scottl Exp $ */ #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)) /* * The block layer refers to things in terms of 512 byte blocks by default. * btodb() is expensive, so speed things up. * XXX Can the block layer be forced to use a different block size? */ #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)); } /* * Produce a suitable file number from an ICB. * XXX If the fileno resolves to 0, we might be in big trouble. * XXX Assumes the ICB is a long_ad. This struct is compatible with short_ad, * but not ext_ad. */ 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 **); |