aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2021-01-26 19:46:38 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2021-01-26 19:46:38 +0000
commit8c22cf9b0997566ff6f576cfc9296b29bb055f65 (patch)
tree616e77831181fae298c81bb537db50be3f6e165f
parent2cf84258922f306a3f84866685d2f5346f67db58 (diff)
Fix fsck_ffs incorrectly reporting "CANNOT READ BLK: NNNN" errors.
A long-standing bug in Pass 1 of fsck_ffs in which it is reading in blocks of inodes to check their block pointers. It failed to round up the size of the read to a disk block size. When disks would accept 512-byte aligned reads, the bug rarely manifested itself. But many recent disks will no longer accept 512-byte aligned reads but require 4096-byte aligned reads, so the failure to properly round-up read sizes to multiples of 4096 bytes makes the error much more likely to occur. Reported by: Peter Holm and others Tested by: Peter Holm and Rozhuk Ivan MFC after: 3 days Sponsored by: Netflix
-rw-r--r--sbin/fsck_ffs/inode.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/sbin/fsck_ffs/inode.c b/sbin/fsck_ffs/inode.c
index 18a015f8187e..60019425c825 100644
--- a/sbin/fsck_ffs/inode.c
+++ b/sbin/fsck_ffs/inode.c
@@ -611,8 +611,9 @@ setinodebuf(int cg, ino_t inosused)
sizeof(struct ufs1_dinode) : sizeof(struct ufs2_dinode));
readpercg = inosused / fullcnt;
partialcnt = inosused % fullcnt;
- partialsize = partialcnt * ((sblock.fs_magic == FS_UFS1_MAGIC) ?
- sizeof(struct ufs1_dinode) : sizeof(struct ufs2_dinode));
+ partialsize = fragroundup(&sblock,
+ partialcnt * ((sblock.fs_magic == FS_UFS1_MAGIC) ?
+ sizeof(struct ufs1_dinode) : sizeof(struct ufs2_dinode)));
if (partialcnt != 0) {
readpercg++;
} else {