Lines Matching +full:ip +full:- +full:block
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
63 struct inode ip; in ckinode() local
69 if (idesc->id_fix != IGNORE) in ckinode()
70 idesc->id_fix = DONTKNOW; in ckinode()
71 idesc->id_dp = dp; in ckinode()
72 idesc->id_lbn = -1; in ckinode()
73 idesc->id_lballoc = -1; in ckinode()
74 idesc->id_level = 0; in ckinode()
75 idesc->id_entryno = 0; in ckinode()
76 idesc->id_filesize = DIP(dp, di_size); in ckinode()
82 dino.dp1 = dp->dp1; in ckinode()
84 dino.dp2 = dp->dp2; in ckinode()
91 idesc->id_lbn++; in ckinode()
92 if (--ndb == 0 && in ckinode()
94 idesc->id_numfrags = in ckinode()
97 idesc->id_numfrags = sblock.fs_frag; in ckinode()
99 if (idesc->id_type == DATA && ndb >= 0) { in ckinode()
100 /* An empty block in a directory XXX */ in ckinode()
101 getpathname(pathbuf, idesc->id_number, in ckinode()
102 idesc->id_number); in ckinode()
106 ginode(idesc->id_number, &ip); in ckinode()
107 DIP_SET(ip.i_dp, di_size, in ckinode()
112 inodirty(&ip); in ckinode()
113 irelse(&ip); in ckinode()
119 idesc->id_blkno = DIP(&dino, di_db[i]); in ckinode()
120 if (idesc->id_type != DATA) in ckinode()
121 ret = (*idesc->id_func)(idesc); in ckinode()
127 idesc->id_numfrags = sblock.fs_frag; in ckinode()
128 remsize = DIP(&dino, di_size) - sblock.fs_bsize * UFS_NDADDR; in ckinode()
132 idesc->id_level = i + 1; in ckinode()
134 idesc->id_blkno = DIP(&dino, di_ib[i]); in ckinode()
139 idesc->id_lbn += sizepb / sblock.fs_bsize; in ckinode()
140 if (idesc->id_type == DATA) { in ckinode()
141 /* An empty block in a directory XXX */ in ckinode()
142 getpathname(pathbuf, idesc->id_number, in ckinode()
143 idesc->id_number); in ckinode()
147 ginode(idesc->id_number, &ip); in ckinode()
148 DIP_SET(ip.i_dp, di_size, in ckinode()
149 DIP(ip.i_dp, di_size) - remsize); in ckinode()
154 inodirty(&ip); in ckinode()
155 irelse(&ip); in ckinode()
160 remsize -= sizepb; in ckinode()
168 struct inode ip; in iblock() local
175 if (idesc->id_type != DATA) { in iblock()
176 func = idesc->id_func; in iblock()
181 bp = getdatablk(idesc->id_blkno, sblock.fs_bsize, type); in iblock()
182 if (bp->b_errs != 0) { in iblock()
186 idesc->id_bp = bp; in iblock()
187 idesc->id_level--; in iblock()
188 for (sizepb = sblock.fs_bsize, i = 0; i < idesc->id_level; i++) in iblock()
194 if (idesc->id_func == pass1check && nif < NINDIR(&sblock)) { in iblock()
199 (u_long)idesc->id_number); in iblock()
211 idesc->id_blkno = IBLK(bp, i); in iblock()
212 bp->b_index = i; in iblock()
213 if (idesc->id_level == 0) { in iblock()
214 idesc->id_lbn++; in iblock()
217 n = iblock(idesc, isize, type - 1); in iblock()
218 idesc->id_level++; in iblock()
225 idesc->id_lbn += sizepb / sblock.fs_bsize; in iblock()
226 if (idesc->id_type == DATA && isize > 0) { in iblock()
227 /* An empty block in a directory XXX */ in iblock()
228 getpathname(pathbuf, idesc->id_number, in iblock()
229 idesc->id_number); in iblock()
233 ginode(idesc->id_number, &ip); in iblock()
234 DIP_SET(ip.i_dp, di_size, in iblock()
235 DIP(ip.i_dp, di_size) - isize); in iblock()
240 inodirty(&ip); in iblock()
246 isize -= sizepb; in iblock()
253 * Finds the disk block address at the specified lbn within the inode
256 * negative if an extattr or indirect block is requested.
273 if (lbn < 0 && lbn >= -UFS_NXADDR) { in ino_blkatoff()
274 lbn = -1 - lbn; in ino_blkatoff()
275 if (lbn > lblkno(&sblock, dp->dp2.di_extsize - 1)) in ino_blkatoff()
278 sblksize(&sblock, dp->dp2.di_extsize, lbn)); in ino_blkatoff()
279 return (dp->dp2.di_extb[lbn]); in ino_blkatoff()
297 if (lbn == -cur - i) in ino_blkatoff()
302 if (lbn < 0 && -lbn >= next) in ino_blkatoff()
308 return (indir_blkatoff(DIP(dp, di_ib[i]), ino, -cur - i, lbn, in ino_blkatoff()
316 * Fetch an indirect block to find the block at a given lbn. The lbn
317 * may be negative to fetch a specific indirect block pointer or positive
318 * to fetch a specific block.
330 if (level == -1) in indir_blkatoff()
337 base = -(cur + level); in indir_blkatoff()
338 for (i = level; i > 0; i--) in indir_blkatoff()
341 i = (lbn - base) / lbnadd; in indir_blkatoff()
343 i = (-lbn - base) / lbnadd; in indir_blkatoff()
352 cur = -(base + (i * lbnadd)) - (level - 1); in indir_blkatoff()
354 if (bp->b_errs != 0) in indir_blkatoff()
357 bp->b_index = i; in indir_blkatoff()
373 * Check that a block in a legal block number.
382 cnt > maxfsblock - blk) { in chkrange()
430 ginode(ino_t inumber, struct inode *ip) in ginode() argument
439 ip->i_number = inumber; in ginode()
442 ip->i_bp = &inobuf; in ginode()
446 inumber >= icachebp->b_index && in ginode()
447 inumber < icachebp->b_index + INOPB(&sblock)) { in ginode()
449 icachebp->b_refcnt++; in ginode()
450 ip->i_bp = icachebp; in ginode()
453 /* release our cache-hold reference on old icachebp */ in ginode()
457 if (icachebp->b_errs != 0) { in ginode()
459 ip->i_bp = NULL; in ginode()
460 ip->i_dp = &zino; in ginode()
463 /* take a cache-hold reference on new icachebp */ in ginode()
464 icachebp->b_refcnt++; in ginode()
465 icachebp->b_index = rounddown(inumber, INOPB(&sblock)); in ginode()
466 ip->i_bp = icachebp; in ginode()
469 ip->i_dp = (union dinode *) in ginode()
470 &ip->i_bp->b_un.b_dinode1[inumber - ip->i_bp->b_index]; in ginode()
471 dpp.dp1 = (struct ufs1_dinode *)ip->i_dp; in ginode()
473 inodirty(ip); in ginode()
476 ip->i_dp = (union dinode *) in ginode()
477 &ip->i_bp->b_un.b_dinode2[inumber - ip->i_bp->b_index]; in ginode()
478 dpp.dp2 = dp = (struct ufs2_dinode *)ip->i_dp; in ginode()
480 if (dp->di_mode != 0 && ffs_verify_dinode_ckhash(&sblock, dp)) { in ginode()
481 pwarn("INODE CHECK-HASH FAILED"); in ginode()
482 prtinode(ip); in ginode()
487 inodirty(ip); in ginode()
491 inodirty(ip); in ginode()
498 irelse(struct inode *ip) in irelse() argument
502 if (ip->i_bp == NULL) in irelse()
505 ffs_verify_dinode_ckhash(&sblock, (struct ufs2_dinode *)ip->i_dp)) { in irelse()
506 pwarn("irelse: releasing inode with bad check-hash"); in irelse()
507 prtinode(ip); in irelse()
509 if (ip->i_bp->b_refcnt <= 0) in irelse()
511 (uintmax_t) ip->i_number); in irelse()
512 brelse(ip->i_bp); in irelse()
531 struct inode ip; in getnextinode() local
554 pfatal("Non-zero getnextinode() ref count %d\n", in getnextinode()
573 pwarn("INODE CHECK-HASH FAILED"); in getnextinode()
574 ip.i_bp = NULL; in getnextinode()
575 ip.i_dp = dp; in getnextinode()
576 ip.i_number = inumber; in getnextinode()
577 prtinode(&ip); in getnextinode()
595 if (memcmp(dp->dp2.di_db, zino.dp2.di_db, in getnextinode()
597 memcmp(dp->dp2.di_ib, zino.dp2.di_ib, in getnextinode()
599 dp->dp2.di_mode || dp->dp2.di_size) in getnextinode()
612 * Fake ndb value so direct/indirect block checks below in getnextinode()
619 j = ndb - UFS_NDADDR; in getnextinode()
620 for (ndb = 1; j > 1; j--) in getnextinode()
629 for (j = 0, ndb -= UFS_NDADDR; ndb > 0; j++) in getnextinode()
655 lastvalidinum = inum + inosused - 1; in setinodebuf()
693 blkno = idesc->id_blkno; in freeblock()
694 if (idesc->id_type == SNAP) { in freeblock()
698 size = lfragtosize(&sblock, idesc->id_numfrags); in freeblock()
699 if (snapblkfree(&sblock, blkno, size, idesc->id_number, in freeblock()
702 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { in freeblock()
706 for (dlp = duplist; dlp; dlp = dlp->next) { in freeblock()
707 if (dlp->dup != blkno) in freeblock()
709 dlp->dup = duplist->dup; in freeblock()
711 duplist = duplist->next; in freeblock()
717 n_blks--; in freeblock()
725 cgbp = cglookup(dtog(&sblock, idesc->id_blkno)); in freeblock()
726 cgp = cgbp->b_un.b_cg; in freeblock()
727 if (idesc->id_numfrags == sblock.fs_frag) in freeblock()
728 cgp->cg_cs.cs_nbfree++; in freeblock()
730 cgp->cg_cs.cs_nffree += idesc->id_numfrags; in freeblock()
743 struct inode ip; in snapremove() local
750 ginode(inum, &ip); in snapremove()
752 ip = snaplist[i]; in snapremove()
753 if ((DIP(ip.i_dp, di_flags) & SF_SNAPSHOT) == 0) { in snapremove()
757 irelse(&ip); in snapremove()
770 snaplist[i - 1] = snaplist[i]; in snapremove()
771 sblock.fs_snapinum[i - 1] = sblock.fs_snapinum[i]; in snapremove()
773 sblock.fs_snapinum[i - 1] = 0; in snapremove()
774 bzero(&snaplist[i - 1], sizeof(struct inode)); in snapremove()
775 snapcnt--; in snapremove()
781 (void)ckinode(ip.i_dp, &idesc); in snapremove()
782 DIP_SET(ip.i_dp, di_flags, DIP(ip.i_dp, di_flags) & ~SF_SNAPSHOT); in snapremove()
783 inodirty(&ip); in snapremove()
784 irelse(&ip); in snapremove()
794 blkno = idesc->id_blkno; in snapclean()
798 dp = idesc->id_dp; in snapclean()
800 if (idesc->id_lbn < UFS_NDADDR) { in snapclean()
801 DIP_SET(dp, di_db[idesc->id_lbn], 0); in snapclean()
803 bp = idesc->id_bp; in snapclean()
804 IBLK_SET(bp, bp->b_index, 0); in snapclean()
812 * Notification that a block is being freed. Return zero if the free
813 * should be allowed to proceed. Return non-zero if the snapshot file
814 * wants to claim the block. The block will be claimed if it is an
819 * blocks. Note that if more than one snapshot file maps the block,
825 * have a block number equal to their logical block number within the
826 * snapshot. A copied block can never have this property because they
834 struct inode ip; in snapblkfree() local
848 /* Direct blocks are always pre-copied */ in snapblkfree()
855 * Lookup block being freed. in snapblkfree()
857 ip = snaplist[i]; in snapblkfree()
858 dp = ip.i_dp; in snapblkfree()
859 blkno = ino_blkatoff(dp, inum != 0 ? inum : ip.i_number, in snapblkfree()
862 * Check to see if block needs to be copied. in snapblkfree()
866 * A block that we map is being freed. If it has not in snapblkfree()
872 * No previous snapshot claimed the block, in snapblkfree()
877 pfatal("snapblkfree: inconsistent block type"); in snapblkfree()
878 IBLK_SET(snapbp, snapbp->b_index, BLK_NOCOPY); in snapblkfree()
884 * If the snapshot has already copied the block in snapblkfree()
885 * (default), or does not care about the block, in snapblkfree()
892 * If this is a full size block, we will just grab it in snapblkfree()
896 * claim this block. in snapblkfree()
898 if (size == fs->fs_bsize) { in snapblkfree()
901 "from inum %ju\n", (intmax_t)ip.i_number, in snapblkfree()
903 IBLK_SET(snapbp, snapbp->b_index, relblkno); in snapblkfree()
908 inodirty(&ip); in snapblkfree()
912 /* First time through, read the contents of the old block. */ in snapblkfree()
916 fs->fs_bsize) != 0) { in snapblkfree()
917 pfatal("Could not read snapshot %ju block " in snapblkfree()
918 "%jd\n", (intmax_t)ip.i_number, in snapblkfree()
927 blkno = allocblk(dtog(fs, relblkno), fs->fs_frag, in snapblkfree()
930 pfatal("Could not allocate block for snapshot %ju\n", in snapblkfree()
931 (intmax_t)ip.i_number); in snapblkfree()
936 "size %ld new blkno %jd\n", (intmax_t)ip.i_number, in snapblkfree()
939 blwrite(fswritefd, copybuf, fsbtodb(fs, blkno), fs->fs_bsize); in snapblkfree()
940 IBLK_SET(snapbp, snapbp->b_index, blkno); in snapblkfree()
944 DIP(dp, di_blocks) + btodb(fs->fs_bsize)); in snapblkfree()
945 inodirty(&ip); in snapblkfree()
951 * Notification that a block is being written. Return if the block
953 * The block will be copied in all of the snapshots that are tracking
955 * block. Here we need to check each block in the buffer.
967 numblks = blkroundup(fs, bp->b_size) / fs->fs_bsize; in copyonwrite()
969 prtbuf(bp, "copyonwrite: checking %jd block%s in buffer", in copyonwrite()
971 copyblkno = blknum(fs, dbtofsb(fs, bp->b_bno)); in copyonwrite()
974 copyblkno += fs->fs_frag; in copyonwrite()
982 struct inode ip; in chkcopyonwrite() local
990 /* Direct blocks are always pre-copied */ in chkcopyonwrite()
996 * Lookup block being freed. in chkcopyonwrite()
998 ip = snaplist[i]; in chkcopyonwrite()
999 dp = ip.i_dp; in chkcopyonwrite()
1000 blkno = ino_blkatoff(dp, ip.i_number, lbn, &frags, &snapbp); in chkcopyonwrite()
1002 * Check to see if block needs to be copied. in chkcopyonwrite()
1006 * A block that we have already copied or don't track. in chkcopyonwrite()
1011 /* First time through, read the contents of the old block. */ in chkcopyonwrite()
1015 fs->fs_bsize) != 0) { in chkcopyonwrite()
1016 pfatal("Could not read snapshot %ju block " in chkcopyonwrite()
1017 "%jd\n", (intmax_t)ip.i_number, in chkcopyonwrite()
1026 if ((blkno = allocblk(dtog(fs, copyblkno), fs->fs_frag, in chkcopyonwrite()
1028 pfatal("Could not allocate block for snapshot %ju\n", in chkcopyonwrite()
1029 (intmax_t)ip.i_number); in chkcopyonwrite()
1035 (intmax_t)ip.i_number, (intmax_t)lbn, in chkcopyonwrite()
1037 blwrite(fswritefd, copybuf, fsbtodb(fs, blkno), fs->fs_bsize); in chkcopyonwrite()
1038 IBLK_SET(snapbp, snapbp->b_index, blkno); in chkcopyonwrite()
1042 DIP(dp, di_blocks) + btodb(fs->fs_bsize)); in chkcopyonwrite()
1043 inodirty(&ip); in chkcopyonwrite()
1049 * Traverse an inode and check that its block count is correct
1053 check_blkcnt(struct inode *ip) in check_blkcnt() argument
1060 dp = ip->i_dp; in check_blkcnt()
1063 idesc.id_number = ip->i_number; in check_blkcnt()
1066 if (sblock.fs_magic == FS_UFS2_MAGIC && dp->dp2.di_extsize > 0) { in check_blkcnt()
1067 ndb = howmany(dp->dp2.di_extsize, sblock.fs_bsize); in check_blkcnt()
1069 if (--ndb == 0 && in check_blkcnt()
1070 (offset = blkoff(&sblock, dp->dp2.di_extsize)) != 0) in check_blkcnt()
1075 if (dp->dp2.di_extb[j] == 0) in check_blkcnt()
1077 idesc.id_blkno = dp->dp2.di_extb[j]; in check_blkcnt()
1086 pwarn("INCORRECT BLOCK COUNT I=%lu (%ju should be %ju)", in check_blkcnt()
1097 inodirty(ip); in check_blkcnt()
1100 cmd.size = idesc.id_entryno - DIP(dp, di_blocks); in check_blkcnt()
1105 &cmd, sizeof cmd) == -1) in check_blkcnt()
1106 rwerror("ADJUST INODE BLOCK COUNT", cmd.value); in check_blkcnt()
1130 bp->b_errs = blread(fsreadfd, bp->b_un.b_buf, bp->b_bno, in freeinodebuf()
1131 bp->b_size); in freeinodebuf()
1158 Malloc(sizeof(*inp) + (blks - 1) * sizeof(ufs2_daddr_t)); in cacheino()
1162 inp->i_flags = 0; in cacheino()
1163 inp->i_parent = inumber == UFS_ROOTINO ? UFS_ROOTINO : (ino_t)0; in cacheino()
1164 inp->i_dotdot = (ino_t)0; in cacheino()
1165 inp->i_number = inumber; in cacheino()
1166 inp->i_isize = DIP(dp, di_size); in cacheino()
1167 inp->i_depth = DIP(dp, di_dirdepth); in cacheino()
1168 inp->i_numblks = blks; in cacheino()
1170 inp->i_blks[i] = DIP(dp, di_db[i]); in cacheino()
1173 inp->i_blks[UFS_NDADDR + i] = DIP(dp, di_ib[i]); in cacheino()
1194 if (inp->i_number != inumber) in getinoinfo()
1202 * Remove an entry from the inode cache and disk-order sorted list.
1213 if (inp->i_number != inumber) in removecachedino()
1216 for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--) { in removecachedino()
1219 *inpp = inpsort[inplast - 1]; in removecachedino()
1220 inplast--; in removecachedino()
1242 for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--) in inocleanup()
1251 inodirty(struct inode *ip) in inodirty() argument
1256 (struct ufs2_dinode *)ip->i_dp); in inodirty()
1257 dirty(ip->i_bp); in inodirty()
1264 struct inode ip; in clri() local
1266 ginode(idesc->id_number, &ip); in clri()
1267 dp = ip.i_dp; in clri()
1271 prtinode(&ip); in clri()
1277 n_files--; in clri()
1279 if (idesc->id_type == SNAP) { in clri()
1280 snapremove(idesc->id_number); in clri()
1281 idesc->id_type = ADDR; in clri()
1284 inoinfo(idesc->id_number)->ino_state = USTATE; in clri()
1286 inodirty(&ip); in clri()
1288 cmd.value = idesc->id_number; in clri()
1289 cmd.size = -DIP(dp, di_nlink); in clri()
1294 &cmd, sizeof cmd) == -1) in clri()
1298 irelse(&ip); in clri()
1304 struct direct *dirp = idesc->id_dirp; in findname()
1306 if (dirp->d_ino != idesc->id_parent || idesc->id_entryno < 2) { in findname()
1307 idesc->id_entryno++; in findname()
1310 memmove(idesc->id_name, dirp->d_name, (size_t)dirp->d_namlen + 1); in findname()
1317 struct direct *dirp = idesc->id_dirp; in findino()
1319 if (dirp->d_ino == 0) in findino()
1321 if (strcmp(dirp->d_name, idesc->id_name) == 0 && in findino()
1322 dirp->d_ino >= UFS_ROOTINO && dirp->d_ino < maxino) { in findino()
1323 idesc->id_parent = dirp->d_ino; in findino()
1332 struct direct *dirp = idesc->id_dirp; in clearentry()
1334 if (dirp->d_ino != idesc->id_parent || idesc->id_entryno < 2) { in clearentry()
1335 idesc->id_entryno++; in clearentry()
1338 dirp->d_ino = 0; in clearentry()
1343 prtinode(struct inode *ip) in prtinode() argument
1350 dp = ip->i_dp; in prtinode()
1351 printf(" I=%lu ", (u_long)ip->i_number); in prtinode()
1352 if (ip->i_number < UFS_ROOTINO || ip->i_number >= maxino) in prtinode()
1356 printf("%s ", pw->pw_name); in prtinode()
1374 switch (inoinfo(ino)->ino_state) { in blkerror()
1378 inoinfo(ino)->ino_state = FCLEAR; in blkerror()
1383 inoinfo(ino)->ino_state = DCLEAR; in blkerror()
1391 errx(EEXIT, "BAD STATE %d TO BLKERR", inoinfo(ino)->ino_state); in blkerror()
1403 struct inode ip; in allocino() local
1413 } else if (inoinfo(request)->ino_state != USTATE) in allocino()
1417 if (inoinfo(ino)->ino_state == USTATE) in allocino()
1423 cgp = cgbp->b_un.b_cg; in allocino()
1431 cgp->cg_cs.cs_nifree--; in allocino()
1434 inoinfo(ino)->ino_state = DSTATE; in allocino()
1435 cgp->cg_cs.cs_ndir++; in allocino()
1439 inoinfo(ino)->ino_state = FSTATE; in allocino()
1445 ginode(ino, &ip); in allocino()
1446 dp = ip.i_dp; in allocino()
1452 inoinfo(ino)->ino_state = USTATE; in allocino()
1453 inodirty(&ip); in allocino()
1454 irelse(&ip); in allocino()
1464 inodirty(&ip); in allocino()
1465 irelse(&ip); in allocino()
1466 inoinfo(ino)->ino_type = IFTODT(type); in allocino()
1478 struct inode ip; in freeino() local
1484 ginode(ino, &ip); in freeino()
1485 dp = ip.i_dp; in freeino()
1488 inodirty(&ip); in freeino()
1489 irelse(&ip); in freeino()
1490 inoinfo(ino)->ino_state = USTATE; in freeino()
1491 n_files--; in freeino()