|
@@ -4808,6 +4808,8 @@ int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range)
|
|
|
ext4_group_t group, ngroups = ext4_get_groups_count(sb);
|
|
|
ext4_grpblk_t cnt = 0, first_block, last_block;
|
|
|
uint64_t start, len, minlen, trimmed;
|
|
|
+ ext4_fsblk_t first_data_blk =
|
|
|
+ le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block);
|
|
|
int ret = 0;
|
|
|
|
|
|
start = range->start >> sb->s_blocksize_bits;
|
|
@@ -4817,6 +4819,10 @@ int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range)
|
|
|
|
|
|
if (unlikely(minlen > EXT4_BLOCKS_PER_GROUP(sb)))
|
|
|
return -EINVAL;
|
|
|
+ if (start < first_data_blk) {
|
|
|
+ len -= first_data_blk - start;
|
|
|
+ start = first_data_blk;
|
|
|
+ }
|
|
|
|
|
|
/* Determine first and last group to examine based on start and len */
|
|
|
ext4_get_group_no_and_offset(sb, (ext4_fsblk_t) start,
|