diff options
author | Zhang Yi <yi.zhang@huawei.com> | 2023-08-24 17:26:04 +0800 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2023-10-05 22:32:14 -0400 |
commit | 40ea98396a3659062267d1fe5f99af4f7e4f05e3 (patch) | |
tree | e11df8a5024bc46afd9de7c631b339647cc8b6fe /fs/ext4 | |
parent | ce774e5365e46be73ed055302c6de123a03394ea (diff) | |
download | linux-40ea98396a3659062267d1fe5f99af4f7e4f05e3.tar.gz linux-40ea98396a3659062267d1fe5f99af4f7e4f05e3.tar.bz2 linux-40ea98396a3659062267d1fe5f99af4f7e4f05e3.zip |
ext4: correct the start block of counting reserved clusters
When big allocate feature is enabled, we need to count and update
reserved clusters before removing a delayed only extent_status entry.
{init|count|get}_rsvd() have already done this, but the start block
number of this counting isn't correct in the following case.
lblk end
| |
v v
-------------------------
| | orig_es
-------------------------
^ ^
len1 is 0 | len2 |
If the start block of the orig_es entry founded is bigger than lblk, we
passed lblk as start block to count_rsvd(), but the length is correct,
finally, the range to be counted is offset. This patch fix this by
passing the start blocks to 'orig_es->lblk + len1'.
Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Cc: stable@kernel.org
Link: https://lore.kernel.org/r/20230824092619.1327976-2-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/extents_status.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index 6f7de14c0fa8..5e625ea4545d 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c @@ -1405,8 +1405,8 @@ static int __es_remove_extent(struct inode *inode, ext4_lblk_t lblk, } } if (count_reserved) - count_rsvd(inode, lblk, orig_es.es_len - len1 - len2, - &orig_es, &rc); + count_rsvd(inode, orig_es.es_lblk + len1, + orig_es.es_len - len1 - len2, &orig_es, &rc); goto out_get_reserved; } |