]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/ufs/ffs/ffs_balloc.c
MFV r354378,r354379,r354386: 10499 Multi-modifier protection (MMP)
[FreeBSD/FreeBSD.git] / sys / ufs / ffs / ffs_balloc.c
1 /*-
2  * SPDX-License-Identifier: (BSD-2-Clause-FreeBSD AND BSD-3-Clause)
3  *
4  * Copyright (c) 2002 Networks Associates Technology, Inc.
5  * All rights reserved.
6  *
7  * This software was developed for the FreeBSD Project by Marshall
8  * Kirk McKusick and Network Associates Laboratories, the Security
9  * Research Division of Network Associates, Inc. under DARPA/SPAWAR
10  * contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS
11  * research program
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  * Copyright (c) 1982, 1986, 1989, 1993
35  *      The Regents of the University of California.  All rights reserved.
36  *
37  * Redistribution and use in source and binary forms, with or without
38  * modification, are permitted provided that the following conditions
39  * are met:
40  * 1. Redistributions of source code must retain the above copyright
41  *    notice, this list of conditions and the following disclaimer.
42  * 2. Redistributions in binary form must reproduce the above copyright
43  *    notice, this list of conditions and the following disclaimer in the
44  *    documentation and/or other materials provided with the distribution.
45  * 3. Neither the name of the University nor the names of its contributors
46  *    may be used to endorse or promote products derived from this software
47  *    without specific prior written permission.
48  *
49  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59  * SUCH DAMAGE.
60  *
61  *      @(#)ffs_balloc.c        8.8 (Berkeley) 6/16/95
62  */
63
64 #include <sys/cdefs.h>
65 __FBSDID("$FreeBSD$");
66
67 #include <sys/param.h>
68 #include <sys/systm.h>
69 #include <sys/bio.h>
70 #include <sys/buf.h>
71 #include <sys/lock.h>
72 #include <sys/mount.h>
73 #include <sys/vnode.h>
74 #include <sys/vmmeter.h>
75
76 #include <ufs/ufs/quota.h>
77 #include <ufs/ufs/inode.h>
78 #include <ufs/ufs/ufs_extern.h>
79 #include <ufs/ufs/extattr.h>
80 #include <ufs/ufs/ufsmount.h>
81
82 #include <ufs/ffs/fs.h>
83 #include <ufs/ffs/ffs_extern.h>
84
85 /*
86  * Balloc defines the structure of filesystem storage
87  * by allocating the physical blocks on a device given
88  * the inode and the logical block number in a file.
89  * This is the allocation strategy for UFS1. Below is
90  * the allocation strategy for UFS2.
91  */
92 int
93 ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, int size,
94     struct ucred *cred, int flags, struct buf **bpp)
95 {
96         struct inode *ip;
97         struct ufs1_dinode *dp;
98         ufs_lbn_t lbn, lastlbn;
99         struct fs *fs;
100         ufs1_daddr_t nb;
101         struct buf *bp, *nbp;
102         struct mount *mp;
103         struct ufsmount *ump;
104         struct indir indirs[UFS_NIADDR + 2];
105         int deallocated, osize, nsize, num, i, error;
106         ufs2_daddr_t newb;
107         ufs1_daddr_t *bap, pref;
108         ufs1_daddr_t *allocib, *blkp, *allocblk, allociblk[UFS_NIADDR + 1];
109         ufs2_daddr_t *lbns_remfree, lbns[UFS_NIADDR + 1];
110         int unwindidx = -1;
111         int saved_inbdflush;
112         int gbflags, reclaimed;
113
114         ip = VTOI(vp);
115         dp = ip->i_din1;
116         fs = ITOFS(ip);
117         mp = ITOVFS(ip);
118         ump = ITOUMP(ip);
119         lbn = lblkno(fs, startoffset);
120         size = blkoff(fs, startoffset) + size;
121         reclaimed = 0;
122         if (size > fs->fs_bsize)
123                 panic("ffs_balloc_ufs1: blk too big");
124         *bpp = NULL;
125         if (flags & IO_EXT)
126                 return (EOPNOTSUPP);
127         if (lbn < 0)
128                 return (EFBIG);
129         gbflags = (flags & BA_UNMAPPED) != 0 ? GB_UNMAPPED : 0;
130
131         if (DOINGSOFTDEP(vp))
132                 softdep_prealloc(vp, MNT_WAIT);
133         /*
134          * If the next write will extend the file into a new block,
135          * and the file is currently composed of a fragment
136          * this fragment has to be extended to be a full block.
137          */
138         lastlbn = lblkno(fs, ip->i_size);
139         if (lastlbn < UFS_NDADDR && lastlbn < lbn) {
140                 nb = lastlbn;
141                 osize = blksize(fs, ip, nb);
142                 if (osize < fs->fs_bsize && osize > 0) {
143                         UFS_LOCK(ump);
144                         error = ffs_realloccg(ip, nb, dp->di_db[nb],
145                            ffs_blkpref_ufs1(ip, lastlbn, (int)nb,
146                            &dp->di_db[0]), osize, (int)fs->fs_bsize, flags,
147                            cred, &bp);
148                         if (error)
149                                 return (error);
150                         if (DOINGSOFTDEP(vp))
151                                 softdep_setup_allocdirect(ip, nb,
152                                     dbtofsb(fs, bp->b_blkno), dp->di_db[nb],
153                                     fs->fs_bsize, osize, bp);
154                         ip->i_size = smalllblktosize(fs, nb + 1);
155                         dp->di_size = ip->i_size;
156                         dp->di_db[nb] = dbtofsb(fs, bp->b_blkno);
157                         ip->i_flag |= IN_CHANGE | IN_UPDATE;
158                         if (flags & IO_SYNC)
159                                 bwrite(bp);
160                         else if (DOINGASYNC(vp))
161                                 bdwrite(bp);
162                         else
163                                 bawrite(bp);
164                 }
165         }
166         /*
167          * The first UFS_NDADDR blocks are direct blocks
168          */
169         if (lbn < UFS_NDADDR) {
170                 if (flags & BA_METAONLY)
171                         panic("ffs_balloc_ufs1: BA_METAONLY for direct block");
172                 nb = dp->di_db[lbn];
173                 if (nb != 0 && ip->i_size >= smalllblktosize(fs, lbn + 1)) {
174                         error = bread(vp, lbn, fs->fs_bsize, NOCRED, &bp);
175                         if (error) {
176                                 return (error);
177                         }
178                         bp->b_blkno = fsbtodb(fs, nb);
179                         *bpp = bp;
180                         return (0);
181                 }
182                 if (nb != 0) {
183                         /*
184                          * Consider need to reallocate a fragment.
185                          */
186                         osize = fragroundup(fs, blkoff(fs, ip->i_size));
187                         nsize = fragroundup(fs, size);
188                         if (nsize <= osize) {
189                                 error = bread(vp, lbn, osize, NOCRED, &bp);
190                                 if (error) {
191                                         return (error);
192                                 }
193                                 bp->b_blkno = fsbtodb(fs, nb);
194                         } else {
195                                 UFS_LOCK(ump);
196                                 error = ffs_realloccg(ip, lbn, dp->di_db[lbn],
197                                     ffs_blkpref_ufs1(ip, lbn, (int)lbn,
198                                     &dp->di_db[0]), osize, nsize, flags,
199                                     cred, &bp);
200                                 if (error)
201                                         return (error);
202                                 if (DOINGSOFTDEP(vp))
203                                         softdep_setup_allocdirect(ip, lbn,
204                                             dbtofsb(fs, bp->b_blkno), nb,
205                                             nsize, osize, bp);
206                         }
207                 } else {
208                         if (ip->i_size < smalllblktosize(fs, lbn + 1))
209                                 nsize = fragroundup(fs, size);
210                         else
211                                 nsize = fs->fs_bsize;
212                         UFS_LOCK(ump);
213                         error = ffs_alloc(ip, lbn,
214                             ffs_blkpref_ufs1(ip, lbn, (int)lbn, &dp->di_db[0]),
215                             nsize, flags, cred, &newb);
216                         if (error)
217                                 return (error);
218                         bp = getblk(vp, lbn, nsize, 0, 0, gbflags);
219                         bp->b_blkno = fsbtodb(fs, newb);
220                         if (flags & BA_CLRBUF)
221                                 vfs_bio_clrbuf(bp);
222                         if (DOINGSOFTDEP(vp))
223                                 softdep_setup_allocdirect(ip, lbn, newb, 0,
224                                     nsize, 0, bp);
225                 }
226                 dp->di_db[lbn] = dbtofsb(fs, bp->b_blkno);
227                 ip->i_flag |= IN_CHANGE | IN_UPDATE;
228                 *bpp = bp;
229                 return (0);
230         }
231         /*
232          * Determine the number of levels of indirection.
233          */
234         pref = 0;
235         if ((error = ufs_getlbns(vp, lbn, indirs, &num)) != 0)
236                 return(error);
237 #ifdef INVARIANTS
238         if (num < 1)
239                 panic ("ffs_balloc_ufs1: ufs_getlbns returned indirect block");
240 #endif
241         saved_inbdflush = curthread_pflags_set(TDP_INBDFLUSH);
242         /*
243          * Fetch the first indirect block allocating if necessary.
244          */
245         --num;
246         nb = dp->di_ib[indirs[0].in_off];
247         allocib = NULL;
248         allocblk = allociblk;
249         lbns_remfree = lbns;
250         if (nb == 0) {
251                 UFS_LOCK(ump);
252                 pref = ffs_blkpref_ufs1(ip, lbn, -indirs[0].in_off - 1,
253                     (ufs1_daddr_t *)0);
254                 if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
255                     flags, cred, &newb)) != 0) {
256                         curthread_pflags_restore(saved_inbdflush);
257                         return (error);
258                 }
259                 pref = newb + fs->fs_frag;
260                 nb = newb;
261                 MPASS(allocblk < allociblk + nitems(allociblk));
262                 MPASS(lbns_remfree < lbns + nitems(lbns));
263                 *allocblk++ = nb;
264                 *lbns_remfree++ = indirs[1].in_lbn;
265                 bp = getblk(vp, indirs[1].in_lbn, fs->fs_bsize, 0, 0, gbflags);
266                 bp->b_blkno = fsbtodb(fs, nb);
267                 vfs_bio_clrbuf(bp);
268                 if (DOINGSOFTDEP(vp)) {
269                         softdep_setup_allocdirect(ip,
270                             UFS_NDADDR + indirs[0].in_off, newb, 0,
271                             fs->fs_bsize, 0, bp);
272                         bdwrite(bp);
273                 } else if ((flags & IO_SYNC) == 0 && DOINGASYNC(vp)) {
274                         if (bp->b_bufsize == fs->fs_bsize)
275                                 bp->b_flags |= B_CLUSTEROK;
276                         bdwrite(bp);
277                 } else {
278                         if ((error = bwrite(bp)) != 0)
279                                 goto fail;
280                 }
281                 allocib = &dp->di_ib[indirs[0].in_off];
282                 *allocib = nb;
283                 ip->i_flag |= IN_CHANGE | IN_UPDATE;
284         }
285         /*
286          * Fetch through the indirect blocks, allocating as necessary.
287          */
288 retry:
289         for (i = 1;;) {
290                 error = bread(vp,
291                     indirs[i].in_lbn, (int)fs->fs_bsize, NOCRED, &bp);
292                 if (error) {
293                         goto fail;
294                 }
295                 bap = (ufs1_daddr_t *)bp->b_data;
296                 nb = bap[indirs[i].in_off];
297                 if ((error = UFS_CHECK_BLKNO(mp, ip->i_number, nb,
298                     fs->fs_bsize)) != 0) {
299                         brelse(bp);
300                         goto fail;
301                 }
302                 if (i == num)
303                         break;
304                 i += 1;
305                 if (nb != 0) {
306                         bqrelse(bp);
307                         continue;
308                 }
309                 UFS_LOCK(ump);
310                 /*
311                  * If parent indirect has just been allocated, try to cluster
312                  * immediately following it.
313                  */
314                 if (pref == 0)
315                         pref = ffs_blkpref_ufs1(ip, lbn, i - num - 1,
316                             (ufs1_daddr_t *)0);
317                 if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
318                     flags | IO_BUFLOCKED, cred, &newb)) != 0) {
319                         brelse(bp);
320                         UFS_LOCK(ump);
321                         if (DOINGSOFTDEP(vp) && ++reclaimed == 1) {
322                                 softdep_request_cleanup(fs, vp, cred,
323                                     FLUSH_BLOCKS_WAIT);
324                                 UFS_UNLOCK(ump);
325                                 goto retry;
326                         }
327                         if (ppsratecheck(&ump->um_last_fullmsg,
328                             &ump->um_secs_fullmsg, 1)) {
329                                 UFS_UNLOCK(ump);
330                                 ffs_fserr(fs, ip->i_number, "filesystem full");
331                                 uprintf("\n%s: write failed, filesystem "
332                                     "is full\n", fs->fs_fsmnt);
333                         } else {
334                                 UFS_UNLOCK(ump);
335                         }
336                         goto fail;
337                 }
338                 pref = newb + fs->fs_frag;
339                 nb = newb;
340                 MPASS(allocblk < allociblk + nitems(allociblk));
341                 MPASS(lbns_remfree < lbns + nitems(lbns));
342                 *allocblk++ = nb;
343                 *lbns_remfree++ = indirs[i].in_lbn;
344                 nbp = getblk(vp, indirs[i].in_lbn, fs->fs_bsize, 0, 0, 0);
345                 nbp->b_blkno = fsbtodb(fs, nb);
346                 vfs_bio_clrbuf(nbp);
347                 if (DOINGSOFTDEP(vp)) {
348                         softdep_setup_allocindir_meta(nbp, ip, bp,
349                             indirs[i - 1].in_off, nb);
350                         bdwrite(nbp);
351                 } else if ((flags & IO_SYNC) == 0 && DOINGASYNC(vp)) {
352                         if (nbp->b_bufsize == fs->fs_bsize)
353                                 nbp->b_flags |= B_CLUSTEROK;
354                         bdwrite(nbp);
355                 } else {
356                         if ((error = bwrite(nbp)) != 0) {
357                                 brelse(bp);
358                                 goto fail;
359                         }
360                 }
361                 bap[indirs[i - 1].in_off] = nb;
362                 if (allocib == NULL && unwindidx < 0)
363                         unwindidx = i - 1;
364                 /*
365                  * If required, write synchronously, otherwise use
366                  * delayed write.
367                  */
368                 if (flags & IO_SYNC) {
369                         bwrite(bp);
370                 } else {
371                         if (bp->b_bufsize == fs->fs_bsize)
372                                 bp->b_flags |= B_CLUSTEROK;
373                         bdwrite(bp);
374                 }
375         }
376         /*
377          * If asked only for the indirect block, then return it.
378          */
379         if (flags & BA_METAONLY) {
380                 curthread_pflags_restore(saved_inbdflush);
381                 *bpp = bp;
382                 return (0);
383         }
384         /*
385          * Get the data block, allocating if necessary.
386          */
387         if (nb == 0) {
388                 UFS_LOCK(ump);
389                 /*
390                  * If allocating metadata at the front of the cylinder
391                  * group and parent indirect block has just been allocated,
392                  * then cluster next to it if it is the first indirect in
393                  * the file. Otherwise it has been allocated in the metadata
394                  * area, so we want to find our own place out in the data area.
395                  */
396                 if (pref == 0 || (lbn > UFS_NDADDR && fs->fs_metaspace != 0))
397                         pref = ffs_blkpref_ufs1(ip, lbn, indirs[i].in_off,
398                             &bap[0]);
399                 error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
400                     flags | IO_BUFLOCKED, cred, &newb);
401                 if (error) {
402                         brelse(bp);
403                         UFS_LOCK(ump);
404                         if (DOINGSOFTDEP(vp) && ++reclaimed == 1) {
405                                 softdep_request_cleanup(fs, vp, cred,
406                                     FLUSH_BLOCKS_WAIT);
407                                 UFS_UNLOCK(ump);
408                                 goto retry;
409                         }
410                         if (ppsratecheck(&ump->um_last_fullmsg,
411                             &ump->um_secs_fullmsg, 1)) {
412                                 UFS_UNLOCK(ump);
413                                 ffs_fserr(fs, ip->i_number, "filesystem full");
414                                 uprintf("\n%s: write failed, filesystem "
415                                     "is full\n", fs->fs_fsmnt);
416                         } else {
417                                 UFS_UNLOCK(ump);
418                         }
419                         goto fail;
420                 }
421                 nb = newb;
422                 MPASS(allocblk < allociblk + nitems(allociblk));
423                 MPASS(lbns_remfree < lbns + nitems(lbns));
424                 *allocblk++ = nb;
425                 *lbns_remfree++ = lbn;
426                 nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, gbflags);
427                 nbp->b_blkno = fsbtodb(fs, nb);
428                 if (flags & BA_CLRBUF)
429                         vfs_bio_clrbuf(nbp);
430                 if (DOINGSOFTDEP(vp))
431                         softdep_setup_allocindir_page(ip, lbn, bp,
432                             indirs[i].in_off, nb, 0, nbp);
433                 bap[indirs[i].in_off] = nb;
434                 /*
435                  * If required, write synchronously, otherwise use
436                  * delayed write.
437                  */
438                 if (flags & IO_SYNC) {
439                         bwrite(bp);
440                 } else {
441                         if (bp->b_bufsize == fs->fs_bsize)
442                                 bp->b_flags |= B_CLUSTEROK;
443                         bdwrite(bp);
444                 }
445                 curthread_pflags_restore(saved_inbdflush);
446                 *bpp = nbp;
447                 return (0);
448         }
449         brelse(bp);
450         if (flags & BA_CLRBUF) {
451                 int seqcount = (flags & BA_SEQMASK) >> BA_SEQSHIFT;
452                 if (seqcount != 0 &&
453                     (vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0 &&
454                     !(vm_page_count_severe() || buf_dirty_count_severe())) {
455                         error = cluster_read(vp, ip->i_size, lbn,
456                             (int)fs->fs_bsize, NOCRED,
457                             MAXBSIZE, seqcount, gbflags, &nbp);
458                 } else {
459                         error = bread_gb(vp, lbn, (int)fs->fs_bsize, NOCRED,
460                             gbflags, &nbp);
461                 }
462                 if (error) {
463                         brelse(nbp);
464                         goto fail;
465                 }
466         } else {
467                 nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, gbflags);
468                 nbp->b_blkno = fsbtodb(fs, nb);
469         }
470         curthread_pflags_restore(saved_inbdflush);
471         *bpp = nbp;
472         return (0);
473 fail:
474         curthread_pflags_restore(saved_inbdflush);
475         /*
476          * If we have failed to allocate any blocks, simply return the error.
477          * This is the usual case and avoids the need to fsync the file.
478          */
479         if (allocblk == allociblk && allocib == NULL && unwindidx == -1)
480                 return (error);
481         /*
482          * If we have failed part way through block allocation, we
483          * have to deallocate any indirect blocks that we have allocated.
484          * We have to fsync the file before we start to get rid of all
485          * of its dependencies so that we do not leave them dangling.
486          * We have to sync it at the end so that the soft updates code
487          * does not find any untracked changes. Although this is really
488          * slow, running out of disk space is not expected to be a common
489          * occurrence. The error return from fsync is ignored as we already
490          * have an error to return to the user.
491          *
492          * XXX Still have to journal the free below
493          */
494         (void) ffs_syncvnode(vp, MNT_WAIT, 0);
495         for (deallocated = 0, blkp = allociblk, lbns_remfree = lbns;
496              blkp < allocblk; blkp++, lbns_remfree++) {
497                 /*
498                  * We shall not leave the freed blocks on the vnode
499                  * buffer object lists.
500                  */
501                 bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
502                     GB_NOCREAT | GB_UNMAPPED);
503                 if (bp != NULL) {
504                         KASSERT(bp->b_blkno == fsbtodb(fs, *blkp),
505                             ("mismatch1 l %jd %jd b %ju %ju",
506                             (intmax_t)bp->b_lblkno, (uintmax_t)*lbns_remfree,
507                             (uintmax_t)bp->b_blkno,
508                             (uintmax_t)fsbtodb(fs, *blkp)));
509                         bp->b_flags |= B_INVAL | B_RELBUF | B_NOCACHE;
510                         bp->b_flags &= ~(B_ASYNC | B_CACHE);
511                         brelse(bp);
512                 }
513                 deallocated += fs->fs_bsize;
514         }
515         if (allocib != NULL) {
516                 *allocib = 0;
517         } else if (unwindidx >= 0) {
518                 int r;
519
520                 r = bread(vp, indirs[unwindidx].in_lbn, 
521                     (int)fs->fs_bsize, NOCRED, &bp);
522                 if (r) {
523                         panic("Could not unwind indirect block, error %d", r);
524                         brelse(bp);
525                 } else {
526                         bap = (ufs1_daddr_t *)bp->b_data;
527                         bap[indirs[unwindidx].in_off] = 0;
528                         if (flags & IO_SYNC) {
529                                 bwrite(bp);
530                         } else {
531                                 if (bp->b_bufsize == fs->fs_bsize)
532                                         bp->b_flags |= B_CLUSTEROK;
533                                 bdwrite(bp);
534                         }
535                 }
536         }
537         if (deallocated) {
538 #ifdef QUOTA
539                 /*
540                  * Restore user's disk quota because allocation failed.
541                  */
542                 (void) chkdq(ip, -btodb(deallocated), cred, FORCE);
543 #endif
544                 dp->di_blocks -= btodb(deallocated);
545                 ip->i_flag |= IN_CHANGE | IN_UPDATE;
546         }
547         (void) ffs_syncvnode(vp, MNT_WAIT, 0);
548         /*
549          * After the buffers are invalidated and on-disk pointers are
550          * cleared, free the blocks.
551          */
552         for (blkp = allociblk; blkp < allocblk; blkp++) {
553 #ifdef INVARIANTS
554                 if (blkp == allociblk)
555                         lbns_remfree = lbns;
556                 bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
557                     GB_NOCREAT | GB_UNMAPPED);
558                 if (bp != NULL) {
559                         panic("zombie1 %jd %ju %ju",
560                             (intmax_t)bp->b_lblkno, (uintmax_t)bp->b_blkno,
561                             (uintmax_t)fsbtodb(fs, *blkp));
562                 }
563                 lbns_remfree++;
564 #endif
565                 ffs_blkfree(ump, fs, ump->um_devvp, *blkp, fs->fs_bsize,
566                     ip->i_number, vp->v_type, NULL, SINGLETON_KEY);
567         }
568         return (error);
569 }
570
571 /*
572  * Balloc defines the structure of file system storage
573  * by allocating the physical blocks on a device given
574  * the inode and the logical block number in a file.
575  * This is the allocation strategy for UFS2. Above is
576  * the allocation strategy for UFS1.
577  */
578 int
579 ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, int size,
580     struct ucred *cred, int flags, struct buf **bpp)
581 {
582         struct inode *ip;
583         struct ufs2_dinode *dp;
584         ufs_lbn_t lbn, lastlbn;
585         struct fs *fs;
586         struct buf *bp, *nbp;
587         struct mount *mp;
588         struct ufsmount *ump;
589         struct indir indirs[UFS_NIADDR + 2];
590         ufs2_daddr_t nb, newb, *bap, pref;
591         ufs2_daddr_t *allocib, *blkp, *allocblk, allociblk[UFS_NIADDR + 1];
592         ufs2_daddr_t *lbns_remfree, lbns[UFS_NIADDR + 1];
593         int deallocated, osize, nsize, num, i, error;
594         int unwindidx = -1;
595         int saved_inbdflush;
596         int gbflags, reclaimed;
597
598         ip = VTOI(vp);
599         dp = ip->i_din2;
600         fs = ITOFS(ip);
601         mp = ITOVFS(ip);
602         ump = ITOUMP(ip);
603         lbn = lblkno(fs, startoffset);
604         size = blkoff(fs, startoffset) + size;
605         reclaimed = 0;
606         if (size > fs->fs_bsize)
607                 panic("ffs_balloc_ufs2: blk too big");
608         *bpp = NULL;
609         if (lbn < 0)
610                 return (EFBIG);
611         gbflags = (flags & BA_UNMAPPED) != 0 ? GB_UNMAPPED : 0;
612
613         if (DOINGSOFTDEP(vp))
614                 softdep_prealloc(vp, MNT_WAIT);
615         
616         /*
617          * Check for allocating external data.
618          */
619         if (flags & IO_EXT) {
620                 if (lbn >= UFS_NXADDR)
621                         return (EFBIG);
622                 /*
623                  * If the next write will extend the data into a new block,
624                  * and the data is currently composed of a fragment
625                  * this fragment has to be extended to be a full block.
626                  */
627                 lastlbn = lblkno(fs, dp->di_extsize);
628                 if (lastlbn < lbn) {
629                         nb = lastlbn;
630                         osize = sblksize(fs, dp->di_extsize, nb);
631                         if (osize < fs->fs_bsize && osize > 0) {
632                                 UFS_LOCK(ump);
633                                 error = ffs_realloccg(ip, -1 - nb,
634                                     dp->di_extb[nb],
635                                     ffs_blkpref_ufs2(ip, lastlbn, (int)nb,
636                                     &dp->di_extb[0]), osize,
637                                     (int)fs->fs_bsize, flags, cred, &bp);
638                                 if (error)
639                                         return (error);
640                                 if (DOINGSOFTDEP(vp))
641                                         softdep_setup_allocext(ip, nb,
642                                             dbtofsb(fs, bp->b_blkno),
643                                             dp->di_extb[nb],
644                                             fs->fs_bsize, osize, bp);
645                                 dp->di_extsize = smalllblktosize(fs, nb + 1);
646                                 dp->di_extb[nb] = dbtofsb(fs, bp->b_blkno);
647                                 bp->b_xflags |= BX_ALTDATA;
648                                 ip->i_flag |= IN_CHANGE;
649                                 if (flags & IO_SYNC)
650                                         bwrite(bp);
651                                 else
652                                         bawrite(bp);
653                         }
654                 }
655                 /*
656                  * All blocks are direct blocks
657                  */
658                 if (flags & BA_METAONLY)
659                         panic("ffs_balloc_ufs2: BA_METAONLY for ext block");
660                 nb = dp->di_extb[lbn];
661                 if (nb != 0 && dp->di_extsize >= smalllblktosize(fs, lbn + 1)) {
662                         error = bread_gb(vp, -1 - lbn, fs->fs_bsize, NOCRED,
663                             gbflags, &bp);
664                         if (error) {
665                                 return (error);
666                         }
667                         bp->b_blkno = fsbtodb(fs, nb);
668                         bp->b_xflags |= BX_ALTDATA;
669                         *bpp = bp;
670                         return (0);
671                 }
672                 if (nb != 0) {
673                         /*
674                          * Consider need to reallocate a fragment.
675                          */
676                         osize = fragroundup(fs, blkoff(fs, dp->di_extsize));
677                         nsize = fragroundup(fs, size);
678                         if (nsize <= osize) {
679                                 error = bread_gb(vp, -1 - lbn, osize, NOCRED,
680                                     gbflags, &bp);
681                                 if (error) {
682                                         return (error);
683                                 }
684                                 bp->b_blkno = fsbtodb(fs, nb);
685                                 bp->b_xflags |= BX_ALTDATA;
686                         } else {
687                                 UFS_LOCK(ump);
688                                 error = ffs_realloccg(ip, -1 - lbn,
689                                     dp->di_extb[lbn],
690                                     ffs_blkpref_ufs2(ip, lbn, (int)lbn,
691                                     &dp->di_extb[0]), osize, nsize, flags,
692                                     cred, &bp);
693                                 if (error)
694                                         return (error);
695                                 bp->b_xflags |= BX_ALTDATA;
696                                 if (DOINGSOFTDEP(vp))
697                                         softdep_setup_allocext(ip, lbn,
698                                             dbtofsb(fs, bp->b_blkno), nb,
699                                             nsize, osize, bp);
700                         }
701                 } else {
702                         if (dp->di_extsize < smalllblktosize(fs, lbn + 1))
703                                 nsize = fragroundup(fs, size);
704                         else
705                                 nsize = fs->fs_bsize;
706                         UFS_LOCK(ump);
707                         error = ffs_alloc(ip, lbn,
708                            ffs_blkpref_ufs2(ip, lbn, (int)lbn, &dp->di_extb[0]),
709                            nsize, flags, cred, &newb);
710                         if (error)
711                                 return (error);
712                         bp = getblk(vp, -1 - lbn, nsize, 0, 0, gbflags);
713                         bp->b_blkno = fsbtodb(fs, newb);
714                         bp->b_xflags |= BX_ALTDATA;
715                         if (flags & BA_CLRBUF)
716                                 vfs_bio_clrbuf(bp);
717                         if (DOINGSOFTDEP(vp))
718                                 softdep_setup_allocext(ip, lbn, newb, 0,
719                                     nsize, 0, bp);
720                 }
721                 dp->di_extb[lbn] = dbtofsb(fs, bp->b_blkno);
722                 ip->i_flag |= IN_CHANGE;
723                 *bpp = bp;
724                 return (0);
725         }
726         /*
727          * If the next write will extend the file into a new block,
728          * and the file is currently composed of a fragment
729          * this fragment has to be extended to be a full block.
730          */
731         lastlbn = lblkno(fs, ip->i_size);
732         if (lastlbn < UFS_NDADDR && lastlbn < lbn) {
733                 nb = lastlbn;
734                 osize = blksize(fs, ip, nb);
735                 if (osize < fs->fs_bsize && osize > 0) {
736                         UFS_LOCK(ump);
737                         error = ffs_realloccg(ip, nb, dp->di_db[nb],
738                             ffs_blkpref_ufs2(ip, lastlbn, (int)nb,
739                             &dp->di_db[0]), osize, (int)fs->fs_bsize,
740                             flags, cred, &bp);
741                         if (error)
742                                 return (error);
743                         if (DOINGSOFTDEP(vp))
744                                 softdep_setup_allocdirect(ip, nb,
745                                     dbtofsb(fs, bp->b_blkno),
746                                     dp->di_db[nb],
747                                     fs->fs_bsize, osize, bp);
748                         ip->i_size = smalllblktosize(fs, nb + 1);
749                         dp->di_size = ip->i_size;
750                         dp->di_db[nb] = dbtofsb(fs, bp->b_blkno);
751                         ip->i_flag |= IN_CHANGE | IN_UPDATE;
752                         if (flags & IO_SYNC)
753                                 bwrite(bp);
754                         else
755                                 bawrite(bp);
756                 }
757         }
758         /*
759          * The first UFS_NDADDR blocks are direct blocks
760          */
761         if (lbn < UFS_NDADDR) {
762                 if (flags & BA_METAONLY)
763                         panic("ffs_balloc_ufs2: BA_METAONLY for direct block");
764                 nb = dp->di_db[lbn];
765                 if (nb != 0 && ip->i_size >= smalllblktosize(fs, lbn + 1)) {
766                         error = bread_gb(vp, lbn, fs->fs_bsize, NOCRED,
767                             gbflags, &bp);
768                         if (error) {
769                                 return (error);
770                         }
771                         bp->b_blkno = fsbtodb(fs, nb);
772                         *bpp = bp;
773                         return (0);
774                 }
775                 if (nb != 0) {
776                         /*
777                          * Consider need to reallocate a fragment.
778                          */
779                         osize = fragroundup(fs, blkoff(fs, ip->i_size));
780                         nsize = fragroundup(fs, size);
781                         if (nsize <= osize) {
782                                 error = bread_gb(vp, lbn, osize, NOCRED,
783                                     gbflags, &bp);
784                                 if (error) {
785                                         return (error);
786                                 }
787                                 bp->b_blkno = fsbtodb(fs, nb);
788                         } else {
789                                 UFS_LOCK(ump);
790                                 error = ffs_realloccg(ip, lbn, dp->di_db[lbn],
791                                     ffs_blkpref_ufs2(ip, lbn, (int)lbn,
792                                     &dp->di_db[0]), osize, nsize, flags,
793                                     cred, &bp);
794                                 if (error)
795                                         return (error);
796                                 if (DOINGSOFTDEP(vp))
797                                         softdep_setup_allocdirect(ip, lbn,
798                                             dbtofsb(fs, bp->b_blkno), nb,
799                                             nsize, osize, bp);
800                         }
801                 } else {
802                         if (ip->i_size < smalllblktosize(fs, lbn + 1))
803                                 nsize = fragroundup(fs, size);
804                         else
805                                 nsize = fs->fs_bsize;
806                         UFS_LOCK(ump);
807                         error = ffs_alloc(ip, lbn,
808                             ffs_blkpref_ufs2(ip, lbn, (int)lbn,
809                                 &dp->di_db[0]), nsize, flags, cred, &newb);
810                         if (error)
811                                 return (error);
812                         bp = getblk(vp, lbn, nsize, 0, 0, gbflags);
813                         bp->b_blkno = fsbtodb(fs, newb);
814                         if (flags & BA_CLRBUF)
815                                 vfs_bio_clrbuf(bp);
816                         if (DOINGSOFTDEP(vp))
817                                 softdep_setup_allocdirect(ip, lbn, newb, 0,
818                                     nsize, 0, bp);
819                 }
820                 dp->di_db[lbn] = dbtofsb(fs, bp->b_blkno);
821                 ip->i_flag |= IN_CHANGE | IN_UPDATE;
822                 *bpp = bp;
823                 return (0);
824         }
825         /*
826          * Determine the number of levels of indirection.
827          */
828         pref = 0;
829         if ((error = ufs_getlbns(vp, lbn, indirs, &num)) != 0)
830                 return(error);
831 #ifdef INVARIANTS
832         if (num < 1)
833                 panic ("ffs_balloc_ufs2: ufs_getlbns returned indirect block");
834 #endif
835         saved_inbdflush = curthread_pflags_set(TDP_INBDFLUSH);
836         /*
837          * Fetch the first indirect block allocating if necessary.
838          */
839         --num;
840         nb = dp->di_ib[indirs[0].in_off];
841         allocib = NULL;
842         allocblk = allociblk;
843         lbns_remfree = lbns;
844         if (nb == 0) {
845                 UFS_LOCK(ump);
846                 pref = ffs_blkpref_ufs2(ip, lbn, -indirs[0].in_off - 1,
847                     (ufs2_daddr_t *)0);
848                 if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
849                     flags, cred, &newb)) != 0) {
850                         curthread_pflags_restore(saved_inbdflush);
851                         return (error);
852                 }
853                 pref = newb + fs->fs_frag;
854                 nb = newb;
855                 MPASS(allocblk < allociblk + nitems(allociblk));
856                 MPASS(lbns_remfree < lbns + nitems(lbns));
857                 *allocblk++ = nb;
858                 *lbns_remfree++ = indirs[1].in_lbn;
859                 bp = getblk(vp, indirs[1].in_lbn, fs->fs_bsize, 0, 0,
860                     GB_UNMAPPED);
861                 bp->b_blkno = fsbtodb(fs, nb);
862                 vfs_bio_clrbuf(bp);
863                 if (DOINGSOFTDEP(vp)) {
864                         softdep_setup_allocdirect(ip,
865                             UFS_NDADDR + indirs[0].in_off, newb, 0,
866                             fs->fs_bsize, 0, bp);
867                         bdwrite(bp);
868                 } else if ((flags & IO_SYNC) == 0 && DOINGASYNC(vp)) {
869                         if (bp->b_bufsize == fs->fs_bsize)
870                                 bp->b_flags |= B_CLUSTEROK;
871                         bdwrite(bp);
872                 } else {
873                         if ((error = bwrite(bp)) != 0)
874                                 goto fail;
875                 }
876                 allocib = &dp->di_ib[indirs[0].in_off];
877                 *allocib = nb;
878                 ip->i_flag |= IN_CHANGE | IN_UPDATE;
879         }
880         /*
881          * Fetch through the indirect blocks, allocating as necessary.
882          */
883 retry:
884         for (i = 1;;) {
885                 error = bread(vp,
886                     indirs[i].in_lbn, (int)fs->fs_bsize, NOCRED, &bp);
887                 if (error) {
888                         goto fail;
889                 }
890                 bap = (ufs2_daddr_t *)bp->b_data;
891                 nb = bap[indirs[i].in_off];
892                 if ((error = UFS_CHECK_BLKNO(mp, ip->i_number, nb,
893                     fs->fs_bsize)) != 0) {
894                         brelse(bp);
895                         goto fail;
896                 }
897                 if (i == num)
898                         break;
899                 i += 1;
900                 if (nb != 0) {
901                         bqrelse(bp);
902                         continue;
903                 }
904                 UFS_LOCK(ump);
905                 /*
906                  * If parent indirect has just been allocated, try to cluster
907                  * immediately following it.
908                  */
909                 if (pref == 0)
910                         pref = ffs_blkpref_ufs2(ip, lbn, i - num - 1,
911                             (ufs2_daddr_t *)0);
912                 if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
913                     flags | IO_BUFLOCKED, cred, &newb)) != 0) {
914                         brelse(bp);
915                         UFS_LOCK(ump);
916                         if (DOINGSOFTDEP(vp) && ++reclaimed == 1) {
917                                 softdep_request_cleanup(fs, vp, cred,
918                                     FLUSH_BLOCKS_WAIT);
919                                 UFS_UNLOCK(ump);
920                                 goto retry;
921                         }
922                         if (ppsratecheck(&ump->um_last_fullmsg,
923                             &ump->um_secs_fullmsg, 1)) {
924                                 UFS_UNLOCK(ump);
925                                 ffs_fserr(fs, ip->i_number, "filesystem full");
926                                 uprintf("\n%s: write failed, filesystem "
927                                     "is full\n", fs->fs_fsmnt);
928                         } else {
929                                 UFS_UNLOCK(ump);
930                         }
931                         goto fail;
932                 }
933                 pref = newb + fs->fs_frag;
934                 nb = newb;
935                 MPASS(allocblk < allociblk + nitems(allociblk));
936                 MPASS(lbns_remfree < lbns + nitems(lbns));
937                 *allocblk++ = nb;
938                 *lbns_remfree++ = indirs[i].in_lbn;
939                 nbp = getblk(vp, indirs[i].in_lbn, fs->fs_bsize, 0, 0,
940                     GB_UNMAPPED);
941                 nbp->b_blkno = fsbtodb(fs, nb);
942                 vfs_bio_clrbuf(nbp);
943                 if (DOINGSOFTDEP(vp)) {
944                         softdep_setup_allocindir_meta(nbp, ip, bp,
945                             indirs[i - 1].in_off, nb);
946                         bdwrite(nbp);
947                 } else if ((flags & IO_SYNC) == 0 && DOINGASYNC(vp)) {
948                         if (nbp->b_bufsize == fs->fs_bsize)
949                                 nbp->b_flags |= B_CLUSTEROK;
950                         bdwrite(nbp);
951                 } else {
952                         if ((error = bwrite(nbp)) != 0) {
953                                 brelse(bp);
954                                 goto fail;
955                         }
956                 }
957                 bap[indirs[i - 1].in_off] = nb;
958                 if (allocib == NULL && unwindidx < 0)
959                         unwindidx = i - 1;
960                 /*
961                  * If required, write synchronously, otherwise use
962                  * delayed write.
963                  */
964                 if (flags & IO_SYNC) {
965                         bwrite(bp);
966                 } else {
967                         if (bp->b_bufsize == fs->fs_bsize)
968                                 bp->b_flags |= B_CLUSTEROK;
969                         bdwrite(bp);
970                 }
971         }
972         /*
973          * If asked only for the indirect block, then return it.
974          */
975         if (flags & BA_METAONLY) {
976                 curthread_pflags_restore(saved_inbdflush);
977                 *bpp = bp;
978                 return (0);
979         }
980         /*
981          * Get the data block, allocating if necessary.
982          */
983         if (nb == 0) {
984                 UFS_LOCK(ump);
985                 /*
986                  * If allocating metadata at the front of the cylinder
987                  * group and parent indirect block has just been allocated,
988                  * then cluster next to it if it is the first indirect in
989                  * the file. Otherwise it has been allocated in the metadata
990                  * area, so we want to find our own place out in the data area.
991                  */
992                 if (pref == 0 || (lbn > UFS_NDADDR && fs->fs_metaspace != 0))
993                         pref = ffs_blkpref_ufs2(ip, lbn, indirs[i].in_off,
994                             &bap[0]);
995                 error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
996                     flags | IO_BUFLOCKED, cred, &newb);
997                 if (error) {
998                         brelse(bp);
999                         UFS_LOCK(ump);
1000                         if (DOINGSOFTDEP(vp) && ++reclaimed == 1) {
1001                                 softdep_request_cleanup(fs, vp, cred,
1002                                     FLUSH_BLOCKS_WAIT);
1003                                 UFS_UNLOCK(ump);
1004                                 goto retry;
1005                         }
1006                         if (ppsratecheck(&ump->um_last_fullmsg,
1007                             &ump->um_secs_fullmsg, 1)) {
1008                                 UFS_UNLOCK(ump);
1009                                 ffs_fserr(fs, ip->i_number, "filesystem full");
1010                                 uprintf("\n%s: write failed, filesystem "
1011                                     "is full\n", fs->fs_fsmnt);
1012                         } else {
1013                                 UFS_UNLOCK(ump);
1014                         }
1015                         goto fail;
1016                 }
1017                 nb = newb;
1018                 MPASS(allocblk < allociblk + nitems(allociblk));
1019                 MPASS(lbns_remfree < lbns + nitems(lbns));
1020                 *allocblk++ = nb;
1021                 *lbns_remfree++ = lbn;
1022                 nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, gbflags);
1023                 nbp->b_blkno = fsbtodb(fs, nb);
1024                 if (flags & BA_CLRBUF)
1025                         vfs_bio_clrbuf(nbp);
1026                 if (DOINGSOFTDEP(vp))
1027                         softdep_setup_allocindir_page(ip, lbn, bp,
1028                             indirs[i].in_off, nb, 0, nbp);
1029                 bap[indirs[i].in_off] = nb;
1030                 /*
1031                  * If required, write synchronously, otherwise use
1032                  * delayed write.
1033                  */
1034                 if (flags & IO_SYNC) {
1035                         bwrite(bp);
1036                 } else {
1037                         if (bp->b_bufsize == fs->fs_bsize)
1038                                 bp->b_flags |= B_CLUSTEROK;
1039                         bdwrite(bp);
1040                 }
1041                 curthread_pflags_restore(saved_inbdflush);
1042                 *bpp = nbp;
1043                 return (0);
1044         }
1045         brelse(bp);
1046         /*
1047          * If requested clear invalid portions of the buffer.  If we
1048          * have to do a read-before-write (typical if BA_CLRBUF is set),
1049          * try to do some read-ahead in the sequential case to reduce
1050          * the number of I/O transactions.
1051          */
1052         if (flags & BA_CLRBUF) {
1053                 int seqcount = (flags & BA_SEQMASK) >> BA_SEQSHIFT;
1054                 if (seqcount != 0 &&
1055                     (vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0 &&
1056                     !(vm_page_count_severe() || buf_dirty_count_severe())) {
1057                         error = cluster_read(vp, ip->i_size, lbn,
1058                             (int)fs->fs_bsize, NOCRED,
1059                             MAXBSIZE, seqcount, gbflags, &nbp);
1060                 } else {
1061                         error = bread_gb(vp, lbn, (int)fs->fs_bsize,
1062                             NOCRED, gbflags, &nbp);
1063                 }
1064                 if (error) {
1065                         brelse(nbp);
1066                         goto fail;
1067                 }
1068         } else {
1069                 nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, gbflags);
1070                 nbp->b_blkno = fsbtodb(fs, nb);
1071         }
1072         curthread_pflags_restore(saved_inbdflush);
1073         *bpp = nbp;
1074         return (0);
1075 fail:
1076         curthread_pflags_restore(saved_inbdflush);
1077         /*
1078          * If we have failed to allocate any blocks, simply return the error.
1079          * This is the usual case and avoids the need to fsync the file.
1080          */
1081         if (allocblk == allociblk && allocib == NULL && unwindidx == -1)
1082                 return (error);
1083         /*
1084          * If we have failed part way through block allocation, we
1085          * have to deallocate any indirect blocks that we have allocated.
1086          * We have to fsync the file before we start to get rid of all
1087          * of its dependencies so that we do not leave them dangling.
1088          * We have to sync it at the end so that the soft updates code
1089          * does not find any untracked changes. Although this is really
1090          * slow, running out of disk space is not expected to be a common
1091          * occurrence. The error return from fsync is ignored as we already
1092          * have an error to return to the user.
1093          *
1094          * XXX Still have to journal the free below
1095          */
1096         (void) ffs_syncvnode(vp, MNT_WAIT, 0);
1097         for (deallocated = 0, blkp = allociblk, lbns_remfree = lbns;
1098              blkp < allocblk; blkp++, lbns_remfree++) {
1099                 /*
1100                  * We shall not leave the freed blocks on the vnode
1101                  * buffer object lists.
1102                  */
1103                 bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
1104                     GB_NOCREAT | GB_UNMAPPED);
1105                 if (bp != NULL) {
1106                         KASSERT(bp->b_blkno == fsbtodb(fs, *blkp),
1107                             ("mismatch2 l %jd %jd b %ju %ju",
1108                             (intmax_t)bp->b_lblkno, (uintmax_t)*lbns_remfree,
1109                             (uintmax_t)bp->b_blkno,
1110                             (uintmax_t)fsbtodb(fs, *blkp)));
1111                         bp->b_flags |= B_INVAL | B_RELBUF | B_NOCACHE;
1112                         bp->b_flags &= ~(B_ASYNC | B_CACHE);
1113                         brelse(bp);
1114                 }
1115                 deallocated += fs->fs_bsize;
1116         }
1117         if (allocib != NULL) {
1118                 *allocib = 0;
1119         } else if (unwindidx >= 0) {
1120                 int r;
1121
1122                 r = bread(vp, indirs[unwindidx].in_lbn, 
1123                     (int)fs->fs_bsize, NOCRED, &bp);
1124                 if (r) {
1125                         panic("Could not unwind indirect block, error %d", r);
1126                         brelse(bp);
1127                 } else {
1128                         bap = (ufs2_daddr_t *)bp->b_data;
1129                         bap[indirs[unwindidx].in_off] = 0;
1130                         if (flags & IO_SYNC) {
1131                                 bwrite(bp);
1132                         } else {
1133                                 if (bp->b_bufsize == fs->fs_bsize)
1134                                         bp->b_flags |= B_CLUSTEROK;
1135                                 bdwrite(bp);
1136                         }
1137                 }
1138         }
1139         if (deallocated) {
1140 #ifdef QUOTA
1141                 /*
1142                  * Restore user's disk quota because allocation failed.
1143                  */
1144                 (void) chkdq(ip, -btodb(deallocated), cred, FORCE);
1145 #endif
1146                 dp->di_blocks -= btodb(deallocated);
1147                 ip->i_flag |= IN_CHANGE | IN_UPDATE;
1148         }
1149         (void) ffs_syncvnode(vp, MNT_WAIT, 0);
1150         /*
1151          * After the buffers are invalidated and on-disk pointers are
1152          * cleared, free the blocks.
1153          */
1154         for (blkp = allociblk; blkp < allocblk; blkp++) {
1155 #ifdef INVARIANTS
1156                 if (blkp == allociblk)
1157                         lbns_remfree = lbns;
1158                 bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
1159                     GB_NOCREAT | GB_UNMAPPED);
1160                 if (bp != NULL) {
1161                         panic("zombie2 %jd %ju %ju",
1162                             (intmax_t)bp->b_lblkno, (uintmax_t)bp->b_blkno,
1163                             (uintmax_t)fsbtodb(fs, *blkp));
1164                 }
1165                 lbns_remfree++;
1166 #endif
1167                 ffs_blkfree(ump, fs, ump->um_devvp, *blkp, fs->fs_bsize,
1168                     ip->i_number, vp->v_type, NULL, SINGLETON_KEY);
1169         }
1170         return (error);
1171 }