diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2024-10-18 09:25:29 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2024-10-18 23:35:31 +0200 |
commit | 426f07ad3e2c9b51bfd93b870a3a9b04644130d0 (patch) | |
tree | 950c25205efbb13d0018dbdf268ccff1e2124bdb /fs/ufs | |
parent | ufs_clusteracct(): switch to passing fragment number (diff) | |
download | linux-426f07ad3e2c9b51bfd93b870a3a9b04644130d0.tar.xz linux-426f07ad3e2c9b51bfd93b870a3a9b04644130d0.zip |
ufs_free_fragments(): fix the braino in sanity check
The function expects that all fragments it's been asked to free will
be within the same block. And it even has a sanity check verifying
that - it takes the fragment number modulo the number of fragments
per block, adds the count and checks if that's too high.
Unfortunately, it misspells the upper limit - instead of ->s_fpb
(fragments per block) it says ->s_fpg (fragments per cylinder group).
So "too high" ends up being insanely lenient.
Had been that way since 2.1.112, when UFS write support had been
added. 27 years to spot a typo...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ufs')
-rw-r--r-- | fs/ufs/balloc.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 1793ce48df0a..82f1a4a128a2 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c @@ -50,7 +50,7 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count) UFSD("ENTER, fragment %llu, count %u\n", (unsigned long long)fragment, count); - if (ufs_fragnum(fragment) + count > uspi->s_fpg) + if (ufs_fragnum(fragment) + count > uspi->s_fpb) ufs_error (sb, "ufs_free_fragments", "internal error"); mutex_lock(&UFS_SB(sb)->s_lock); |