1 /* $OpenBSD: cd9660_bmap.c,v 1.10 2021/03/05 07:01:36 jsg Exp $ */
2 /* $NetBSD: cd9660_bmap.c,v 1.7 1997/01/24 00:27:29 cgd Exp $ */
3
4 /*-
5 * Copyright (c) 1994
6 * The Regents of the University of California. All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley
9 * by Pace Willisson (pace@blitz.com). The Rock Ridge Extension
10 * Support code is derived from software contributed to Berkeley
11 * by Atsushi Murai (amurai@spec.co.jp).
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. Neither the name of the University nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 * @(#)cd9660_bmap.c 8.4 (Berkeley) 12/5/94
38 */
39
40 #include <sys/param.h>
41 #include <sys/namei.h>
42 #include <sys/buf.h>
43 #include <sys/vnode.h>
44 #include <sys/lock.h>
45 #include <sys/mount.h>
46
47 #include <isofs/cd9660/iso.h>
48 #include <isofs/cd9660/cd9660_extern.h>
49 #include <isofs/cd9660/cd9660_node.h>
50
51 /*
52 * Bmap converts a the logical block number of a file to its physical block
53 * number on the disk. The conversion is done by using the logical block
54 * number to index into the data block (extent) for the file.
55 */
56 int
cd9660_bmap(void * v)57 cd9660_bmap(void *v)
58 {
59 struct vop_bmap_args *ap = v;
60 struct iso_node *ip = VTOI(ap->a_vp);
61 daddr_t lblkno = ap->a_bn;
62 int bshift;
63
64 /*
65 * Check for underlying vnode requests and ensure that logical
66 * to physical mapping is requested.
67 */
68 if (ap->a_vpp != NULL)
69 *ap->a_vpp = ip->i_devvp;
70 if (ap->a_bnp == NULL)
71 return (0);
72
73 /*
74 * Compute the requested block number
75 */
76 bshift = ip->i_mnt->im_bshift;
77 *ap->a_bnp = (ip->iso_start + lblkno) << (bshift - DEV_BSHIFT);
78
79 /*
80 * Determine maximum number of readahead blocks following the
81 * requested block.
82 */
83 if (ap->a_runp) {
84 int nblk;
85
86 nblk = (ip->i_size >> bshift) - (lblkno + 1);
87 if (nblk <= 0)
88 *ap->a_runp = 0;
89 else if (nblk >= (MAXBSIZE >> bshift))
90 *ap->a_runp = (MAXBSIZE >> bshift) - 1;
91 else
92 *ap->a_runp = nblk;
93 }
94
95 return (0);
96 }
97