ext2_subr.c revision 139778
1130803Smarcel/*-
2130803Smarcel *  modified for Lites 1.1
3130803Smarcel *
4130803Smarcel *  Aug 1995, Godmar Back (gback@cs.utah.edu)
5130803Smarcel *  University of Utah, Department of Computer Science
6130803Smarcel */
7130803Smarcel/*-
8130803Smarcel * Copyright (c) 1982, 1986, 1989, 1993
9130803Smarcel *	The Regents of the University of California.  All rights reserved.
10130803Smarcel *
11130803Smarcel * Redistribution and use in source and binary forms, with or without
12130803Smarcel * modification, are permitted provided that the following conditions
13130803Smarcel * are met:
14130803Smarcel * 1. Redistributions of source code must retain the above copyright
15130803Smarcel *    notice, this list of conditions and the following disclaimer.
16130803Smarcel * 2. Redistributions in binary form must reproduce the above copyright
17130803Smarcel *    notice, this list of conditions and the following disclaimer in the
18130803Smarcel *    documentation and/or other materials provided with the distribution.
19130803Smarcel * 4. Neither the name of the University nor the names of its contributors
20130803Smarcel *    may be used to endorse or promote products derived from this software
21130803Smarcel *    without specific prior written permission.
22130803Smarcel *
23130803Smarcel * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24130803Smarcel * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25130803Smarcel * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26130803Smarcel * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27130803Smarcel * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28130803Smarcel * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29130803Smarcel * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30130803Smarcel * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31130803Smarcel * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32130803Smarcel * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33130803Smarcel * SUCH DAMAGE.
34130803Smarcel *
35130803Smarcel *	@(#)ffs_subr.c	8.2 (Berkeley) 9/21/93
36130803Smarcel * $FreeBSD: head/sys/gnu/fs/ext2fs/ext2_subr.c 139778 2005-01-06 18:27:30Z imp $
37130803Smarcel */
38130803Smarcel
39130803Smarcel#include <sys/param.h>
40130803Smarcel
41130803Smarcel#include <sys/proc.h>
42130803Smarcel#include <sys/systm.h>
43130803Smarcel#include <sys/bio.h>
44#include <sys/buf.h>
45#include <sys/lock.h>
46#include <sys/ucred.h>
47#include <sys/vnode.h>
48
49#include <gnu/ext2fs/inode.h>
50#include <gnu/ext2fs/ext2_extern.h>
51#include <gnu/ext2fs/ext2_fs_sb.h>
52#include <gnu/ext2fs/fs.h>
53
54#ifdef KDB
55void	ext2_checkoverlap(struct buf *, struct inode *);
56#endif
57
58/*
59 * Return buffer with the contents of block "offset" from the beginning of
60 * directory "ip".  If "res" is non-zero, fill it in with a pointer to the
61 * remaining space in the directory.
62 */
63int
64ext2_blkatoff(vp, offset, res, bpp)
65	struct vnode *vp;
66	off_t offset;
67	char **res;
68	struct buf **bpp;
69{
70	struct inode *ip;
71	struct ext2_sb_info *fs;
72	struct buf *bp;
73	int32_t lbn;
74	int bsize, error;
75
76	ip = VTOI(vp);
77	fs = ip->i_e2fs;
78	lbn = lblkno(fs, offset);
79	bsize = blksize(fs, ip, lbn);
80
81	*bpp = NULL;
82	if ((error = bread(vp, lbn, bsize, NOCRED, &bp)) != 0) {
83		brelse(bp);
84		return (error);
85	}
86	if (res)
87		*res = (char *)bp->b_data + blkoff(fs, offset);
88	*bpp = bp;
89	return (0);
90}
91
92#ifdef KDB
93void
94ext2_checkoverlap(bp, ip)
95	struct buf *bp;
96	struct inode *ip;
97{
98	struct buf *ebp, *ep;
99	int32_t start, last;
100	struct vnode *vp;
101
102	ebp = &buf[nbuf];
103	start = bp->b_blkno;
104	last = start + btodb(bp->b_bcount) - 1;
105	for (ep = buf; ep < ebp; ep++) {
106		if (ep == bp || (ep->b_flags & B_INVAL))
107			continue;
108		vp = ip->i_devvp;
109		/* look for overlap */
110		if (ep->b_bcount == 0 || ep->b_blkno > last ||
111		    ep->b_blkno + btodb(ep->b_bcount) <= start)
112			continue;
113		vprint("Disk overlap", vp);
114		(void)printf("\tstart %d, end %d overlap start %lld, end %ld\n",
115			start, last, (long long)ep->b_blkno,
116			(long)(ep->b_blkno + btodb(ep->b_bcount) - 1));
117		panic("Disk buffer overlap");
118	}
119}
120#endif /* KDB */
121