xref: /titanic_50/usr/src/uts/common/fs/ufs/ufs_bmap.c (revision 82d33c01b078ed404a986a369750cdb4743773fb)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 /*
31  * University Copyright- Copyright (c) 1982, 1986, 1988
32  * The Regents of the University of California
33  * All Rights Reserved
34  *
35  * University Acknowledgment- Portions of this document are derived from
36  * software developed by the University of California, Berkeley, and its
37  * contributors.
38  */
39 
40 
41 #pragma ident	"%Z%%M%	%I%	%E% SMI"
42 
43 #include <sys/types.h>
44 #include <sys/t_lock.h>
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/signal.h>
48 #include <sys/user.h>
49 #include <sys/vnode.h>
50 #include <sys/buf.h>
51 #include <sys/disp.h>
52 #include <sys/proc.h>
53 #include <sys/conf.h>
54 #include <sys/fs/ufs_inode.h>
55 #include <sys/fs/ufs_fs.h>
56 #include <sys/fs/ufs_quota.h>
57 #include <sys/fs/ufs_trans.h>
58 #include <sys/fs/ufs_bio.h>
59 #include <vm/seg.h>
60 #include <sys/errno.h>
61 #include <sys/sysmacros.h>
62 #include <sys/vfs.h>
63 #include <sys/debug.h>
64 #include <sys/kmem.h>
65 #include <sys/cmn_err.h>
66 
67 /*
68  * This structure is used to track blocks as we allocate them, so that
69  * we can free them if we encounter an error during allocation.  We
70  * keep track of five pieces of information for each allocated block:
71  *   - The number of the newly allocated block
72  *   - The size of the block (lets us deal with fragments if we want)
73  *   - The number of the block containing a pointer to it; or whether
74  *     the pointer is in the inode
75  *   - The offset within the block (or inode) containing a pointer to it.
76  *   - A flag indicating the usage of the block.  (Logging needs to know
77  *     this to avoid overwriting a data block if it was previously used
78  *     for metadata.)
79  */
80 
81 enum ufs_owner_type {
82 	ufs_no_owner,		/* Owner has not yet been updated */
83 	ufs_inode_direct,	/* Listed in inode's direct block table */
84 	ufs_inode_indirect,	/* Listed in inode's indirect block table */
85 	ufs_indirect_block	/* Listed in an indirect block */
86 };
87 
88 struct ufs_allocated_block {
89 	daddr_t this_block;	    /* Number of this block */
90 	off_t block_size;	    /* Size of this block, in bytes */
91 	enum ufs_owner_type owner;  /* Who points to this block? */
92 	daddr_t owner_block;	    /* Number of the owning block */
93 	uint_t owner_offset;	    /* Offset within that block or inode */
94 	int usage_flags;	    /* Usage flags, as expected by free() */
95 };
96 
97 
98 static int findextent(struct fs *fs, daddr32_t *sbp, int n, int *lenp,
99 		int maxtrans);
100 
101 static void ufs_undo_allocation(inode_t *ip, int block_count,
102 	struct ufs_allocated_block table[], int inode_sector_adjust);
103 
104 /*
105  * Find the extent and the matching block number.
106  *
107  * bsize > PAGESIZE
108  *	boff indicates that we want a page in the middle
109  *	min expression is supposed to make sure no extra page[s] after EOF
110  * PAGESIZE >= bsize
111  *	we assume that a page is a multiple of bsize, i.e.,
112  *	boff always == 0
113  *
114  * We always return a length that is suitable for a disk transfer.
115  */
116 #define	DOEXTENT(fs, lbn, boff, bnp, lenp, size, tblp, n, chkfrag, maxtrans) {\
117 	register daddr32_t *dp = (tblp);				\
118 	register int _chkfrag = chkfrag; /* for lint. sigh */		\
119 									\
120 	if (*dp == 0) {							\
121 		*(bnp) = UFS_HOLE;					\
122 	} else {							\
123 		register int len;					\
124 									\
125 		len = findextent(fs, dp, (int)(n), lenp, maxtrans) << 	\
126 			(fs)->fs_bshift; 				\
127 		if (_chkfrag) {						\
128 			register u_offset_t tmp;			\
129 									\
130 			tmp = fragroundup((fs), size) -			\
131 			    (((u_offset_t)lbn) << fs->fs_bshift);	\
132 			len = (int)MIN(tmp, len);			\
133 		}							\
134 		len -= (boff);						\
135 		if (len <= 0) {						\
136 			*(bnp) = UFS_HOLE;				\
137 		} else {						\
138 			*(bnp) = fsbtodb(fs, *dp) + btodb(boff);	\
139 			*(lenp) = len;					\
140 		}							\
141 	}								\
142 }
143 
144 /*
145  * The maximum supported file size is actually somewhat less that 1
146  * terabyte.  This is because the total number of blocks used for the
147  * file and its metadata must fit into the ic_blocks field of the
148  * inode, which is a signed 32-bit quantity.  The metadata allocated
149  * for a file (that is, the single, double, and triple indirect blocks
150  * used to reference the file blocks) is actually quite small,
151  * but just to make sure, we check for overflow in the ic_blocks
152  * ic_blocks fields for all files whose total block count is
153  * within 1 GB of a terabyte.  VERYLARGEFILESIZE below is the number of
154  * 512-byte blocks in a terabyte (2^31), minus the number of 512-byte blocks
155  * in a gigabyte (2^21).  We only check for overflow in the ic_blocks
156  * field if the number of blocks currently allocated to the file is
157  * greater than VERYLARGEFILESIZE.
158  *
159  * Note that file "size" is the not the same as file "length".  A
160  * file's "size" is the number of blocks allocated to it.  A file's
161  * "length" is the maximum offset in the file.  A UFS FILE can have a
162  * length of a terabyte, but the size is limited to somewhat less than
163  * a terabyte, as described above.
164  */
165 #define	VERYLARGEFILESIZE	0x7FE00000
166 
167 /*
168  * bmap{read,write} define the structure of file system storage by mapping
169  * a logical offset in a file to a physical block number on the device.
170  * It should be called with a locked inode when allocation is to be
171  * done (bmap_write).  Note this strangeness: bmap_write is always called from
172  * getpage(), not putpage(), since getpage() is where all the allocation
173  * is done.
174  *
175  * S_READ, S_OTHER -> bmap_read; S_WRITE -> bmap_write.
176  *
177  * NOTICE: the block number returned is the disk block number, not the
178  * file system block number.  All the worries about block offsets and
179  * page/block sizes are hidden inside of bmap.  Well, not quite,
180  * unfortunately.  It's impossible to find one place to hide all this
181  * mess.  There are 3 cases:
182  *
183  * PAGESIZE < bsize
184  *	In this case, the {get,put}page routines will attempt to align to
185  *	a file system block boundry (XXX - maybe this is a mistake?).  Since
186  *	the kluster routines may be out of memory, we don't always get all
187  *	the pages we wanted.  If we called bmap first, to find out how much
188  *	to kluster, we handed in the block aligned offset.  If we didn't get
189  *	all the pages, we have to chop off the amount we didn't get from the
190  *	amount handed back by bmap.
191  *
192  * PAGESIZE == bsize
193  *	Life is quite pleasant here, no extra work needed, mainly because we
194  *	(probably?) won't kluster backwards, just forwards.
195  *
196  * PAGESIZE > bsize
197  *	This one has a different set of problems, specifically, we may have to
198  *	do N reads to fill one page.  Let us hope that Sun will stay with small
199  *	pages.
200  *
201  * Returns 0 on success, or a non-zero errno if an error occurs.
202  *
203  * TODO
204  *	LMXXX - add a bmap cache.  This could be a couple of extents in the
205  *	inode.  Two is nice for PAGESIZE > bsize.
206  */
207 
208 int
209 bmap_read(struct inode *ip, u_offset_t off, daddr_t *bnp, int *lenp)
210 {
211 	daddr_t lbn;
212 	ufsvfs_t *ufsvfsp = ip->i_ufsvfs;
213 	struct	fs *fs = ufsvfsp->vfs_fs;
214 	struct	buf *bp;
215 	int	i, j, boff;
216 	int	shft;			/* we maintain sh = 1 << shft */
217 	daddr_t	ob, nb, tbn;
218 	daddr32_t *bap;
219 	int	nindirshift, nindiroffset;
220 
221 	ASSERT(RW_LOCK_HELD(&ip->i_contents));
222 	lbn = (daddr_t)lblkno(fs, off);
223 	boff = (int)blkoff(fs, off);
224 	if (lbn < 0)
225 		return (EFBIG);
226 
227 	/*
228 	 * The first NDADDR blocks are direct blocks.
229 	 */
230 	if (lbn < NDADDR) {
231 		DOEXTENT(fs, lbn, boff, bnp, lenp,
232 		    ip->i_size, &ip->i_db[lbn], NDADDR - lbn, 1,
233 			ufsvfsp->vfs_iotransz);
234 		return (0);
235 	}
236 
237 	nindirshift = ufsvfsp->vfs_nindirshift;
238 	nindiroffset = ufsvfsp->vfs_nindiroffset;
239 	/*
240 	 * Determine how many levels of indirection.
241 	 */
242 	shft = 0;				/* sh = 1 */
243 	tbn = lbn - NDADDR;
244 	for (j = NIADDR; j > 0; j--) {
245 		longlong_t	sh;
246 
247 		shft += nindirshift;		/* sh *= nindir */
248 		sh = 1LL << shft;
249 		if (tbn < sh)
250 			break;
251 		tbn -= sh;
252 	}
253 	if (j == 0)
254 		return (EFBIG);
255 
256 	/*
257 	 * Fetch the first indirect block.
258 	 */
259 	nb = ip->i_ib[NIADDR - j];
260 	if (nb == 0) {
261 		*bnp = UFS_HOLE;
262 		return (0);
263 	}
264 
265 	/*
266 	 * Fetch through the indirect blocks.
267 	 */
268 	for (; j <= NIADDR; j++) {
269 		ob = nb;
270 		bp = UFS_BREAD(ufsvfsp,
271 				ip->i_dev, fsbtodb(fs, ob), fs->fs_bsize);
272 		if (bp->b_flags & B_ERROR) {
273 			brelse(bp);
274 			return (EIO);
275 		}
276 		bap = bp->b_un.b_daddr;
277 
278 		ASSERT(!ufs_indir_badblock(ip, bap));
279 
280 		shft -= nindirshift;		/* sh / nindir */
281 		i = (tbn >> shft) & nindiroffset; /* (tbn / sh) % nindir */
282 		nb = bap[i];
283 		if (nb == 0) {
284 			*bnp = UFS_HOLE;
285 			brelse(bp);
286 			return (0);
287 		}
288 		if (j != NIADDR)
289 			brelse(bp);
290 	}
291 	DOEXTENT(fs, lbn, boff, bnp, lenp, ip->i_size, &bap[i],
292 	    MIN(NINDIR(fs) - i, (daddr_t)lblkno(fs, ip->i_size - 1) - lbn + 1),
293 		0, ufsvfsp->vfs_iotransz);
294 	brelse(bp);
295 	return (0);
296 }
297 
298 /*
299  * See bmap_read for general notes.
300  *
301  * The block must be at least size bytes and will be extended or
302  * allocated as needed.  If alloc_type is of type BI_ALLOC_ONLY, then bmap
303  * will not create any in-core pages that correspond to the new disk allocation.
304  * If alloc_type is of BI_FALLOCATE, blocks will be stored as (-1) * block addr
305  * and security is maintained b/c upon reading a negative block number pages
306  * are zeroed. For all other allocation types (BI_NORMAL) the in-core pages will
307  * be created and initialized as needed.
308  *
309  * Returns 0 on success, or a non-zero errno if an error occurs.
310  */
311 int
312 bmap_write(struct inode	*ip, u_offset_t	off, int size,
313     enum bi_type alloc_type, daddr_t *allocblk, struct cred *cr)
314 {
315 	struct	fs *fs;
316 	struct	buf *bp;
317 	int	i;
318 	struct	buf *nbp;
319 	int	j;
320 	int	shft;				/* we maintain sh = 1 << shft */
321 	daddr_t	ob, nb, pref, lbn, llbn, tbn;
322 	daddr32_t *bap;
323 	struct	vnode *vp = ITOV(ip);
324 	long	bsize = VBSIZE(vp);
325 	long	osize, nsize;
326 	int	issync, metaflag, isdirquota;
327 	int	err;
328 	dev_t	dev;
329 	struct	fbuf *fbp;
330 	int	nindirshift;
331 	int	nindiroffset;
332 	struct	ufsvfs	*ufsvfsp;
333 	int	added_sectors;		/* sectors added to this inode */
334 	int	alloced_blocks;		/* fs blocks newly allocated */
335 	struct  ufs_allocated_block undo_table[NIADDR+1];
336 	int	verylargefile = 0;
337 
338 	ASSERT(RW_WRITE_HELD(&ip->i_contents));
339 
340 	if (allocblk)
341 		*allocblk = 0;
342 
343 	ufsvfsp = ip->i_ufsvfs;
344 	fs = ufsvfsp->vfs_bufp->b_un.b_fs;
345 	lbn = (daddr_t)lblkno(fs, off);
346 	if (lbn < 0)
347 		return (EFBIG);
348 	if (ip->i_blocks >= VERYLARGEFILESIZE)
349 		verylargefile = 1;
350 	llbn = (daddr_t)((ip->i_size) ? lblkno(fs, ip->i_size - 1) : 0);
351 	metaflag = isdirquota = 0;
352 	if (((ip->i_mode & IFMT) == IFDIR) ||
353 	    ((ip->i_mode & IFMT) == IFATTRDIR))
354 		isdirquota = metaflag = I_DIR;
355 	else if ((ip->i_mode & IFMT) == IFSHAD)
356 		metaflag = I_SHAD;
357 	else if (ip->i_ufsvfs->vfs_qinod == ip)
358 		isdirquota = metaflag = I_QUOTA;
359 
360 	issync = ((ip->i_flag & ISYNC) != 0);
361 
362 	if (isdirquota || issync) {
363 		alloc_type = BI_NORMAL;	/* make sure */
364 	}
365 
366 	/*
367 	 * If the next write will extend the file into a new block,
368 	 * and the file is currently composed of a fragment
369 	 * this fragment has to be extended to be a full block.
370 	 */
371 	if (llbn < NDADDR && llbn < lbn && (ob = ip->i_db[llbn]) != 0) {
372 		osize = blksize(fs, ip, llbn);
373 		if (osize < bsize && osize > 0) {
374 			/*
375 			 * Check to see if doing this will make the file too
376 			 * big.  Only check if we are dealing with a very
377 			 * large file.
378 			 */
379 			if (verylargefile == 1) {
380 				if (((unsigned)ip->i_blocks +
381 				    btodb(bsize - osize)) > INT_MAX) {
382 					return (EFBIG);
383 				}
384 			}
385 			/*
386 			 * Make sure we have all needed pages setup correctly.
387 			 *
388 			 * We pass S_OTHER to fbread here because we want
389 			 * an exclusive lock on the page in question
390 			 * (see ufs_getpage). I/O to the old block location
391 			 * may still be in progress and we are about to free
392 			 * the old block. We don't want anyone else to get
393 			 * a hold of the old block once we free it until
394 			 * the I/O is complete.
395 			 */
396 			err = fbread(ITOV(ip),
397 				    ((offset_t)llbn << fs->fs_bshift),
398 					(uint_t)bsize, S_OTHER, &fbp);
399 			if (err)
400 				return (err);
401 			pref = blkpref(ip, llbn, (int)llbn, &ip->i_db[0]);
402 			err = realloccg(ip, ob, pref, (int)osize, (int)bsize,
403 					&nb, cr);
404 			if (err) {
405 				if (fbp)
406 					fbrelse(fbp, S_OTHER);
407 				return (err);
408 			}
409 			ASSERT(!ufs_badblock(ip, nb));
410 
411 			/*
412 			 * Update the inode before releasing the
413 			 * lock on the page. If we released the page
414 			 * lock first, the data could be written to it's
415 			 * old address and then destroyed.
416 			 */
417 			TRANS_MATA_ALLOC(ufsvfsp, ip, nb, bsize, 0);
418 			ip->i_db[llbn] = nb;
419 			UFS_SET_ISIZE(((u_offset_t)(llbn + 1)) << fs->fs_bshift,
420 			    ip);
421 			ip->i_blocks += btodb(bsize - osize);
422 			ASSERT((unsigned)ip->i_blocks <= INT_MAX);
423 			TRANS_INODE(ufsvfsp, ip);
424 			ip->i_flag |= IUPD | ICHG | IATTCHG;
425 
426 			/* Caller is responsible for updating i_seq */
427 			/*
428 			 * Don't check metaflag here, directories won't do this
429 			 *
430 			 */
431 			if (issync) {
432 				(void) ufs_fbiwrite(fbp, ip, nb, fs->fs_fsize);
433 			} else {
434 				ASSERT(fbp);
435 				fbrelse(fbp, S_WRITE);
436 			}
437 
438 			if (nb != ob) {
439 				(void) free(ip, ob, (off_t)osize, metaflag);
440 			}
441 		}
442 	}
443 
444 	/*
445 	 * The first NDADDR blocks are direct blocks.
446 	 */
447 	if (lbn < NDADDR) {
448 		nb = ip->i_db[lbn];
449 		if (nb == 0 ||
450 		    ip->i_size < ((u_offset_t)(lbn + 1)) << fs->fs_bshift) {
451 			if (nb != 0) {
452 				/* consider need to reallocate a frag */
453 				osize = fragroundup(fs, blkoff(fs, ip->i_size));
454 				nsize = fragroundup(fs, size);
455 				if (nsize <= osize)
456 					goto gotit;
457 				/*
458 				 * Check to see if doing this will make the
459 				 * file too big.  Only check if we are dealing
460 				 * with a very large file.
461 				 */
462 				if (verylargefile == 1) {
463 					if (((unsigned)ip->i_blocks +
464 					    btodb(nsize - osize)) > INT_MAX) {
465 						return (EFBIG);
466 					}
467 				}
468 				/*
469 				 * need to re-allocate a block or frag
470 				 */
471 				ob = nb;
472 				pref = blkpref(ip, lbn, (int)lbn,
473 								&ip->i_db[0]);
474 				err = realloccg(ip, ob, pref, (int)osize,
475 						(int)nsize, &nb, cr);
476 				if (err)
477 					return (err);
478 				if (allocblk)
479 					*allocblk = nb;
480 				ASSERT(!ufs_badblock(ip, nb));
481 
482 			} else {
483 				/*
484 				 * need to allocate a block or frag
485 				 */
486 				osize = 0;
487 				if (ip->i_size <
488 				    ((u_offset_t)(lbn + 1)) << fs->fs_bshift)
489 					nsize = fragroundup(fs, size);
490 				else
491 					nsize = bsize;
492 				/*
493 				 * Check to see if doing this will make the
494 				 * file too big.  Only check if we are dealing
495 				 * with a very large file.
496 				 */
497 				if (verylargefile == 1) {
498 					if (((unsigned)ip->i_blocks +
499 					    btodb(nsize - osize)) > INT_MAX) {
500 						return (EFBIG);
501 					}
502 				}
503 				pref = blkpref(ip, lbn, (int)lbn, &ip->i_db[0]);
504 				err = alloc(ip, pref, (int)nsize, &nb, cr);
505 				if (err)
506 					return (err);
507 				if (allocblk)
508 					*allocblk = nb;
509 				ASSERT(!ufs_badblock(ip, nb));
510 				ob = nb;
511 			}
512 
513 			/*
514 			 * Read old/create new zero pages
515 			 */
516 			fbp = NULL;
517 			if (osize == 0) {
518 				/*
519 				 * mmap S_WRITE faults always enter here
520 				 */
521 				/*
522 				 * We zero it if its also BI_FALLOCATE, but
523 				 * only for direct blocks!
524 				 */
525 				if (alloc_type == BI_NORMAL ||
526 				    alloc_type == BI_FALLOCATE ||
527 				    P2ROUNDUP_TYPED(size,
528 				    PAGESIZE, u_offset_t) < nsize) {
529 					/* fbzero doesn't cause a pagefault */
530 					fbzero(ITOV(ip),
531 					    ((offset_t)lbn << fs->fs_bshift),
532 					    (uint_t)nsize, &fbp);
533 				}
534 			} else {
535 				err = fbread(vp,
536 				    ((offset_t)lbn << fs->fs_bshift),
537 				    (uint_t)nsize, S_OTHER, &fbp);
538 				if (err) {
539 					if (nb != ob) {
540 						(void) free(ip, nb,
541 						    (off_t)nsize, metaflag);
542 					} else {
543 						(void) free(ip,
544 						    ob + numfrags(fs, osize),
545 						    (off_t)(nsize - osize),
546 						    metaflag);
547 					}
548 					ASSERT(nsize >= osize);
549 					(void) chkdq(ip,
550 						-(long)btodb(nsize - osize),
551 						0, cr, (char **)NULL,
552 						(size_t *)NULL);
553 					return (err);
554 				}
555 			}
556 			TRANS_MATA_ALLOC(ufsvfsp, ip, nb, nsize, 0);
557 			ip->i_db[lbn] = nb;
558 			ip->i_blocks += btodb(nsize - osize);
559 			ASSERT((unsigned)ip->i_blocks <= INT_MAX);
560 			TRANS_INODE(ufsvfsp, ip);
561 			ip->i_flag |= IUPD | ICHG | IATTCHG;
562 
563 			/* Caller is responsible for updating i_seq */
564 
565 			/*
566 			 * Write directory and shadow blocks synchronously so
567 			 * that they never appear with garbage in them on the
568 			 * disk.
569 			 *
570 			 */
571 			if (isdirquota && (ip->i_size ||
572 			    TRANS_ISTRANS(ufsvfsp))) {
573 			/*
574 			 * XXX man not be necessary with harpy trans
575 			 * bug id 1130055
576 			 */
577 				(void) ufs_fbiwrite(fbp, ip, nb, fs->fs_fsize);
578 			} else if (fbp) {
579 				fbrelse(fbp, S_WRITE);
580 			}
581 
582 			if (nb != ob)
583 				(void) free(ip, ob, (off_t)osize, metaflag);
584 		}
585 gotit:
586 		return (0);
587 	}
588 
589 	added_sectors = alloced_blocks = 0;	/* No blocks alloced yet */
590 
591 	/*
592 	 * Determine how many levels of indirection.
593 	 */
594 	nindirshift = ip->i_ufsvfs->vfs_nindirshift;
595 	nindiroffset = ip->i_ufsvfs->vfs_nindiroffset;
596 	pref = 0;
597 	shft = 0;				/* sh = 1 */
598 	tbn = lbn - NDADDR;
599 	for (j = NIADDR; j > 0; j--) {
600 		longlong_t	sh;
601 
602 		shft += nindirshift;		/* sh *= nindir */
603 		sh = 1LL << shft;
604 		if (tbn < sh)
605 			break;
606 		tbn -= sh;
607 	}
608 
609 	if (j == 0)
610 		return (EFBIG);
611 
612 	/*
613 	 * Fetch the first indirect block.
614 	 */
615 	dev = ip->i_dev;
616 	nb = ip->i_ib[NIADDR - j];
617 	if (nb == 0) {
618 		/*
619 		 * Check to see if doing this will make the
620 		 * file too big.  Only check if we are dealing
621 		 * with a very large file.
622 		 */
623 		if (verylargefile == 1) {
624 			if (((unsigned)ip->i_blocks + btodb(bsize))
625 			    > INT_MAX) {
626 				return (EFBIG);
627 			}
628 		}
629 		/*
630 		 * Need to allocate an indirect block.
631 		 */
632 		pref = blkpref(ip, lbn, 0, (daddr32_t *)0);
633 		err = alloc(ip, pref, (int)bsize, &nb, cr);
634 		if (err)
635 			return (err);
636 		TRANS_MATA_ALLOC(ufsvfsp, ip, nb, bsize, 1);
637 		ASSERT(!ufs_badblock(ip, nb));
638 
639 		/*
640 		 * Keep track of this allocation so we can undo it if we
641 		 * get an error later.
642 		 */
643 
644 		ASSERT(alloced_blocks <= NIADDR);
645 
646 		undo_table[alloced_blocks].this_block = nb;
647 		undo_table[alloced_blocks].block_size = bsize;
648 		undo_table[alloced_blocks].owner = ufs_no_owner;
649 		undo_table[alloced_blocks].usage_flags = metaflag | I_IBLK;
650 
651 		alloced_blocks++;
652 
653 		/*
654 		 * Write zero block synchronously so that
655 		 * indirect blocks never point at garbage.
656 		 */
657 		bp = UFS_GETBLK(ufsvfsp, dev, fsbtodb(fs, nb), bsize);
658 
659 		clrbuf(bp);
660 		/* XXX Maybe special-case this? */
661 		TRANS_BUF(ufsvfsp, 0, bsize, bp, DT_ABZERO);
662 		UFS_BWRITE2(ufsvfsp, bp);
663 		if (bp->b_flags & B_ERROR) {
664 			err = geterror(bp);
665 			brelse(bp);
666 			ufs_undo_allocation(ip, alloced_blocks,
667 			    undo_table, added_sectors);
668 			return (err);
669 		}
670 		brelse(bp);
671 
672 		ip->i_ib[NIADDR - j] = nb;
673 		added_sectors += btodb(bsize);
674 		ip->i_blocks += btodb(bsize);
675 		ASSERT((unsigned)ip->i_blocks <= INT_MAX);
676 		TRANS_INODE(ufsvfsp, ip);
677 		ip->i_flag |= IUPD | ICHG | IATTCHG;
678 		/* Caller is responsible for updating i_seq */
679 
680 		/*
681 		 * Update the 'undo table' now that we've linked this block
682 		 * to an inode.
683 		 */
684 
685 		undo_table[alloced_blocks-1].owner = ufs_inode_indirect;
686 		undo_table[alloced_blocks-1].owner_offset = NIADDR - j;
687 
688 		/*
689 		 * In the ISYNC case, wrip will notice that the block
690 		 * count on the inode has changed and will be sure to
691 		 * ufs_iupdat the inode at the end of wrip.
692 		 */
693 	}
694 
695 	/*
696 	 * Fetch through the indirect blocks.
697 	 */
698 	for (; j <= NIADDR; j++) {
699 		ob = nb;
700 		bp = UFS_BREAD(ufsvfsp, ip->i_dev, fsbtodb(fs, ob), bsize);
701 
702 		if (bp->b_flags & B_ERROR) {
703 			err = geterror(bp);
704 			brelse(bp);
705 			/*
706 			 * Return any partial allocations.
707 			 *
708 			 * It is possible that we have not yet made any
709 			 * allocations at this point (if this is the first
710 			 * pass through the loop and we didn't have to
711 			 * allocate the first indirect block, above).
712 			 * In this case, alloced_blocks and added_sectors will
713 			 * be zero, and ufs_undo_allocation will do nothing.
714 			 */
715 			ufs_undo_allocation(ip, alloced_blocks,
716 			    undo_table, added_sectors);
717 			return (err);
718 		}
719 		bap = bp->b_un.b_daddr;
720 		shft -= nindirshift;		/* sh /= nindir */
721 		i = (tbn >> shft) & nindiroffset; /* (tbn / sh) % nindir */
722 		nb = bap[i];
723 
724 		if (nb == 0) {
725 			/*
726 			 * Check to see if doing this will make the
727 			 * file too big.  Only check if we are dealing
728 			 * with a very large file.
729 			 */
730 			if (verylargefile == 1) {
731 				if (((unsigned)ip->i_blocks + btodb(bsize))
732 				    > INT_MAX) {
733 					brelse(bp);
734 					ufs_undo_allocation(ip, alloced_blocks,
735 					    undo_table, added_sectors);
736 					return (EFBIG);
737 				}
738 			}
739 			if (pref == 0) {
740 				if (j < NIADDR) {
741 					/* Indirect block */
742 					pref = blkpref(ip, lbn, 0,
743 						(daddr32_t *)0);
744 				} else {
745 					/* Data block */
746 					pref = blkpref(ip, lbn, i, &bap[0]);
747 				}
748 			}
749 
750 			/*
751 			 * release "bp" buf to avoid deadlock (re-bread later)
752 			 */
753 			brelse(bp);
754 
755 			err = alloc(ip, pref, (int)bsize, &nb, cr);
756 			if (err) {
757 				/*
758 				 * Return any partial allocations.
759 				 */
760 				ufs_undo_allocation(ip, alloced_blocks,
761 				    undo_table, added_sectors);
762 				return (err);
763 			}
764 
765 			ASSERT(!ufs_badblock(ip, nb));
766 			ASSERT(alloced_blocks <= NIADDR);
767 
768 			if (allocblk)
769 				*allocblk = nb;
770 
771 			undo_table[alloced_blocks].this_block = nb;
772 			undo_table[alloced_blocks].block_size = bsize;
773 			undo_table[alloced_blocks].owner = ufs_no_owner;
774 			undo_table[alloced_blocks].usage_flags = metaflag |
775 			    ((j < NIADDR) ? I_IBLK : 0);
776 
777 			alloced_blocks++;
778 
779 			if (j < NIADDR) {
780 				TRANS_MATA_ALLOC(ufsvfsp, ip, nb, bsize, 1);
781 				/*
782 				 * Write synchronously so indirect
783 				 * blocks never point at garbage.
784 				 */
785 				nbp = UFS_GETBLK(
786 					ufsvfsp, dev, fsbtodb(fs, nb), bsize);
787 
788 				clrbuf(nbp);
789 				/* XXX Maybe special-case this? */
790 				TRANS_BUF(ufsvfsp, 0, bsize, nbp, DT_ABZERO);
791 				UFS_BWRITE2(ufsvfsp, nbp);
792 				if (nbp->b_flags & B_ERROR) {
793 					err = geterror(nbp);
794 					brelse(nbp);
795 					/*
796 					 * Return any partial
797 					 * allocations.
798 					 */
799 					ufs_undo_allocation(ip,
800 					    alloced_blocks,
801 					    undo_table, added_sectors);
802 					return (err);
803 				}
804 				brelse(nbp);
805 			} else if (alloc_type == BI_NORMAL ||
806 			    P2ROUNDUP_TYPED(size,
807 			    PAGESIZE, u_offset_t) < bsize) {
808 				TRANS_MATA_ALLOC(ufsvfsp, ip, nb, bsize, 0);
809 				fbzero(ITOV(ip),
810 				    ((offset_t)lbn << fs->fs_bshift),
811 				    (uint_t)bsize, &fbp);
812 
813 				/*
814 				 * Cases which we need to do a synchronous
815 				 * write of the zeroed data pages:
816 				 *
817 				 * 1) If we are writing a directory then we
818 				 * want to write synchronously so blocks in
819 				 * directories never contain garbage.
820 				 *
821 				 * 2) If we are filling in a hole and the
822 				 * indirect block is going to be synchronously
823 				 * written back below we need to make sure
824 				 * that the zeroes are written here before
825 				 * the indirect block is updated so that if
826 				 * we crash before the real data is pushed
827 				 * we will not end up with random data is
828 				 * the middle of the file.
829 				 *
830 				 * 3) If the size of the request rounded up
831 				 * to the system page size is smaller than
832 				 * the file system block size, we want to
833 				 * write out all the pages now so that
834 				 * they are not aborted before they actually
835 				 * make it to ufs_putpage since the length
836 				 * of the inode will not include the pages.
837 				 */
838 
839 				if (isdirquota || (issync &&
840 				    lbn < llbn))
841 					(void) ufs_fbiwrite(fbp, ip, nb,
842 						fs->fs_fsize);
843 				else
844 					fbrelse(fbp, S_WRITE);
845 			}
846 
847 			/*
848 			 * re-acquire "bp" buf
849 			 */
850 			bp = UFS_BREAD(ufsvfsp,
851 					ip->i_dev, fsbtodb(fs, ob), bsize);
852 			if (bp->b_flags & B_ERROR) {
853 				err = geterror(bp);
854 				brelse(bp);
855 				/*
856 				 * Return any partial allocations.
857 				 */
858 				ufs_undo_allocation(ip,
859 				    alloced_blocks,
860 				    undo_table, added_sectors);
861 				return (err);
862 			}
863 			bap = bp->b_un.b_daddr;
864 			bap[i] = nb;
865 
866 			/*
867 			 * The magic explained: j will be equal to NIADDR
868 			 * when we are at the lowest level, this is where the
869 			 * array entries point directly to data blocks. Since
870 			 * we will be 'fallocate'ing we will go ahead and negate
871 			 * the addresses.
872 			 */
873 			if (alloc_type == BI_FALLOCATE && j == NIADDR)
874 				bap[i] = -bap[i];
875 
876 			TRANS_BUF_ITEM_128(ufsvfsp, bap[i], bap, bp, DT_AB);
877 			added_sectors += btodb(bsize);
878 			ip->i_blocks += btodb(bsize);
879 			ASSERT((unsigned)ip->i_blocks <= INT_MAX);
880 			TRANS_INODE(ufsvfsp, ip);
881 			ip->i_flag |= IUPD | ICHG | IATTCHG;
882 
883 			/* Caller is responsible for updating i_seq */
884 
885 			undo_table[alloced_blocks-1].owner =
886 			    ufs_indirect_block;
887 			undo_table[alloced_blocks-1].owner_block = ob;
888 			undo_table[alloced_blocks-1].owner_offset = i;
889 
890 			if (issync) {
891 				UFS_BWRITE2(ufsvfsp, bp);
892 				if (bp->b_flags & B_ERROR) {
893 					err = geterror(bp);
894 					brelse(bp);
895 					/*
896 					 * Return any partial
897 					 * allocations.
898 					 */
899 					ufs_undo_allocation(ip,
900 					    alloced_blocks,
901 					    undo_table, added_sectors);
902 					return (err);
903 				}
904 				brelse(bp);
905 			} else {
906 				bdrwrite(bp);
907 			}
908 		} else {
909 			brelse(bp);
910 		}
911 	}
912 	return (0);
913 }
914 
915 /*
916  * Return 1 if inode has unmapped blocks (UFS holes).
917  */
918 int
919 bmap_has_holes(struct inode *ip)
920 {
921 	struct fs *fs = ip->i_fs;
922 	uint_t	dblks; 			/* # of data blocks */
923 	uint_t	mblks;			/* # of data + metadata blocks */
924 	int	nindirshift;
925 	int	nindiroffset;
926 	uint_t	cnt;
927 	int	n, j, shft;
928 	uint_t nindirblks;
929 
930 	int	fsbshift = fs->fs_bshift;
931 	int	fsboffset = (1 << fsbshift) - 1;
932 
933 	dblks = (ip->i_size + fsboffset) >> fsbshift;
934 	mblks = (ldbtob((u_offset_t)ip->i_blocks) + fsboffset) >> fsbshift;
935 
936 	/*
937 	 * File has only direct blocks.
938 	 */
939 	if (dblks <= NDADDR)
940 		return (mblks < dblks);
941 	nindirshift = ip->i_ufsvfs->vfs_nindirshift;
942 
943 	nindiroffset = ip->i_ufsvfs->vfs_nindiroffset;
944 	nindirblks = nindiroffset + 1;
945 
946 	dblks -= NDADDR;
947 	shft = 0;
948 	/*
949 	 * Determine how many levels of indirection.
950 	 */
951 	for (j = NIADDR; j > 0; j--) {
952 		longlong_t	sh;
953 
954 		shft += nindirshift;	/* sh *= nindir */
955 		sh = 1LL << shft;
956 		if (dblks <= sh)
957 			break;
958 		dblks -= sh;
959 	}
960 	/* LINTED: warning: logical expression always true: op "||" */
961 	ASSERT(NIADDR <= 3);
962 	ASSERT(j <= NIADDR);
963 	if (j == NIADDR)	/* single level indirection */
964 		cnt = NDADDR + 1 + dblks;
965 	else if (j == NIADDR-1) /* double indirection */
966 		cnt = NDADDR + 1 + nindirblks +
967 			1 + (dblks + nindiroffset)/nindirblks + dblks;
968 	else if (j == NIADDR-2) { /* triple indirection */
969 		n = (dblks + nindiroffset)/nindirblks;
970 		cnt = NDADDR + 1 + nindirblks +
971 			1 + nindirblks + nindirblks*nindirblks +
972 			1 + (n + nindiroffset)/nindirblks + n + dblks;
973 	}
974 
975 	return (mblks < cnt);
976 }
977 
978 /*
979  * find some contig blocks starting at *sbp and going for min(n, max_contig)
980  * return the number of blocks (not frags) found.
981  * The array passed in must be at least [0..n-1].
982  */
983 static int
984 findextent(struct fs *fs, daddr32_t *sbp, int n, int *lenp, int maxtransfer)
985 {
986 	register daddr_t bn, nextbn;
987 	register daddr32_t *bp;
988 	register int diff;
989 	int maxtransblk;
990 
991 	if (n <= 0)
992 		return (0);
993 	bn = *sbp;
994 	if (bn == 0)
995 		return (0);
996 
997 	diff = fs->fs_frag;
998 	if (*lenp) {
999 		n = MIN(n, lblkno(fs, *lenp));
1000 	} else {
1001 		/*
1002 		 * If the user has set the value for maxcontig lower than
1003 		 * the drive transfer size, then assume they want this
1004 		 * to be the maximum value for the size of the data transfer.
1005 		 */
1006 		maxtransblk = maxtransfer >> DEV_BSHIFT;
1007 		if (fs->fs_maxcontig < maxtransblk) {
1008 			n = MIN(n, fs->fs_maxcontig);
1009 		} else {
1010 			n = MIN(n, maxtransblk);
1011 		}
1012 	}
1013 	bp = sbp;
1014 	while (--n > 0) {
1015 		nextbn = *(bp + 1);
1016 		if (nextbn == 0 || bn + diff != nextbn)
1017 			break;
1018 		bn = nextbn;
1019 		bp++;
1020 	}
1021 	return ((int)(bp - sbp) + 1);
1022 }
1023 
1024 /*
1025  * Free any blocks which had been successfully allocated.  Always called
1026  * as a result of an error, so we don't bother returning an error code
1027  * from here.
1028  *
1029  * If block_count and inode_sector_adjust are both zero, we'll do nothing.
1030  * Thus it is safe to call this as part of error handling, whether or not
1031  * any blocks have been allocated.
1032  *
1033  * The ufs_inode_direct case is currently unused.
1034  */
1035 
1036 static void
1037 ufs_undo_allocation(
1038 	inode_t *ip,
1039 	int block_count,
1040 	struct ufs_allocated_block table[],
1041 	int inode_sector_adjust)
1042 {
1043 	int i;
1044 	int inode_changed;
1045 	int error_updating_pointers;
1046 	struct ufsvfs *ufsvfsp;
1047 
1048 	inode_changed = 0;
1049 	error_updating_pointers = 0;
1050 
1051 	ufsvfsp = ip->i_ufsvfs;
1052 
1053 	/*
1054 	 * Update pointers on disk before freeing blocks.  If we fail,
1055 	 * some blocks may remain busy; but they will be reclaimed by
1056 	 * an fsck.  (This is better than letting a block wind up with
1057 	 * two owners if we successfully freed it but could not remove
1058 	 * the pointer to it.)
1059 	 */
1060 
1061 	for (i = 0; i < block_count; i++) {
1062 		switch (table[i].owner) {
1063 		case ufs_no_owner:
1064 			/* Nothing to do here, nobody points to us */
1065 			break;
1066 		case ufs_inode_direct:
1067 			ASSERT(table[i].owner_offset < NDADDR);
1068 			ip->i_db[table[i].owner_offset] = 0;
1069 			inode_changed = 1;
1070 			break;
1071 		case ufs_inode_indirect:
1072 			ASSERT(table[i].owner_offset < NIADDR);
1073 			ip->i_ib[table[i].owner_offset] = 0;
1074 			inode_changed = 1;
1075 			break;
1076 		case ufs_indirect_block: {
1077 			buf_t *bp;
1078 			daddr32_t *block_data;
1079 
1080 			/* Read/modify/log/write. */
1081 
1082 			ASSERT(table[i].owner_offset <
1083 			    (VBSIZE(ITOV(ip)) / sizeof (daddr32_t)));
1084 
1085 			bp = UFS_BREAD(ufsvfsp, ip->i_dev,
1086 			    fsbtodb(ufsvfsp->vfs_fs, table[i].owner_block),
1087 			    VBSIZE(ITOV(ip)));
1088 
1089 			if (bp->b_flags & B_ERROR) {
1090 				/* Couldn't read this block; give up. */
1091 				error_updating_pointers = 1;
1092 				brelse(bp);
1093 				break;		/* out of SWITCH */
1094 			}
1095 
1096 			block_data = bp->b_un.b_daddr;
1097 			block_data[table[i].owner_offset] = 0;
1098 
1099 			/* Write a log entry which includes the zero. */
1100 			/* It might be possible to optimize this by using */
1101 			/* TRANS_BUF directly and zeroing only the four */
1102 			/* bytes involved, but an attempt to do that led */
1103 			/* to panics in the logging code.  The attempt was */
1104 			/* TRANS_BUF(ufsvfsp,				  */
1105 			/*    table[i].owner_offset * sizeof (daddr32_t), */
1106 			/*    sizeof (daddr32_t),			  */
1107 			/*    bp,					  */
1108 			/*    DT_ABZERO);				  */
1109 
1110 			TRANS_BUF_ITEM_128(ufsvfsp,
1111 			    block_data[table[i].owner_offset],
1112 			    block_data, bp, DT_AB);
1113 
1114 			/* Now we can write the buffer itself. */
1115 
1116 			UFS_BWRITE2(ufsvfsp, bp);
1117 
1118 			if (bp->b_flags & B_ERROR) {
1119 				error_updating_pointers = 1;
1120 			}
1121 
1122 			brelse(bp);
1123 			break;
1124 		}
1125 		default:
1126 			(void) ufs_fault(ITOV(ip),
1127 			    "ufs_undo_allocation failure\n");
1128 			break;
1129 		}
1130 	}
1131 
1132 	/*
1133 	 * If the inode changed, or if we need to update its block count,
1134 	 * then do that now.  We update the inode synchronously on disk
1135 	 * to ensure that it won't transiently point at a block we've
1136 	 * freed (only necessary if we're not logging).
1137 	 *
1138 	 * NOTE: Currently ufs_iupdat() does not check for errors.  When
1139 	 * it is fixed, we should verify that we successfully updated the
1140 	 * inode before freeing blocks below.
1141 	 */
1142 
1143 	if (inode_changed || (inode_sector_adjust != 0)) {
1144 		ip->i_blocks -= inode_sector_adjust;
1145 		ASSERT((unsigned)ip->i_blocks <= INT_MAX);
1146 		TRANS_INODE(ufsvfsp, ip);
1147 		ip->i_flag |= IUPD | ICHG | IATTCHG;
1148 		ip->i_seq++;
1149 		if (!TRANS_ISTRANS(ufsvfsp))
1150 			ufs_iupdat(ip, I_SYNC);
1151 	}
1152 
1153 	/*
1154 	 * Now we go through and actually free the blocks, but only if we
1155 	 * successfully removed the pointers to them.
1156 	 */
1157 
1158 	if (!error_updating_pointers) {
1159 		for (i = 0; i < block_count; i++) {
1160 			free(ip, table[i].this_block, table[i].block_size,
1161 			    table[i].usage_flags);
1162 		}
1163 	}
1164 }
1165 
1166 /*
1167  * Find the next hole or data block in file starting at *off
1168  * Return found offset in *off, which can be less than the
1169  * starting offset if not block aligned.
1170  * This code is based on bmap_read().
1171  * Errors: ENXIO for end of file
1172  *         EIO for block read error.
1173  */
1174 int
1175 bmap_find(struct inode *ip, boolean_t hole, u_offset_t *off)
1176 {
1177 	ufsvfs_t *ufsvfsp = ip->i_ufsvfs;
1178 	struct fs *fs = ufsvfsp->vfs_fs;
1179 	buf_t *bp[NIADDR];
1180 	int i, j;
1181 	int shft;			/* we maintain sh = 1 << shft */
1182 	int nindirshift, nindiroffset;
1183 	daddr_t	ob, nb, tbn, lbn, skip;
1184 	daddr32_t *bap;
1185 	u_offset_t isz = (offset_t)ip->i_size;
1186 	int32_t bs = fs->fs_bsize; /* file system block size */
1187 	int32_t nindir = fs->fs_nindir;
1188 	dev_t dev;
1189 	int error = 0;
1190 	daddr_t limits[NIADDR];
1191 
1192 	ASSERT(*off < isz);
1193 	ASSERT(RW_LOCK_HELD(&ip->i_contents));
1194 	lbn = (daddr_t)lblkno(fs, *off);
1195 	ASSERT(lbn >= 0);
1196 
1197 	for (i = 0; i < NIADDR; i++)
1198 		bp[i] = NULL;
1199 
1200 	/*
1201 	 * The first NDADDR blocks are direct blocks.
1202 	 */
1203 	if (lbn < NDADDR) {
1204 		for (; lbn < NDADDR; lbn++) {
1205 			if ((hole && (ip->i_db[lbn] == 0)) ||
1206 			    (!hole && (ip->i_db[lbn] != 0))) {
1207 				goto out;
1208 			}
1209 		}
1210 		if ((u_offset_t)lbn << fs->fs_bshift >= isz)
1211 			goto out;
1212 	}
1213 
1214 	nindir = fs->fs_nindir;
1215 	nindirshift = ufsvfsp->vfs_nindirshift;
1216 	nindiroffset = ufsvfsp->vfs_nindiroffset;
1217 	dev = ip->i_dev;
1218 
1219 	/* Set up limits array */
1220 	for (limits[0] = NDADDR, j = 1; j  < NIADDR; j++)
1221 		limits[j] = limits[j-1] + (1ULL << (nindirshift * j));
1222 
1223 loop:
1224 	/*
1225 	 * Determine how many levels of indirection.
1226 	 */
1227 	shft = 0;				/* sh = 1 */
1228 	tbn = lbn - NDADDR;
1229 	for (j = NIADDR; j > 0; j--) {
1230 		longlong_t sh;
1231 
1232 		shft += nindirshift;		/* sh *= nindir */
1233 		sh = 1LL << shft;
1234 		if (tbn < sh)
1235 			break;
1236 		tbn -= sh;
1237 	}
1238 	if (j == 0) {
1239 		/* must have passed end of file */
1240 		ASSERT(((u_offset_t)lbn << fs->fs_bshift) >= isz);
1241 		goto out;
1242 	}
1243 
1244 	/*
1245 	 * Fetch the first indirect block.
1246 	 */
1247 	nb = ip->i_ib[NIADDR - j];
1248 	if (nb == 0) {
1249 		if (hole) {
1250 			lbn = limits[NIADDR - j];
1251 			goto out;
1252 		} else {
1253 			lbn = limits[NIADDR - j + 1];
1254 			if ((u_offset_t)lbn << fs->fs_bshift >= isz)
1255 				goto out;
1256 			goto loop;
1257 		}
1258 	}
1259 
1260 	/*
1261 	 * Fetch through the indirect blocks.
1262 	 */
1263 	for (; ((j <= NIADDR) && (nb != 0)); j++) {
1264 		ob = nb;
1265 		/*
1266 		 * if there's a different block at this level then release
1267 		 * the old one and in with the new.
1268 		 */
1269 		if ((bp[j-1] == NULL) || bp[j-1]->b_blkno != fsbtodb(fs, ob)) {
1270 			if (bp[j-1] != NULL)
1271 				brelse(bp[j-1]);
1272 			bp[j-1] = UFS_BREAD(ufsvfsp, dev, fsbtodb(fs, ob), bs);
1273 			if (bp[j-1]->b_flags & B_ERROR) {
1274 				error = EIO;
1275 				goto out;
1276 			}
1277 		}
1278 		bap = bp[j-1]->b_un.b_daddr;
1279 
1280 		shft -= nindirshift;		/* sh / nindir */
1281 		i = (tbn >> shft) & nindiroffset; /* (tbn / sh) % nindir */
1282 		nb = bap[i];
1283 		skip = 1LL << (nindirshift * (NIADDR - j));
1284 	}
1285 
1286 	/*
1287 	 * Scan through the blocks in this array.
1288 	 */
1289 	for (; i < nindir; i++, lbn += skip) {
1290 		if (hole && (bap[i] == 0))
1291 			goto out;
1292 		if (!hole && (bap[i] != 0)) {
1293 			if (skip == 1) {
1294 				/* we're at the lowest level */
1295 				goto out;
1296 			} else {
1297 				goto loop;
1298 			}
1299 		}
1300 	}
1301 	if (((u_offset_t)lbn << fs->fs_bshift) < isz)
1302 		goto loop;
1303 out:
1304 	for (i = 0; i < NIADDR; i++) {
1305 		if (bp[i])
1306 			brelse(bp[i]);
1307 	}
1308 	if (error == 0) {
1309 		if (((u_offset_t)lbn << fs->fs_bshift) >= isz) {
1310 			error = ENXIO;
1311 		} else {
1312 			/* success */
1313 			*off = (u_offset_t)lbn << fs->fs_bshift;
1314 		}
1315 	}
1316 	return (error);
1317 }
1318 
1319 /*
1320  * Set a particular offset in the inode list to be a certain block.
1321  * User is responsible for calling TRANS* functions
1322  */
1323 int
1324 bmap_set_bn(struct vnode *vp, u_offset_t off, daddr32_t bn)
1325 {
1326 	daddr_t lbn;
1327 	struct inode *ip;
1328 	ufsvfs_t *ufsvfsp;
1329 	struct	fs *fs;
1330 	struct	buf *bp;
1331 	int	i, j;
1332 	int	shft;			/* we maintain sh = 1 << shft */
1333 	int err;
1334 	daddr_t	ob, nb, tbn;
1335 	daddr32_t *bap;
1336 	int	nindirshift, nindiroffset;
1337 
1338 	ip = VTOI(vp);
1339 	ufsvfsp = ip->i_ufsvfs;
1340 	fs = ufsvfsp->vfs_fs;
1341 	lbn = (daddr_t)lblkno(fs, off);
1342 
1343 	ASSERT(RW_LOCK_HELD(&ip->i_contents));
1344 
1345 	if (lbn < 0)
1346 		return (EFBIG);
1347 
1348 	/*
1349 	 * Take care of direct block assignment
1350 	 */
1351 	if (lbn < NDADDR) {
1352 		ip->i_db[lbn] = bn;
1353 		return (0);
1354 	}
1355 
1356 	nindirshift = ip->i_ufsvfs->vfs_nindirshift;
1357 	nindiroffset = ip->i_ufsvfs->vfs_nindiroffset;
1358 	/*
1359 	 * Determine how many levels of indirection.
1360 	 */
1361 	shft = 0;				/* sh = 1 */
1362 	tbn = lbn - NDADDR;
1363 	for (j = NIADDR; j > 0; j--) {
1364 		longlong_t	sh;
1365 
1366 		shft += nindirshift;		/* sh *= nindir */
1367 		sh = 1LL << shft;
1368 		if (tbn < sh)
1369 			break;
1370 		tbn -= sh;
1371 	}
1372 	if (j == 0)
1373 		return (EFBIG);
1374 
1375 	/*
1376 	 * Fetch the first indirect block.
1377 	 */
1378 	nb = ip->i_ib[NIADDR - j];
1379 	if (nb == 0)
1380 		err = ufs_fault(ITOV(ip), "ufs_set_bn: nb == UFS_HOLE");
1381 
1382 	/*
1383 	 * Fetch through the indirect blocks.
1384 	 */
1385 	for (; j <= NIADDR; j++) {
1386 		ob = nb;
1387 		bp = UFS_BREAD(ufsvfsp,
1388 				ip->i_dev, fsbtodb(fs, ob), fs->fs_bsize);
1389 		if (bp->b_flags & B_ERROR) {
1390 			err = geterror(bp);
1391 			brelse(bp);
1392 			return (err);
1393 		}
1394 		bap = bp->b_un.b_daddr;
1395 
1396 		ASSERT(!ufs_indir_badblock(ip, bap));
1397 
1398 		shft -= nindirshift;		/* sh / nindir */
1399 		i = (tbn >> shft) & nindiroffset; /* (tbn / sh) % nindir */
1400 
1401 		if (j == NIADDR) {
1402 			bap[i] = bn;
1403 			bdrwrite(bp);
1404 			return (0);
1405 		}
1406 		brelse(bp);
1407 	}
1408 	return (0);
1409 }
1410