if (blocks) size = blocks << inode->i_blkbits; else 
if (blocks) { offset = blocks << inode->i_blkbits;	/* 64 bit goodness */ size = (ssize_t) min_t(xfs_off_t, offset, LONG_MAX); } else { 
__linvfs_get_block(	struct inode		*inode,	sector_t		iblock,	unsigned long		blocks,	struct buffer_head	*bh_result,	int			create,	int			direct,	bmapi_flags_t		flags){	vnode_t			*vp = LINVFS_GET_VP(inode);	xfs_iomap_t		iomap;	int			retpbbm = 1;	int			error;	ssize_t			size;	loff_t			offset = (loff_t)iblock << inode->i_blkbits;	if (blocks)		size = blocks << inode->i_blkbits;	else		size = 1 << inode->i_blkbits;	VOP_BMAP(vp, offset, size,		create ? flags : BMAPI_READ, &iomap, &retpbbm, error);	if (error)		return -error;	if (retpbbm == 0)		return 0;	if (iomap.iomap_bn != IOMAP_DADDR_NULL) {		xfs_daddr_t		bn;		loff_t			delta;		/* For unwritten extents do not report a disk address on		 * the read case (treat as if we're reading into a hole).		 */		if (create || !(iomap.iomap_flags & IOMAP_UNWRITTEN)) {			delta = offset - iomap.iomap_offset;			delta >>= inode->i_blkbits;			bn = iomap.iomap_bn >> (inode->i_blkbits - BBSHIFT);			bn += delta;			BUG_ON(!bn && !(iomap.iomap_flags & IOMAP_REALTIME));			bh_result->b_blocknr = bn;			set_buffer_mapped(bh_result);		}		if (create && (iomap.iomap_flags & IOMAP_UNWRITTEN)) {			if (direct)				bh_result->b_private = inode;			set_buffer_unwritten(bh_result);			set_buffer_delay(bh_result);		}	}	/* If this is a realtime file, data might be on a new device */	bh_result->b_bdev = iomap.iomap_target->pbr_bdev;	/* If we previously allocated a block out beyond eof and	 * we are now coming back to use it then we will need to	 * flag it as new even if it has a disk address.	 */	if (create &&	    ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) ||	     (offset >= i_size_read(inode)) || (iomap.iomap_flags & IOMAP_NEW))) {		set_buffer_new(bh_result);	}	if (iomap.iomap_flags & IOMAP_DELAY) {		BUG_ON(direct);		if (create) {			set_buffer_uptodate(bh_result);			set_buffer_mapped(bh_result);			set_buffer_delay(bh_result);		}	}	if (blocks) {		bh_result->b_size = (ssize_t)min(			(loff_t)(iomap.iomap_bsize - iomap.iomap_delta),			(loff_t)(blocks << inode->i_blkbits));	}	return 0;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/fdc7ed75c08d507aa64c603b8bb7ef478dcc0000/xfs_aops.c/clean/fs/xfs/linux-2.6/xfs_aops.c