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