aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2023-04-18 06:03:30 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2023-04-29 18:09:01 +0000
commitb180a0773bef95880e06b0ee4a1635ab6c077175 (patch)
tree2f653f431625e4e823080997e3cab82acb8954e5
parent146ba7a1d60c7ab8959d41ccfdd2543cc5d18b34 (diff)
downloadsrc-b180a0773bef95880e06b0ee4a1635ab6c077175.tar.gz
src-b180a0773bef95880e06b0ee4a1635ab6c077175.zip
Bug fixes for fsck_ffs(8).
Sponsored by: Netflix (cherry picked from commit 18746531a881356ed24b6ef2fdc9e50707642163)
-rw-r--r--sbin/fsck_ffs/fsutil.c4
-rw-r--r--sbin/fsck_ffs/inode.c10
2 files changed, 9 insertions, 5 deletions
diff --git a/sbin/fsck_ffs/fsutil.c b/sbin/fsck_ffs/fsutil.c
index 44b3e50da012..8f5b09cfe610 100644
--- a/sbin/fsck_ffs/fsutil.c
+++ b/sbin/fsck_ffs/fsutil.c
@@ -319,8 +319,10 @@ getdatablk(ufs2_daddr_t blkno, long size, int type)
* Skip check for inodes because chkrange() considers
* metadata areas invalid to write data.
*/
- if (type != BT_INODES && chkrange(blkno, size / sblock.fs_fsize))
+ if (type != BT_INODES && chkrange(blkno, size / sblock.fs_fsize)) {
+ failedbuf.b_refcnt++;
return (&failedbuf);
+ }
bhdp = &bufhashhd[HASH(blkno)];
LIST_FOREACH(bp, bhdp, b_hash)
if (bp->b_bno == fsbtodb(&sblock, blkno)) {
diff --git a/sbin/fsck_ffs/inode.c b/sbin/fsck_ffs/inode.c
index a46fea0607a0..37b0f9ebc1b1 100644
--- a/sbin/fsck_ffs/inode.c
+++ b/sbin/fsck_ffs/inode.c
@@ -747,6 +747,7 @@ snapremove(ino_t inum)
bzero(&snaplist[i - 1], sizeof(struct inode));
snapcnt--;
}
+ memset(&idesc, 0, sizeof(struct inodesc));
idesc.id_type = SNAP;
idesc.id_func = snapclean;
idesc.id_number = inum;
@@ -767,14 +768,15 @@ snapclean(struct inodesc *idesc)
if (blkno == 0)
return (KEEPON);
- bp = idesc->id_bp;
dp = idesc->id_dp;
if (blkno == BLK_NOCOPY || blkno == BLK_SNAP) {
- if (idesc->id_lbn < UFS_NDADDR)
+ if (idesc->id_lbn < UFS_NDADDR) {
DIP_SET(dp, di_db[idesc->id_lbn], 0);
- else
+ } else {
+ bp = idesc->id_bp;
IBLK_SET(bp, bp->b_index, 0);
- dirty(bp);
+ dirty(bp);
+ }
}
return (KEEPON);
}