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