diff options
author | Kirk McKusick <mckusick@FreeBSD.org> | 2021-01-26 19:46:38 +0000 |
---|---|---|
committer | Kirk McKusick <mckusick@FreeBSD.org> | 2021-01-26 19:46:38 +0000 |
commit | 8c22cf9b0997566ff6f576cfc9296b29bb055f65 (patch) | |
tree | 616e77831181fae298c81bb537db50be3f6e165f | |
parent | 2cf84258922f306a3f84866685d2f5346f67db58 (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.c | 5 |
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 { |