Lines Matching +full:jd +full:- +full:src
1 /*-
2 * SPDX-License-Identifier: (BSD-2-Clause AND BSD-3-Clause)
10 * contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS
169 fs = ump->um_fs; in ffs_alloc()
172 if ((uint64_t)size > fs->fs_bsize || fragoff(fs, size) != 0) { in ffs_alloc()
174 devtoname(ump->um_dev), (long)fs->fs_bsize, size, in ffs_alloc()
175 fs->fs_fsmnt); in ffs_alloc()
190 if (size == fs->fs_bsize && fs->fs_cstotal.cs_nbfree == 0) in ffs_alloc()
193 freespace(fs, fs->fs_minfree) - numfrags(fs, size) < 0) in ffs_alloc()
195 if (bpref >= fs->fs_size) in ffs_alloc()
198 cg = ino_to_cg(fs, ip->i_number); in ffs_alloc()
218 (void) chkdq(ip, -btodb(size), cred, FORCE); in ffs_alloc()
231 ppsratecheck(&ump->um_last_fullmsg, &ump->um_secs_fullmsg, 1)) { in ffs_alloc()
233 ffs_fserr(fs, ip->i_number, "filesystem full"); in ffs_alloc()
235 fs->fs_fsmnt); in ffs_alloc()
272 fs = ump->um_fs; in ffs_realloccg()
281 if (vp->v_mount->mnt_kern_flag & MNTK_SUSPENDED) in ffs_realloccg()
283 if ((uint64_t)osize > fs->fs_bsize || fragoff(fs, osize) != 0 || in ffs_realloccg()
284 (uint64_t)nsize > fs->fs_bsize || fragoff(fs, nsize) != 0) { in ffs_realloccg()
287 devtoname(ump->um_dev), (long)fs->fs_bsize, osize, in ffs_realloccg()
288 nsize, fs->fs_fsmnt); in ffs_realloccg()
297 freespace(fs, fs->fs_minfree) - numfrags(fs, nsize - osize) < 0) { in ffs_realloccg()
301 printf("dev = %s, bsize = %ld, bprev = %jd, fs = %s\n", in ffs_realloccg()
302 devtoname(ump->um_dev), (long)fs->fs_bsize, (intmax_t)bprev, in ffs_realloccg()
303 fs->fs_fsmnt); in ffs_realloccg()
315 if (bp->b_blkno == bp->b_lblkno) { in ffs_realloccg()
318 bp->b_blkno = fsbtodb(fs, bprev); in ffs_realloccg()
322 error = chkdq(ip, btodb(nsize - osize), cred, 0); in ffs_realloccg()
336 if (bp->b_blkno != fsbtodb(fs, bno)) in ffs_realloccg()
338 delta = btodb(nsize - osize); in ffs_realloccg()
345 bp->b_flags |= B_DONE; in ffs_realloccg()
346 vfs_bio_bzero_buf(bp, osize, nsize - osize); in ffs_realloccg()
347 if ((bp->b_flags & (B_MALLOC | B_VMIO)) == B_VMIO) in ffs_realloccg()
348 vfs_bio_set_valid(bp, osize, nsize - osize); in ffs_realloccg()
355 if (bpref >= fs->fs_size) in ffs_realloccg()
357 switch ((int)fs->fs_optim) { in ffs_realloccg()
367 if (fs->fs_minfree <= 5 || in ffs_realloccg()
368 fs->fs_cstotal.cs_nffree > in ffs_realloccg()
369 (off_t)fs->fs_dsize * fs->fs_minfree / (2 * 100)) in ffs_realloccg()
372 fs->fs_fsmnt); in ffs_realloccg()
373 fs->fs_optim = FS_OPTTIME; in ffs_realloccg()
386 request = fs->fs_bsize; in ffs_realloccg()
387 if (fs->fs_cstotal.cs_nffree < in ffs_realloccg()
388 (off_t)fs->fs_dsize * (fs->fs_minfree - 2) / 100) in ffs_realloccg()
391 fs->fs_fsmnt); in ffs_realloccg()
392 fs->fs_optim = FS_OPTSPACE; in ffs_realloccg()
396 devtoname(ump->um_dev), (long)fs->fs_optim, fs->fs_fsmnt); in ffs_realloccg()
402 bp->b_blkno = fsbtodb(fs, bno); in ffs_realloccg()
407 * fragment or a full-size block. If it is marked as in ffs_realloccg()
418 ffs_blkfree(ump, fs, ump->um_devvp, bprev, (long)osize, in ffs_realloccg()
419 ip->i_number, vp->v_type, NULL, in ffs_realloccg()
420 (bp->b_flags & B_DELWRI) != 0 ? in ffs_realloccg()
422 delta = btodb(nsize - osize); in ffs_realloccg()
429 bp->b_flags |= B_DONE; in ffs_realloccg()
430 vfs_bio_bzero_buf(bp, osize, nsize - osize); in ffs_realloccg()
431 if ((bp->b_flags & (B_MALLOC | B_VMIO)) == B_VMIO) in ffs_realloccg()
432 vfs_bio_set_valid(bp, osize, nsize - osize); in ffs_realloccg()
441 (void) chkdq(ip, -btodb(nsize - osize), cred, FORCE); in ffs_realloccg()
466 ppsratecheck(&ump->um_last_fullmsg, &ump->um_secs_fullmsg, 1)) { in ffs_realloccg()
468 ffs_fserr(fs, ip->i_number, "filesystem full"); in ffs_realloccg()
470 fs->fs_fsmnt); in ffs_realloccg()
541 ump = ap->a_vp->v_mount->mnt_data; in ffs_reallocblks()
542 if ((((ump->um_flags) & UM_CANDELETE) != 0 && dotrimcons == 0) || in ffs_reallocblks()
551 if (DOINGSUJ(ap->a_vp)) in ffs_reallocblks()
552 if (softdep_prealloc(ap->a_vp, MNT_NOWAIT) != 0) in ffs_reallocblks()
554 vn_seqc_write_begin(ap->a_vp); in ffs_reallocblks()
555 error = ump->um_fstype == UFS1 ? ffs_reallocblks_ufs1(ap) : in ffs_reallocblks()
557 vn_seqc_write_end(ap->a_vp); in ffs_reallocblks()
581 vp = ap->a_vp; in ffs_reallocblks_ufs1()
584 fs = ump->um_fs; in ffs_reallocblks_ufs1()
591 if (fs->fs_contigsumsize <= 0 || freespace(fs, 4) < 0) in ffs_reallocblks_ufs1()
593 buflist = ap->a_buflist; in ffs_reallocblks_ufs1()
594 len = buflist->bs_nchildren; in ffs_reallocblks_ufs1()
595 start_lbn = buflist->bs_children[0]->b_lblkno; in ffs_reallocblks_ufs1()
596 end_lbn = start_lbn + len - 1; in ffs_reallocblks_ufs1()
600 dbtofsb(fs, buflist->bs_children[i]->b_blkno), fs->fs_bsize)) in ffs_reallocblks_ufs1()
603 if (buflist->bs_children[i]->b_lblkno != start_lbn + i) in ffs_reallocblks_ufs1()
604 panic("ffs_reallocblks: non-logical cluster"); in ffs_reallocblks_ufs1()
605 blkno = buflist->bs_children[0]->b_blkno; in ffs_reallocblks_ufs1()
606 ssize = fsbtodb(fs, fs->fs_frag); in ffs_reallocblks_ufs1()
607 for (i = 1; i < len - 1; i++) in ffs_reallocblks_ufs1()
608 if (buflist->bs_children[i]->b_blkno != blkno + (i * ssize)) in ffs_reallocblks_ufs1()
609 panic("ffs_reallocblks: non-physical cluster %d", i); in ffs_reallocblks_ufs1()
628 if (dtog(fs, dbtofsb(fs, buflist->bs_children[0]->b_blkno)) != in ffs_reallocblks_ufs1()
629 dtog(fs, dbtofsb(fs, buflist->bs_children[len - 1]->b_blkno))) in ffs_reallocblks_ufs1()
638 sbap = &ip->i_din1->di_db[0]; in ffs_reallocblks_ufs1()
641 idp = &start_ap[start_lvl - 1]; in ffs_reallocblks_ufs1()
642 if (bread(vp, idp->in_lbn, (int)fs->fs_bsize, NOCRED, &sbp)) { in ffs_reallocblks_ufs1()
646 sbap = (ufs1_daddr_t *)sbp->b_data; in ffs_reallocblks_ufs1()
647 soff = idp->in_off; in ffs_reallocblks_ufs1()
653 if (end_lvl == 0 || (idp = &end_ap[end_lvl - 1])->in_off + 1 >= len) { in ffs_reallocblks_ufs1()
658 start_ap[start_lvl - 1].in_lbn == idp->in_lbn) in ffs_reallocblks_ufs1()
661 ssize = len - (idp->in_off + 1); in ffs_reallocblks_ufs1()
662 if (bread(vp, idp->in_lbn, (int)fs->fs_bsize, NOCRED, &ebp)) in ffs_reallocblks_ufs1()
664 ebap = (ufs1_daddr_t *)ebp->b_data; in ffs_reallocblks_ufs1()
673 if (ip->i_nextclustercg == -1) in ffs_reallocblks_ufs1()
676 pref = cgdata(fs, ip->i_nextclustercg); in ffs_reallocblks_ufs1()
683 MPASS(cg < fs->fs_ncg); in ffs_reallocblks_ufs1()
684 for (i = min(maxclustersearch, fs->fs_ncg); i > 0; i--) { in ffs_reallocblks_ufs1()
688 if (cg >= fs->fs_ncg) in ffs_reallocblks_ufs1()
696 ip->i_nextclustercg = cg; in ffs_reallocblks_ufs1()
700 ip->i_nextclustercg = -1; in ffs_reallocblks_ufs1()
710 printf("realloc: ino %ju, lbns %jd-%jd\n\told:", in ffs_reallocblks_ufs1()
711 (uintmax_t)ip->i_number, in ffs_reallocblks_ufs1()
715 for (bap = &sbap[soff], i = 0; i < len; i++, blkno += fs->fs_frag) { in ffs_reallocblks_ufs1()
718 soff = -i; in ffs_reallocblks_ufs1()
722 dbtofsb(fs, buflist->bs_children[i]->b_blkno), fs->fs_bsize)) in ffs_reallocblks_ufs1()
724 if (dbtofsb(fs, buflist->bs_children[i]->b_blkno) != *bap) in ffs_reallocblks_ufs1()
732 if (sbap == &ip->i_din1->di_db[0] && i < ssize) in ffs_reallocblks_ufs1()
734 blkno, *bap, fs->fs_bsize, fs->fs_bsize, in ffs_reallocblks_ufs1()
735 buflist->bs_children[i]); in ffs_reallocblks_ufs1()
739 *bap, buflist->bs_children[i]); in ffs_reallocblks_ufs1()
757 if (sbap != &ip->i_din1->di_db[0]) { in ffs_reallocblks_ufs1()
780 for (blkno = newblk, i = 0; i < len; i++, blkno += fs->fs_frag) { in ffs_reallocblks_ufs1()
781 bp = buflist->bs_children[i]; in ffs_reallocblks_ufs1()
784 * The usual case is that a set of N-contiguous blocks in ffs_reallocblks_ufs1()
786 * set of N+1-contiguous blocks. If they are marked as in ffs_reallocblks_ufs1()
797 ffs_blkfree(ump, fs, ump->um_devvp, in ffs_reallocblks_ufs1()
798 dbtofsb(fs, bp->b_blkno), in ffs_reallocblks_ufs1()
799 fs->fs_bsize, ip->i_number, vp->v_type, NULL, in ffs_reallocblks_ufs1()
800 (bp->b_flags & B_DELWRI) != 0 ? in ffs_reallocblks_ufs1()
802 bp->b_blkno = fsbtodb(fs, blkno); in ffs_reallocblks_ufs1()
804 if (!ffs_checkfreeblk(ip, dbtofsb(fs, bp->b_blkno), in ffs_reallocblks_ufs1()
805 fs->fs_bsize)) in ffs_reallocblks_ufs1()
815 prtrealloc--; in ffs_reallocblks_ufs1()
824 if (sbap != &ip->i_din1->di_db[0]) in ffs_reallocblks_ufs1()
848 vp = ap->a_vp; in ffs_reallocblks_ufs2()
851 fs = ump->um_fs; in ffs_reallocblks_ufs2()
858 if (fs->fs_contigsumsize <= 0 || freespace(fs, 4) < 0) in ffs_reallocblks_ufs2()
860 buflist = ap->a_buflist; in ffs_reallocblks_ufs2()
861 len = buflist->bs_nchildren; in ffs_reallocblks_ufs2()
862 start_lbn = buflist->bs_children[0]->b_lblkno; in ffs_reallocblks_ufs2()
863 end_lbn = start_lbn + len - 1; in ffs_reallocblks_ufs2()
867 dbtofsb(fs, buflist->bs_children[i]->b_blkno), fs->fs_bsize)) in ffs_reallocblks_ufs2()
870 if (buflist->bs_children[i]->b_lblkno != start_lbn + i) in ffs_reallocblks_ufs2()
871 panic("ffs_reallocblks: non-logical cluster"); in ffs_reallocblks_ufs2()
872 blkno = buflist->bs_children[0]->b_blkno; in ffs_reallocblks_ufs2()
873 ssize = fsbtodb(fs, fs->fs_frag); in ffs_reallocblks_ufs2()
874 for (i = 1; i < len - 1; i++) in ffs_reallocblks_ufs2()
875 if (buflist->bs_children[i]->b_blkno != blkno + (i * ssize)) in ffs_reallocblks_ufs2()
876 panic("ffs_reallocblks: non-physical cluster %d", i); in ffs_reallocblks_ufs2()
895 if (dtog(fs, dbtofsb(fs, buflist->bs_children[0]->b_blkno)) != in ffs_reallocblks_ufs2()
896 dtog(fs, dbtofsb(fs, buflist->bs_children[len - 1]->b_blkno))) in ffs_reallocblks_ufs2()
905 sbap = &ip->i_din2->di_db[0]; in ffs_reallocblks_ufs2()
908 idp = &start_ap[start_lvl - 1]; in ffs_reallocblks_ufs2()
909 if (bread(vp, idp->in_lbn, (int)fs->fs_bsize, NOCRED, &sbp)) { in ffs_reallocblks_ufs2()
913 sbap = (ufs2_daddr_t *)sbp->b_data; in ffs_reallocblks_ufs2()
914 soff = idp->in_off; in ffs_reallocblks_ufs2()
920 if (end_lvl == 0 || (idp = &end_ap[end_lvl - 1])->in_off + 1 >= len) { in ffs_reallocblks_ufs2()
925 start_ap[start_lvl - 1].in_lbn == idp->in_lbn) in ffs_reallocblks_ufs2()
928 ssize = len - (idp->in_off + 1); in ffs_reallocblks_ufs2()
929 if (bread(vp, idp->in_lbn, (int)fs->fs_bsize, NOCRED, &ebp)) in ffs_reallocblks_ufs2()
931 ebap = (ufs2_daddr_t *)ebp->b_data; in ffs_reallocblks_ufs2()
940 if (ip->i_nextclustercg == -1) in ffs_reallocblks_ufs2()
943 pref = cgdata(fs, ip->i_nextclustercg); in ffs_reallocblks_ufs2()
950 MPASS(cg < fs->fs_ncg); in ffs_reallocblks_ufs2()
951 for (i = min(maxclustersearch, fs->fs_ncg); i > 0; i--) { in ffs_reallocblks_ufs2()
955 if (cg >= fs->fs_ncg) in ffs_reallocblks_ufs2()
963 ip->i_nextclustercg = cg; in ffs_reallocblks_ufs2()
967 ip->i_nextclustercg = -1; in ffs_reallocblks_ufs2()
977 printf("realloc: ino %ju, lbns %jd-%jd\n\told:", (uintmax_t)ip->i_number, in ffs_reallocblks_ufs2()
981 for (bap = &sbap[soff], i = 0; i < len; i++, blkno += fs->fs_frag) { in ffs_reallocblks_ufs2()
984 soff = -i; in ffs_reallocblks_ufs2()
988 dbtofsb(fs, buflist->bs_children[i]->b_blkno), fs->fs_bsize)) in ffs_reallocblks_ufs2()
990 if (dbtofsb(fs, buflist->bs_children[i]->b_blkno) != *bap) in ffs_reallocblks_ufs2()
995 printf(" %jd,", (intmax_t)*bap); in ffs_reallocblks_ufs2()
998 if (sbap == &ip->i_din2->di_db[0] && i < ssize) in ffs_reallocblks_ufs2()
1000 blkno, *bap, fs->fs_bsize, fs->fs_bsize, in ffs_reallocblks_ufs2()
1001 buflist->bs_children[i]); in ffs_reallocblks_ufs2()
1005 *bap, buflist->bs_children[i]); in ffs_reallocblks_ufs2()
1023 if (sbap != &ip->i_din2->di_db[0]) { in ffs_reallocblks_ufs2()
1046 for (blkno = newblk, i = 0; i < len; i++, blkno += fs->fs_frag) { in ffs_reallocblks_ufs2()
1047 bp = buflist->bs_children[i]; in ffs_reallocblks_ufs2()
1050 * The usual case is that a set of N-contiguous blocks in ffs_reallocblks_ufs2()
1052 * set of N+1-contiguous blocks. If they are marked as in ffs_reallocblks_ufs2()
1063 ffs_blkfree(ump, fs, ump->um_devvp, in ffs_reallocblks_ufs2()
1064 dbtofsb(fs, bp->b_blkno), in ffs_reallocblks_ufs2()
1065 fs->fs_bsize, ip->i_number, vp->v_type, NULL, in ffs_reallocblks_ufs2()
1066 (bp->b_flags & B_DELWRI) != 0 ? in ffs_reallocblks_ufs2()
1068 bp->b_blkno = fsbtodb(fs, blkno); in ffs_reallocblks_ufs2()
1070 if (!ffs_checkfreeblk(ip, dbtofsb(fs, bp->b_blkno), in ffs_reallocblks_ufs2()
1071 fs->fs_bsize)) in ffs_reallocblks_ufs2()
1076 printf(" %jd,", (intmax_t)blkno); in ffs_reallocblks_ufs2()
1081 prtrealloc--; in ffs_reallocblks_ufs2()
1090 if (sbap != &ip->i_din2->di_db[0]) in ffs_reallocblks_ufs2()
1128 fs = ump->um_fs; in ffs_valloc()
1133 if (fs->fs_cstotal.cs_nifree == 0) in ffs_valloc()
1139 ipref = pip->i_number; in ffs_valloc()
1140 if (ipref >= fs->fs_ncg * fs->fs_ipg) in ffs_valloc()
1148 if (fs->fs_contigdirs[cg] < 255) in ffs_valloc()
1149 fs->fs_contigdirs[cg]++; in ffs_valloc()
1151 if (fs->fs_contigdirs[cg] > 0) in ffs_valloc()
1152 fs->fs_contigdirs[cg]--; in ffs_valloc()
1163 if ((error = ffs_vgetf(pvp->v_mount, ino, LK_EXCLUSIVE, vpp, in ffs_valloc()
1172 if (ip->i_mode) { in ffs_valloc()
1174 ip->i_mode, (uintmax_t)ip->i_number, fs->fs_fsmnt); in ffs_valloc()
1177 if (DIP(ip, i_blocks) && (fs->fs_flags & FS_UNCLEAN) == 0) { /* XXX */ in ffs_valloc()
1179 fs->fs_fsmnt, (intmax_t)ino, (long)DIP(ip, i_blocks)); in ffs_valloc()
1182 ip->i_flags = 0; in ffs_valloc()
1189 while (ip->i_gen == 0 || ++ip->i_gen == 0) in ffs_valloc()
1190 ip->i_gen = arc4random(); in ffs_valloc()
1191 DIP_SET(ip, i_gen, ip->i_gen); in ffs_valloc()
1192 if (fs->fs_magic == FS_UFS2_MAGIC) { in ffs_valloc()
1194 ip->i_din2->di_birthtime = ts.tv_sec; in ffs_valloc()
1195 ip->i_din2->di_birthnsec = ts.tv_nsec; in ffs_valloc()
1197 ip->i_flag = 0; in ffs_valloc()
1198 (*vpp)->v_vflag = 0; in ffs_valloc()
1199 (*vpp)->v_type = VNON; in ffs_valloc()
1200 if (fs->fs_magic == FS_UFS2_MAGIC) { in ffs_valloc()
1201 (*vpp)->v_op = &ffs_vnodeops2; in ffs_valloc()
1204 (*vpp)->v_op = &ffs_vnodeops1; in ffs_valloc()
1217 if (ppsratecheck(&ump->um_last_fullmsg, &ump->um_secs_fullmsg, 1)) { in ffs_valloc()
1219 ffs_fserr(fs, pip->i_number, "out of inodes"); in ffs_valloc()
1221 fs->fs_fsmnt); in ffs_valloc()
1254 avgifree = fs->fs_cstotal.cs_nifree / fs->fs_ncg; in ffs_dirpref()
1255 avgbfree = fs->fs_cstotal.cs_nbfree / fs->fs_ncg; in ffs_dirpref()
1256 avgndir = fs->fs_cstotal.cs_ndir / fs->fs_ncg; in ffs_dirpref()
1263 * we expect them to be more closely interactive. Higher-level in ffs_dirpref()
1264 * directories like usr/src/sys and usr/src/bin should be in ffs_dirpref()
1277 range = fs->fs_ncg / (1 << depth); in ffs_dirpref()
1278 curcg = ino_to_cg(fs, pip->i_number); in ffs_dirpref()
1279 start = curcg - (range / 2); in ffs_dirpref()
1281 start += fs->fs_ncg; in ffs_dirpref()
1283 if (end >= fs->fs_ncg) in ffs_dirpref()
1284 end -= fs->fs_ncg; in ffs_dirpref()
1285 numdirs = pip->i_effnlink - 1; in ffs_dirpref()
1287 numerator = (numdirs & ~(1 << (power - 1))) * 2 + 1; in ffs_dirpref()
1289 prefcg = (curcg - (range / 2) + (range * numerator / denominator)); in ffs_dirpref()
1291 prefcg += fs->fs_ncg; in ffs_dirpref()
1292 if (prefcg >= fs->fs_ncg) in ffs_dirpref()
1293 prefcg -= fs->fs_ncg; in ffs_dirpref()
1298 if (depth == 0 && pip->i_number != UFS_ROOTINO) in ffs_dirpref()
1305 maxndir = min(avgndir + (1 << depth), fs->fs_ipg); in ffs_dirpref()
1306 minifree = avgifree - avgifree / 4; in ffs_dirpref()
1309 minbfree = avgbfree - avgbfree / 4; in ffs_dirpref()
1312 cgsize = fs->fs_fsize * fs->fs_fpg; in ffs_dirpref()
1313 dirsize = fs->fs_avgfilesize * fs->fs_avgfpdir; in ffs_dirpref()
1314 curdirsize = avgndir ? (cgsize - avgbfree * fs->fs_bsize) / avgndir : 0; in ffs_dirpref()
1320 maxcontigdirs = min((avgbfree * fs->fs_bsize) / dirsize, 255); in ffs_dirpref()
1321 if (fs->fs_avgfpdir > 0) in ffs_dirpref()
1323 fs->fs_ipg / fs->fs_avgfpdir); in ffs_dirpref()
1349 for (cg = prefcg; cg < fs->fs_ncg; cg++) in ffs_dirpref()
1350 if (fs->fs_cs(fs, cg).cs_ndir < maxndir && in ffs_dirpref()
1351 fs->fs_cs(fs, cg).cs_nifree >= minifree && in ffs_dirpref()
1352 fs->fs_cs(fs, cg).cs_nbfree >= minbfree) { in ffs_dirpref()
1353 if (fs->fs_contigdirs[cg] < maxcontigdirs) in ffs_dirpref()
1354 return ((ino_t)(fs->fs_ipg * cg)); in ffs_dirpref()
1357 if (fs->fs_cs(fs, cg).cs_ndir < maxndir && in ffs_dirpref()
1358 fs->fs_cs(fs, cg).cs_nifree >= minifree && in ffs_dirpref()
1359 fs->fs_cs(fs, cg).cs_nbfree >= minbfree) { in ffs_dirpref()
1360 if (fs->fs_contigdirs[cg] < maxcontigdirs) in ffs_dirpref()
1361 return ((ino_t)(fs->fs_ipg * cg)); in ffs_dirpref()
1366 for (cg = prefcg; cg < fs->fs_ncg; cg++) in ffs_dirpref()
1367 if (fs->fs_cs(fs, cg).cs_nifree >= avgifree) in ffs_dirpref()
1368 return ((ino_t)(fs->fs_ipg * cg)); in ffs_dirpref()
1370 if (fs->fs_cs(fs, cg).cs_nifree >= avgifree) in ffs_dirpref()
1372 return ((ino_t)(fs->fs_ipg * cg)); in ffs_dirpref()
1415 KASSERT(indx <= 0 || bap != NULL, ("need non-NULL bap")); in ffs_blkpref_ufs1()
1420 * values in indx: -1 for single indirect, -2 for double indirect, in ffs_blkpref_ufs1()
1421 * -3 for triple indirect. As noted below, we attempt to allocate in ffs_blkpref_ufs1()
1429 inocg = ino_to_cg(fs, ip->i_number); in ffs_blkpref_ufs1()
1441 if (indx == -1 && lbn < UFS_NDADDR + NINDIR(fs) && in ffs_blkpref_ufs1()
1442 ip->i_din1->di_db[UFS_NDADDR - 1] != 0) { in ffs_blkpref_ufs1()
1443 pref = ip->i_din1->di_db[UFS_NDADDR - 1] + fs->fs_frag; in ffs_blkpref_ufs1()
1444 if (dtog(fs, pref) >= fs->fs_ncg) in ffs_blkpref_ufs1()
1455 pref = ip->i_din1->di_ib[0]; in ffs_blkpref_ufs1()
1458 if (dtog(fs, pref + fs->fs_frag) >= fs->fs_ncg) in ffs_blkpref_ufs1()
1460 return (pref + fs->fs_frag); in ffs_blkpref_ufs1()
1472 prevbn = bap[indx - 1]; in ffs_blkpref_ufs1()
1473 if (UFS_CHECK_BLKNO(ITOVFS(ip), ip->i_number, prevbn, in ffs_blkpref_ufs1()
1474 fs->fs_bsize) != 0) in ffs_blkpref_ufs1()
1477 if (indx % fs->fs_maxbpg == 0 || prevbn == 0) { in ffs_blkpref_ufs1()
1482 if ((ip->i_mode & IFMT) == IFDIR) in ffs_blkpref_ufs1()
1496 startcg = inocg + lbn / fs->fs_maxbpg; in ffs_blkpref_ufs1()
1499 startcg %= fs->fs_ncg; in ffs_blkpref_ufs1()
1500 avgbfree = fs->fs_cstotal.cs_nbfree / fs->fs_ncg; in ffs_blkpref_ufs1()
1501 for (cg = startcg; cg < fs->fs_ncg; cg++) in ffs_blkpref_ufs1()
1502 if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { in ffs_blkpref_ufs1()
1503 fs->fs_cgrotor = cg; in ffs_blkpref_ufs1()
1507 if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { in ffs_blkpref_ufs1()
1508 fs->fs_cgrotor = cg; in ffs_blkpref_ufs1()
1516 if (dtog(fs, prevbn + fs->fs_frag) >= fs->fs_ncg) in ffs_blkpref_ufs1()
1518 return (prevbn + fs->fs_frag); in ffs_blkpref_ufs1()
1535 KASSERT(indx <= 0 || bap != NULL, ("need non-NULL bap")); in ffs_blkpref_ufs2()
1540 * values in indx: -1 for single indirect, -2 for double indirect, in ffs_blkpref_ufs2()
1541 * -3 for triple indirect. As noted below, we attempt to allocate in ffs_blkpref_ufs2()
1549 inocg = ino_to_cg(fs, ip->i_number); in ffs_blkpref_ufs2()
1561 if (indx == -1 && lbn < UFS_NDADDR + NINDIR(fs) && in ffs_blkpref_ufs2()
1562 ip->i_din2->di_db[UFS_NDADDR - 1] != 0) { in ffs_blkpref_ufs2()
1563 pref = ip->i_din2->di_db[UFS_NDADDR - 1] + fs->fs_frag; in ffs_blkpref_ufs2()
1564 if (dtog(fs, pref) >= fs->fs_ncg) in ffs_blkpref_ufs2()
1575 pref = ip->i_din2->di_ib[0]; in ffs_blkpref_ufs2()
1578 if (dtog(fs, pref + fs->fs_frag) >= fs->fs_ncg) in ffs_blkpref_ufs2()
1580 return (pref + fs->fs_frag); in ffs_blkpref_ufs2()
1592 prevbn = bap[indx - 1]; in ffs_blkpref_ufs2()
1593 if (UFS_CHECK_BLKNO(ITOVFS(ip), ip->i_number, prevbn, in ffs_blkpref_ufs2()
1594 fs->fs_bsize) != 0) in ffs_blkpref_ufs2()
1597 if (indx % fs->fs_maxbpg == 0 || prevbn == 0) { in ffs_blkpref_ufs2()
1602 if ((ip->i_mode & IFMT) == IFDIR) in ffs_blkpref_ufs2()
1616 startcg = inocg + lbn / fs->fs_maxbpg; in ffs_blkpref_ufs2()
1619 startcg %= fs->fs_ncg; in ffs_blkpref_ufs2()
1620 avgbfree = fs->fs_cstotal.cs_nbfree / fs->fs_ncg; in ffs_blkpref_ufs2()
1621 for (cg = startcg; cg < fs->fs_ncg; cg++) in ffs_blkpref_ufs2()
1622 if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { in ffs_blkpref_ufs2()
1623 fs->fs_cgrotor = cg; in ffs_blkpref_ufs2()
1627 if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { in ffs_blkpref_ufs2()
1628 fs->fs_cgrotor = cg; in ffs_blkpref_ufs2()
1636 if (dtog(fs, prevbn + fs->fs_frag) >= fs->fs_ncg) in ffs_blkpref_ufs2()
1638 return (prevbn + fs->fs_frag); in ffs_blkpref_ufs2()
1667 if (ITOV(ip)->v_mount->mnt_kern_flag & MNTK_SUSPENDED) in ffs_hashalloc()
1680 for (i = 1; i < fs->fs_ncg; i *= 2) { in ffs_hashalloc()
1682 if (cg >= fs->fs_ncg) in ffs_hashalloc()
1683 cg -= fs->fs_ncg; in ffs_hashalloc()
1693 cg = (icg + 2) % fs->fs_ncg; in ffs_hashalloc()
1694 for (i = 2; i < fs->fs_ncg; i++) { in ffs_hashalloc()
1699 if (cg == fs->fs_ncg) in ffs_hashalloc()
1729 fs = ump->um_fs; in ffs_fragextend()
1730 if (fs->fs_cs(fs, cg).cs_nffree < numfrags(fs, nsize - osize)) in ffs_fragextend()
1734 if (bbase > fragnum(fs, (bprev + frags - 1))) { in ffs_fragextend()
1739 if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0) { in ffs_fragextend()
1754 for (i = frags; i < fs->fs_frag - bbase; i++) in ffs_fragextend()
1757 cgp->cg_frsum[i - numfrags(fs, osize)]--; in ffs_fragextend()
1759 cgp->cg_frsum[i - frags]++; in ffs_fragextend()
1762 cgp->cg_cs.cs_nffree--; in ffs_fragextend()
1766 fs->fs_cstotal.cs_nffree -= nffree; in ffs_fragextend()
1767 fs->fs_cs(fs, cg).cs_nffree -= nffree; in ffs_fragextend()
1768 fs->fs_fmod = 1; in ffs_fragextend()
1807 fs = ump->um_fs; in ffs_alloccg()
1808 if (fs->fs_cs(fs, cg).cs_nbfree == 0 && size == fs->fs_bsize) in ffs_alloccg()
1811 if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0 || in ffs_alloccg()
1812 (cgp->cg_cs.cs_nbfree == 0 && size == fs->fs_bsize)) { in ffs_alloccg()
1816 if (size == fs->fs_bsize) { in ffs_alloccg()
1831 for (allocsiz = frags; allocsiz < fs->fs_frag; allocsiz++) in ffs_alloccg()
1832 if (cgp->cg_frsum[allocsiz] != 0) in ffs_alloccg()
1834 if (allocsiz == fs->fs_frag) { in ffs_alloccg()
1839 if (cgp->cg_cs.cs_nbfree == 0) in ffs_alloccg()
1855 cgp->cg_cs.cs_nffree -= frags; in ffs_alloccg()
1856 cgp->cg_frsum[allocsiz]--; in ffs_alloccg()
1858 cgp->cg_frsum[allocsiz - frags]++; in ffs_alloccg()
1860 fs->fs_cstotal.cs_nffree -= frags; in ffs_alloccg()
1861 fs->fs_cs(fs, cg).cs_nffree -= frags; in ffs_alloccg()
1862 fs->fs_fmod = 1; in ffs_alloccg()
1903 fs = ump->um_fs; in ffs_alloccgblk()
1905 cgp = (struct cg *)bp->b_data; in ffs_alloccgblk()
1908 bpref = cgbase(fs, cgp->cg_cgx) + cgp->cg_rotor + fs->fs_frag; in ffs_alloccgblk()
1909 } else if ((cgbpref = dtog(fs, bpref)) != cgp->cg_cgx) { in ffs_alloccgblk()
1912 bpref = cgmeta(fs, cgp->cg_cgx); in ffs_alloccgblk()
1914 bpref = cgdata(fs, cgp->cg_cgx); in ffs_alloccgblk()
1925 bno = ffs_mapsearch(fs, cgp, bpref, (int)fs->fs_frag); in ffs_alloccgblk()
1929 if (bno >= dtogd(fs, cgdata(fs, cgp->cg_cgx))) in ffs_alloccgblk()
1930 cgp->cg_rotor = bno; in ffs_alloccgblk()
1934 ffs_clusteracct(fs, cgp, blkno, -1); in ffs_alloccgblk()
1935 cgp->cg_cs.cs_nbfree--; in ffs_alloccgblk()
1936 fs->fs_cstotal.cs_nbfree--; in ffs_alloccgblk()
1937 fs->fs_cs(fs, cgp->cg_cgx).cs_nbfree--; in ffs_alloccgblk()
1938 fs->fs_fmod = 1; in ffs_alloccgblk()
1939 blkno = cgbase(fs, cgp->cg_cgx) + bno; in ffs_alloccgblk()
1944 if (size != fs->fs_frag) { in ffs_alloccgblk()
1946 for (i = size; i < fs->fs_frag; i++) in ffs_alloccgblk()
1948 i = fs->fs_frag - size; in ffs_alloccgblk()
1949 cgp->cg_cs.cs_nffree += i; in ffs_alloccgblk()
1950 fs->fs_cstotal.cs_nffree += i; in ffs_alloccgblk()
1951 fs->fs_cs(fs, cgp->cg_cgx).cs_nffree += i; in ffs_alloccgblk()
1952 fs->fs_fmod = 1; in ffs_alloccgblk()
1953 cgp->cg_frsum[i]++; in ffs_alloccgblk()
1987 fs = ump->um_fs; in ffs_clusteralloc()
1988 MPASS(cg < fs->fs_ncg); in ffs_clusteralloc()
1989 if (fs->fs_maxcluster[cg] < len) in ffs_clusteralloc()
1992 if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0) { in ffs_clusteralloc()
2002 for (i = len; i <= fs->fs_contigsumsize; i++) in ffs_clusteralloc()
2005 if (i > fs->fs_contigsumsize) { in ffs_clusteralloc()
2013 lp = &cg_clustersum(cgp)[len - 1]; in ffs_clusteralloc()
2014 for (i = len - 1; i > 0; i--) in ffs_clusteralloc()
2015 if (*lp-- > 0) in ffs_clusteralloc()
2018 fs->fs_maxcluster[cg] = i; in ffs_clusteralloc()
2041 for (run = 0, got = bpref; got < cgp->cg_nclusterblks; got++) { in ffs_clusteralloc()
2049 if ((got & (NBBY - 1)) != (NBBY - 1)) { in ffs_clusteralloc()
2056 if (got >= cgp->cg_nclusterblks) { in ffs_clusteralloc()
2066 if (!ffs_isblock(fs, blksfree, got - run + i)) in ffs_clusteralloc()
2068 bno = cgbase(fs, cg) + blkstofrags(fs, got - run + 1); in ffs_clusteralloc()
2073 for (i = 0; i < len; i += fs->fs_frag) in ffs_clusteralloc()
2074 if (ffs_alloccgblk(ip, bp, bno + i, fs->fs_bsize) != bno + i) in ffs_clusteralloc()
2092 cg * fs->fs_ipg + cginoblk)), (int)fs->fs_bsize, 0, 0, in getinobuf()
2132 fs = ump->um_fs; in ffs_nodealloccg()
2134 if (fs->fs_cs(fs, cg).cs_nifree == 0) in ffs_nodealloccg()
2137 if ((error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp)) != 0) { in ffs_nodealloccg()
2143 if (cgp->cg_cs.cs_nifree == 0) { in ffs_nodealloccg()
2150 ipref %= fs->fs_ipg; in ffs_nodealloccg()
2154 start = cgp->cg_irotor / NBBY; in ffs_nodealloccg()
2155 len = howmany(fs->fs_ipg - cgp->cg_irotor, NBBY); in ffs_nodealloccg()
2163 (intmax_t)cg, (long)cgp->cg_irotor, fs->fs_fsmnt); in ffs_nodealloccg()
2168 ipref = (loc - inosused) * NBBY + ffs(~*loc) - 1; in ffs_nodealloccg()
2173 if (fs->fs_magic == FS_UFS2_MAGIC && in ffs_nodealloccg()
2174 ipref + INOPB(fs) > cgp->cg_initediblk && in ffs_nodealloccg()
2175 cgp->cg_initediblk < cgp->cg_niblk) { in ffs_nodealloccg()
2176 old_initediblk = cgp->cg_initediblk; in ffs_nodealloccg()
2207 bzero(ibp->b_data, (int)fs->fs_bsize); in ffs_nodealloccg()
2208 dp2 = (struct ufs2_dinode *)(ibp->b_data); in ffs_nodealloccg()
2210 while (dp2->di_gen == 0) in ffs_nodealloccg()
2211 dp2->di_gen = arc4random(); in ffs_nodealloccg()
2235 error = ffs_getcg(fs, ump->um_devvp, cg, 0, &bp, &cgp); in ffs_nodealloccg()
2241 if (cgp->cg_initediblk == old_initediblk) in ffs_nodealloccg()
2242 cgp->cg_initediblk += INOPB(fs); in ffs_nodealloccg()
2245 cgp->cg_irotor = ipref; in ffs_nodealloccg()
2249 cgp->cg_cs.cs_nifree--; in ffs_nodealloccg()
2250 fs->fs_cstotal.cs_nifree--; in ffs_nodealloccg()
2251 fs->fs_cs(fs, cg).cs_nifree--; in ffs_nodealloccg()
2252 fs->fs_fmod = 1; in ffs_nodealloccg()
2254 cgp->cg_cs.cs_ndir++; in ffs_nodealloccg()
2255 fs->fs_cstotal.cs_ndir++; in ffs_nodealloccg()
2256 fs->fs_cs(fs, cg).cs_ndir++; in ffs_nodealloccg()
2260 softdep_setup_inomapdep(bp, ip, cg * fs->fs_ipg + ipref, mode); in ffs_nodealloccg()
2262 return ((ino_t)(cg * fs->fs_ipg + ipref)); in ffs_nodealloccg()
2292 if (devvp->v_type == VREG) { in ffs_blkfree_cg()
2294 MPASS(devvp->v_mount->mnt_data == ump); in ffs_blkfree_cg()
2295 dev = ump->um_devvp->v_rdev; in ffs_blkfree_cg()
2296 } else if (devvp->v_type == VCHR) { in ffs_blkfree_cg()
2302 dev = devvp->v_rdev; in ffs_blkfree_cg()
2306 if ((uint64_t)size > fs->fs_bsize || fragoff(fs, size) != 0 || in ffs_blkfree_cg()
2307 fragnum(fs, bno) + numfrags(fs, size) > fs->fs_frag) { in ffs_blkfree_cg()
2308 printf("dev=%s, bno = %jd, bsize = %ld, size = %ld, fs = %s\n", in ffs_blkfree_cg()
2309 devtoname(dev), (intmax_t)bno, (long)fs->fs_bsize, in ffs_blkfree_cg()
2310 size, fs->fs_fsmnt); in ffs_blkfree_cg()
2314 if ((uint64_t)bno >= fs->fs_size) { in ffs_blkfree_cg()
2315 printf("bad block %jd, ino %ju\n", (intmax_t)bno, in ffs_blkfree_cg()
2321 if (!MOUNTEDSOFTDEP(UFSTOVFS(ump)) || devvp->v_type != VCHR) in ffs_blkfree_cg()
2324 * Would like to just downgrade to read-only. Until that in ffs_blkfree_cg()
2328 fs->fs_flags |= FS_NEEDSFSCK; in ffs_blkfree_cg()
2329 if (devvp->v_type == VREG) in ffs_blkfree_cg()
2333 error = getblkx(devvp, dbn, dbn, fs->fs_cgsize, 0, 0, 0, &bp); in ffs_blkfree_cg()
2337 bp->b_flags |= B_RELBUF | B_NOCACHE; in ffs_blkfree_cg()
2338 bp->b_flags &= ~B_CACHE; in ffs_blkfree_cg()
2345 if (size == fs->fs_bsize) { in ffs_blkfree_cg()
2348 if (devvp->v_type == VREG) { in ffs_blkfree_cg()
2354 printf("dev = %s, block = %jd, fs = %s\n", in ffs_blkfree_cg()
2355 devtoname(dev), (intmax_t)bno, fs->fs_fsmnt); in ffs_blkfree_cg()
2360 cgp->cg_cs.cs_nbfree++; in ffs_blkfree_cg()
2361 fs->fs_cstotal.cs_nbfree++; in ffs_blkfree_cg()
2362 fs->fs_cs(fs, cg).cs_nbfree++; in ffs_blkfree_cg()
2364 bbase = cgbno - fragnum(fs, cgbno); in ffs_blkfree_cg()
2369 ffs_fragacct(fs, blk, cgp->cg_frsum, -1); in ffs_blkfree_cg()
2376 printf("dev = %s, block = %jd, fs = %s\n", in ffs_blkfree_cg()
2378 fs->fs_fsmnt); in ffs_blkfree_cg()
2383 cgp->cg_cs.cs_nffree += i; in ffs_blkfree_cg()
2384 fs->fs_cstotal.cs_nffree += i; in ffs_blkfree_cg()
2385 fs->fs_cs(fs, cg).cs_nffree += i; in ffs_blkfree_cg()
2390 ffs_fragacct(fs, blk, cgp->cg_frsum, 1); in ffs_blkfree_cg()
2396 cgp->cg_cs.cs_nffree -= fs->fs_frag; in ffs_blkfree_cg()
2397 fs->fs_cstotal.cs_nffree -= fs->fs_frag; in ffs_blkfree_cg()
2398 fs->fs_cs(fs, cg).cs_nffree -= fs->fs_frag; in ffs_blkfree_cg()
2400 cgp->cg_cs.cs_nbfree++; in ffs_blkfree_cg()
2401 fs->fs_cstotal.cs_nbfree++; in ffs_blkfree_cg()
2402 fs->fs_cs(fs, cg).cs_nbfree++; in ffs_blkfree_cg()
2405 fs->fs_fmod = 1; in ffs_blkfree_cg()
2409 if (MOUNTEDSOFTDEP(mp) && devvp->v_type == VCHR) in ffs_blkfree_cg()
2430 (&(ump)->um_trimhash[(key) & (ump)->um_trimlisthashsize])
2473 tp = bp->b_fsprivate1; in ffs_blkfree_trim_completed()
2475 TASK_INIT(&tp->task, 0, ffs_blkfree_trim_task, tp); in ffs_blkfree_trim_completed()
2476 taskqueue_enqueue(tp->ump->um_trim_tq, &tp->task); in ffs_blkfree_trim_completed()
2490 ump = tp->ump; in ffs_blkfree_trim_task()
2491 while ((blkelm = TAILQ_FIRST(&tp->blklist)) != NULL) { in ffs_blkfree_trim_task()
2492 ffs_blkfree_cg(ump, ump->um_fs, tp->devvp, blkelm->bno, in ffs_blkfree_trim_task()
2493 blkelm->size, tp->inum, blkelm->pdephd); in ffs_blkfree_trim_task()
2494 TAILQ_REMOVE(&tp->blklist, blkelm, blkreqlist); in ffs_blkfree_trim_task()
2499 ump->um_trim_inflight -= 1; in ffs_blkfree_trim_task()
2500 ump->um_trim_inflight_blks -= numfrags(ump->um_fs, tp->size); in ffs_blkfree_trim_task()
2527 if (key == tp->key) in trim_lookup()
2552 TAILQ_INIT(&ntp->blklist); in trim_lookup()
2553 ntp->ump = ump; in trim_lookup()
2554 ntp->devvp = devvp; in trim_lookup()
2555 ntp->bno = bno; in trim_lookup()
2556 ntp->size = size; in trim_lookup()
2557 ntp->inum = inum; in trim_lookup()
2558 ntp->key = key; in trim_lookup()
2582 ump = tp->ump; in ffs_blkfree_sendtrim()
2584 bp->b_iocmd = BIO_DELETE; in ffs_blkfree_sendtrim()
2585 bp->b_iooffset = dbtob(fsbtodb(ump->um_fs, tp->bno)); in ffs_blkfree_sendtrim()
2586 bp->b_iodone = ffs_blkfree_trim_completed; in ffs_blkfree_sendtrim()
2587 bp->b_bcount = tp->size; in ffs_blkfree_sendtrim()
2588 bp->b_fsprivate1 = tp; in ffs_blkfree_sendtrim()
2590 ump->um_trim_total += 1; in ffs_blkfree_sendtrim()
2591 ump->um_trim_inflight += 1; in ffs_blkfree_sendtrim()
2592 ump->um_trim_inflight_blks += numfrags(ump->um_fs, tp->size); in ffs_blkfree_sendtrim()
2593 ump->um_trim_total_blks += numfrags(ump->um_fs, tp->size); in ffs_blkfree_sendtrim()
2598 g_vfs_strategy(ump->um_bo, bp); in ffs_blkfree_sendtrim()
2612 if (((ump->um_flags & UM_CANDELETE) == 0) || dotrimcons == 0) in ffs_blkrelease_start()
2629 if (((ump->um_flags & UM_CANDELETE) == 0) || dotrimcons == 0) in ffs_blkrelease_finish()
2644 ump->um_mountp->mnt_stat.f_mntonname); in ffs_blkrelease_finish()
2652 * tp->size will be zero, so we can just free tp. Otherwise the call in ffs_blkrelease_finish()
2657 if (tp->size == 0) in ffs_blkrelease_finish()
2690 if (devvp->v_type == VCHR && in ffs_blkfree()
2691 (devvp->v_vflag & VV_COPYONWRITE) && in ffs_blkfree()
2699 if (key == NOTRIM_KEY || ((ump->um_flags & UM_CANDELETE) == 0) || in ffs_blkfree()
2700 devvp->v_type == VREG) { in ffs_blkfree()
2705 blkelm->bno = bno; in ffs_blkfree()
2706 blkelm->size = size; in ffs_blkfree()
2708 blkelm->pdephd = NULL; in ffs_blkfree()
2710 LIST_INIT(&blkelm->dephd); in ffs_blkfree()
2711 LIST_SWAP(dephd, &blkelm->dephd, worklist, wk_list); in ffs_blkfree()
2712 blkelm->pdephd = &blkelm->dephd; in ffs_blkfree()
2716 * Just a single non-contiguous piece. Use the SINGLE in ffs_blkfree()
2721 TAILQ_INSERT_HEAD(&tp->blklist, blkelm, blkreqlist); in ffs_blkfree()
2735 if (tp->size == 0) { in ffs_blkfree()
2740 tp->bno = bno; in ffs_blkfree()
2741 tp->size = size; in ffs_blkfree()
2742 TAILQ_INSERT_HEAD(&tp->blklist, blkelm, blkreqlist); in ffs_blkfree()
2757 if (bno + numfrags(fs, size) == tp->bno) { in ffs_blkfree()
2758 TAILQ_INSERT_HEAD(&tp->blklist, blkelm, blkreqlist); in ffs_blkfree()
2759 tp->bno = bno; in ffs_blkfree()
2760 tp->size += size; in ffs_blkfree()
2762 } else if (bno == tp->bno + numfrags(fs, tp->size)) { in ffs_blkfree()
2763 TAILQ_INSERT_TAIL(&tp->blklist, blkelm, blkreqlist); in ffs_blkfree()
2764 tp->size += size; in ffs_blkfree()
2768 TAILQ_INSERT_HEAD(&ntp->blklist, blkelm, blkreqlist); in ffs_blkfree()
2790 if ((uint64_t)size > fs->fs_bsize || fragoff(fs, size) != 0) { in ffs_checkfreeblk()
2792 (long)fs->fs_bsize, size, fs->fs_fsmnt); in ffs_checkfreeblk()
2795 if ((uint64_t)bno >= fs->fs_size) in ffs_checkfreeblk()
2796 panic("ffs_checkfreeblk: too big block %jd", (intmax_t)bno); in ffs_checkfreeblk()
2801 if (size == fs->fs_bsize) { in ffs_checkfreeblk()
2830 ump = VFSTOUFS(pvp->v_mount); in ffs_vfree()
2831 return (ffs_freefile(ump, ump->um_fs, ump->um_devvp, ino, mode, NULL)); in ffs_vfree()
2856 if (devvp->v_type == VREG) { in ffs_freefile()
2858 MPASS(devvp->v_mount->mnt_data == ump); in ffs_freefile()
2859 dev = ump->um_devvp->v_rdev; in ffs_freefile()
2860 } else if (devvp->v_type == VCHR) { in ffs_freefile()
2862 dev = devvp->v_rdev; in ffs_freefile()
2867 if (ino >= fs->fs_ipg * fs->fs_ncg) in ffs_freefile()
2869 devtoname(dev), (uintmax_t)ino, fs->fs_fsmnt); in ffs_freefile()
2871 if (!MOUNTEDSOFTDEP(UFSTOVFS(ump)) || devvp->v_type != VCHR) in ffs_freefile()
2874 * Would like to just downgrade to read-only. Until that in ffs_freefile()
2878 fs->fs_flags |= FS_NEEDSFSCK; in ffs_freefile()
2879 if (devvp->v_type == VREG) in ffs_freefile()
2883 error = getblkx(devvp, dbn, dbn, fs->fs_cgsize, 0, 0, 0, &bp); in ffs_freefile()
2886 bp->b_flags |= B_RELBUF | B_NOCACHE; in ffs_freefile()
2887 bp->b_flags &= ~B_CACHE; in ffs_freefile()
2892 cgino = ino % fs->fs_ipg; in ffs_freefile()
2895 (uintmax_t)ino, fs->fs_fsmnt); in ffs_freefile()
2896 if (fs->fs_ronly == 0) in ffs_freefile()
2900 if (cgino < cgp->cg_irotor) in ffs_freefile()
2901 cgp->cg_irotor = cgino; in ffs_freefile()
2902 cgp->cg_cs.cs_nifree++; in ffs_freefile()
2904 fs->fs_cstotal.cs_nifree++; in ffs_freefile()
2905 fs->fs_cs(fs, cg).cs_nifree++; in ffs_freefile()
2907 cgp->cg_cs.cs_ndir--; in ffs_freefile()
2908 fs->fs_cstotal.cs_ndir--; in ffs_freefile()
2909 fs->fs_cs(fs, cg).cs_ndir--; in ffs_freefile()
2911 fs->fs_fmod = 1; in ffs_freefile()
2914 if (MOUNTEDSOFTDEP(UFSTOVFS(ump)) && devvp->v_type == VCHR) in ffs_freefile()
2937 if ((devvp->v_type != VREG) && (devvp->v_type != VCHR)) in ffs_checkfreefile()
2939 if (ino >= fs->fs_ipg * fs->fs_ncg) in ffs_checkfreefile()
2944 ino %= fs->fs_ipg; in ffs_checkfreefile()
2974 start = cgp->cg_frotor / NBBY; in ffs_mapsearch()
2976 len = howmany(fs->fs_fpg, NBBY) - start; in ffs_mapsearch()
2978 fragtbl[fs->fs_frag], in ffs_mapsearch()
2979 (uint8_t)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY)))); in ffs_mapsearch()
2984 fragtbl[fs->fs_frag], in ffs_mapsearch()
2985 (uint8_t)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY)))); in ffs_mapsearch()
2988 start, len, fs->fs_fsmnt); in ffs_mapsearch()
2993 bno = (start + len - loc) * NBBY; in ffs_mapsearch()
2994 cgp->cg_frotor = bno; in ffs_mapsearch()
2999 for (i = bno + NBBY; bno < i; bno += fs->fs_frag) { in ffs_mapsearch()
3004 for (pos = 0; pos <= fs->fs_frag - allocsiz; pos++) { in ffs_mapsearch()
3011 printf("bno = %ju, fs = %s\n", (intmax_t)bno, fs->fs_fsmnt); in ffs_mapsearch()
3013 return (-1); in ffs_mapsearch()
3036 if ((fs->fs_metackhash & CK_CYLGRP) != 0) in ffs_getcg()
3038 if (devvp->v_type == VCHR) { in ffs_getcg()
3040 mp = devvp->v_rdev->si_mountpt; in ffs_getcg()
3043 mp = devvp->v_mount; in ffs_getcg()
3045 error = breadn_flags(devvp, blkno, blkno, (int)fs->fs_cgsize, NULL, in ffs_getcg()
3049 cgp = (struct cg *)bp->b_data; in ffs_getcg()
3050 if ((fs->fs_metackhash & CK_CYLGRP) != 0 && in ffs_getcg()
3051 (bp->b_flags & B_CKHASH) != 0 && in ffs_getcg()
3052 cgp->cg_ckhash != bp->b_ckhash) { in ffs_getcg()
3053 if (ppsratecheck(&VFSTOUFS(mp)->um_last_integritymsg, in ffs_getcg()
3054 &VFSTOUFS(mp)->um_secs_integritymsg, 1)) { in ffs_getcg()
3055 sfs = &mp->mnt_stat; in ffs_getcg()
3058 devvp->v_type == VCHR ? "" : "snapshot of ", in ffs_getcg()
3059 sfs->f_mntfromname, sfs->f_mntonname, (intmax_t)cg, in ffs_getcg()
3060 cgp->cg_ckhash, (uintmax_t)bp->b_ckhash); in ffs_getcg()
3062 bp->b_flags &= ~B_CKHASH; in ffs_getcg()
3063 bp->b_flags |= B_INVAL | B_NOCACHE; in ffs_getcg()
3067 if (!cg_chkmagic(cgp) || cgp->cg_cgx != cg) { in ffs_getcg()
3068 if (ppsratecheck(&VFSTOUFS(mp)->um_last_integritymsg, in ffs_getcg()
3069 &VFSTOUFS(mp)->um_secs_integritymsg, 1)) { in ffs_getcg()
3070 sfs = &mp->mnt_stat; in ffs_getcg()
3072 devvp->v_type == VCHR ? "" : "snapshot of ", in ffs_getcg()
3073 sfs->f_mntfromname, sfs->f_mntonname); in ffs_getcg()
3076 "be 0x%x\n", (intmax_t)cg, cgp->cg_magic, in ffs_getcg()
3080 "cgx %u\n", (intmax_t)cg, cgp->cg_cgx); in ffs_getcg()
3082 bp->b_flags &= ~B_CKHASH; in ffs_getcg()
3083 bp->b_flags |= B_INVAL | B_NOCACHE; in ffs_getcg()
3087 bp->b_flags &= ~B_CKHASH; in ffs_getcg()
3088 bp->b_xflags |= BX_BKGRDWRITE; in ffs_getcg()
3097 if ((fs->fs_metackhash & CK_CYLGRP) != 0) in ffs_getcg()
3098 bp->b_xflags |= BX_CYLGRP; in ffs_getcg()
3100 cgp->cg_old_time = cgp->cg_time = time_second; in ffs_getcg()
3112 cgp = (struct cg *)bp->b_data; in ffs_ckhash_cg()
3113 ckhash = cgp->cg_ckhash; in ffs_ckhash_cg()
3114 cgp->cg_ckhash = 0; in ffs_ckhash_cg()
3115 bp->b_ckhash = calculate_crc32c(~0L, bp->b_data, bp->b_bcount); in ffs_ckhash_cg()
3116 cgp->cg_ckhash = ckhash; in ffs_ckhash_cg()
3140 fs->fs_cstotal.cs_nffree -= fs->fs_cs(fs, cg).cs_nffree; in ffs_checkcgintegrity()
3141 fs->fs_cs(fs, cg).cs_nffree = 0; in ffs_checkcgintegrity()
3142 fs->fs_cstotal.cs_nbfree -= fs->fs_cs(fs, cg).cs_nbfree; in ffs_checkcgintegrity()
3143 fs->fs_cs(fs, cg).cs_nbfree = 0; in ffs_checkcgintegrity()
3144 fs->fs_cstotal.cs_nifree -= fs->fs_cs(fs, cg).cs_nifree; in ffs_checkcgintegrity()
3145 fs->fs_cs(fs, cg).cs_nifree = 0; in ffs_checkcgintegrity()
3146 fs->fs_maxcluster[cg] = 0; in ffs_checkcgintegrity()
3147 fs->fs_flags |= FS_NEEDSFSCK; in ffs_checkcgintegrity()
3148 fs->fs_fmod = 1; in ffs_checkcgintegrity()
3163 struct proc *p = td->td_proc; in ffs_fserr()
3166 p->p_pid, p->p_comm, td->td_ucred->cr_uid, (uintmax_t)inum, in ffs_fserr()
3167 fs->fs_fsmnt, cp); in ffs_fserr()
3174 * adjrefcnt(inode, amt) - adjusts the reference count on the
3178 * adjblkcnt(inode, amt) - adjust the number of blocks used by the
3180 * adjdepth(inode, amt) - adjust the depth of the specified directory
3182 * setsize(inode, size) - set the size of the inode to the
3184 * adjndir, adjbfree, adjifree, adjffree, adjnumclusters(amt) -
3186 * freedirs(inode, count) - directory inodes [inode..inode + count - 1]
3189 * freefiles(inode, count) - file inodes [inode..inode + count - 1]
3192 * freeblks(blockno, size) - blocks [blockno..blockno + size - 1]
3195 * setflags(flags, set/clear) - the fs_flags field has the specified
3196 * flags set (second parameter +1) or cleared (second parameter -1).
3197 * setcwd(dirinode) - set the current directory to dirinode in the
3199 * setdotdot(oldvalue, newvalue) - Verify that the inode number for ".."
3201 * unlink(nameptr, oldvalue) - Verify that the inode number associated
3275 "print out fsck_ffs-based filesystem update commands");
3296 if (req->newptr == NULL || req->newlen > sizeof(cmd)) in sysctl_ffs_fsck()
3305 vp = fp->f_vnode; in sysctl_ffs_fsck()
3306 if (vp->v_type != VREG && vp->v_type != VDIR) { in sysctl_ffs_fsck()
3312 strncmp(mp->mnt_stat.f_fstypename, "ufs", MFSNAMELEN)) { in sysctl_ffs_fsck()
3318 if (mp->mnt_flag & MNT_RDONLY) { in sysctl_ffs_fsck()
3323 fs = ump->um_fs; in sysctl_ffs_fsck()
3326 switch (oidp->oid_number) { in sysctl_ffs_fsck()
3330 printf("%s: %s flags\n", mp->mnt_stat.f_mntonname, in sysctl_ffs_fsck()
3334 fs->fs_flags |= (long)cmd.value; in sysctl_ffs_fsck()
3336 fs->fs_flags &= ~(long)cmd.value; in sysctl_ffs_fsck()
3342 printf("%s: adjust inode %jd link count by %jd\n", in sysctl_ffs_fsck()
3343 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value, in sysctl_ffs_fsck()
3350 ip->i_nlink += cmd.size; in sysctl_ffs_fsck()
3351 DIP_SET_NLINK(ip, ip->i_nlink); in sysctl_ffs_fsck()
3352 ip->i_effnlink += cmd.size; in sysctl_ffs_fsck()
3363 printf("%s: adjust inode %jd block count by %jd\n", in sysctl_ffs_fsck()
3364 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value, in sysctl_ffs_fsck()
3380 printf("%s: adjust directory inode %jd depth by %jd\n", in sysctl_ffs_fsck()
3381 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value, in sysctl_ffs_fsck()
3387 if (vp->v_type != VDIR) { in sysctl_ffs_fsck()
3402 printf("%s: set inode %jd size to %jd\n", in sysctl_ffs_fsck()
3403 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value, in sysctl_ffs_fsck()
3425 mp->mnt_stat.f_mntonname, in sysctl_ffs_fsck()
3429 printf("%s: free %s inodes %ju-%ju\n", in sysctl_ffs_fsck()
3430 mp->mnt_stat.f_mntonname, in sysctl_ffs_fsck()
3433 (uintmax_t)(cmd.value + cmd.size - 1)); in sysctl_ffs_fsck()
3437 if ((error = ffs_freefile(ump, fs, ump->um_devvp, in sysctl_ffs_fsck()
3440 cmd.size -= 1; in sysctl_ffs_fsck()
3449 printf("%s: free block %jd\n", in sysctl_ffs_fsck()
3450 mp->mnt_stat.f_mntonname, in sysctl_ffs_fsck()
3453 printf("%s: free blocks %jd-%jd\n", in sysctl_ffs_fsck()
3454 mp->mnt_stat.f_mntonname, in sysctl_ffs_fsck()
3456 (intmax_t)cmd.value + cmd.size - 1); in sysctl_ffs_fsck()
3461 blksize = fs->fs_frag - (blkno % fs->fs_frag); in sysctl_ffs_fsck()
3462 key = ffs_blkrelease_start(ump, ump->um_devvp, UFS_ROOTINO); in sysctl_ffs_fsck()
3466 ffs_blkfree(ump, fs, ump->um_devvp, blkno, in sysctl_ffs_fsck()
3467 blksize * fs->fs_fsize, UFS_ROOTINO, in sysctl_ffs_fsck()
3470 blkcnt -= blksize; in sysctl_ffs_fsck()
3471 blksize = fs->fs_frag; in sysctl_ffs_fsck()
3483 printf("%s: adjust number of directories by %jd\n", in sysctl_ffs_fsck()
3484 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); in sysctl_ffs_fsck()
3487 fs->fs_cstotal.cs_ndir += cmd.value; in sysctl_ffs_fsck()
3493 printf("%s: adjust number of free blocks by %+jd\n", in sysctl_ffs_fsck()
3494 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); in sysctl_ffs_fsck()
3497 fs->fs_cstotal.cs_nbfree += cmd.value; in sysctl_ffs_fsck()
3503 printf("%s: adjust number of free inodes by %+jd\n", in sysctl_ffs_fsck()
3504 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); in sysctl_ffs_fsck()
3507 fs->fs_cstotal.cs_nifree += cmd.value; in sysctl_ffs_fsck()
3513 printf("%s: adjust number of free frags by %+jd\n", in sysctl_ffs_fsck()
3514 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); in sysctl_ffs_fsck()
3517 fs->fs_cstotal.cs_nffree += cmd.value; in sysctl_ffs_fsck()
3523 printf("%s: adjust number of free clusters by %+jd\n", in sysctl_ffs_fsck()
3524 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); in sysctl_ffs_fsck()
3527 fs->fs_cstotal.cs_numclusters += cmd.value; in sysctl_ffs_fsck()
3533 printf("%s: set current directory to inode %jd\n", in sysctl_ffs_fsck()
3534 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); in sysctl_ffs_fsck()
3551 printf("%s: change .. in cwd from %jd to %jd\n", in sysctl_ffs_fsck()
3552 mp->mnt_stat.f_mntonname, (intmax_t)cmd.value, in sysctl_ffs_fsck()
3567 dvp = pwd->pwd_cdir; in sysctl_ffs_fsck()
3591 printf("%s: unlink %s (inode %jd)\n", in sysctl_ffs_fsck()
3592 mp->mnt_stat.f_mntonname, buf, (intmax_t)cmd.size); in sysctl_ffs_fsck()
3611 oidp->oid_number); in sysctl_ffs_fsck()