diff options
Diffstat (limited to 'fs/ext3/balloc.c')
-rw-r--r-- | fs/ext3/balloc.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index 045995c8ce5a..153242187fce 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c | |||
@@ -1991,6 +1991,7 @@ ext3_grpblk_t ext3_trim_all_free(struct super_block *sb, unsigned int group, | |||
1991 | spin_unlock(sb_bgl_lock(sbi, group)); | 1991 | spin_unlock(sb_bgl_lock(sbi, group)); |
1992 | percpu_counter_sub(&sbi->s_freeblocks_counter, next - start); | 1992 | percpu_counter_sub(&sbi->s_freeblocks_counter, next - start); |
1993 | 1993 | ||
1994 | free_blocks -= next - start; | ||
1994 | /* Do not issue a TRIM on extents smaller than minblocks */ | 1995 | /* Do not issue a TRIM on extents smaller than minblocks */ |
1995 | if ((next - start) < minblocks) | 1996 | if ((next - start) < minblocks) |
1996 | goto free_extent; | 1997 | goto free_extent; |
@@ -2040,7 +2041,7 @@ free_extent: | |||
2040 | cond_resched(); | 2041 | cond_resched(); |
2041 | 2042 | ||
2042 | /* No more suitable extents */ | 2043 | /* No more suitable extents */ |
2043 | if ((free_blocks - count) < minblocks) | 2044 | if (free_blocks < minblocks) |
2044 | break; | 2045 | break; |
2045 | } | 2046 | } |
2046 | 2047 | ||
@@ -2090,7 +2091,8 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range) | |||
2090 | ext3_fsblk_t max_blks = le32_to_cpu(es->s_blocks_count); | 2091 | ext3_fsblk_t max_blks = le32_to_cpu(es->s_blocks_count); |
2091 | int ret = 0; | 2092 | int ret = 0; |
2092 | 2093 | ||
2093 | start = range->start >> sb->s_blocksize_bits; | 2094 | start = (range->start >> sb->s_blocksize_bits) + |
2095 | le32_to_cpu(es->s_first_data_block); | ||
2094 | len = range->len >> sb->s_blocksize_bits; | 2096 | len = range->len >> sb->s_blocksize_bits; |
2095 | minlen = range->minlen >> sb->s_blocksize_bits; | 2097 | minlen = range->minlen >> sb->s_blocksize_bits; |
2096 | trimmed = 0; | 2098 | trimmed = 0; |
@@ -2099,10 +2101,6 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range) | |||
2099 | return -EINVAL; | 2101 | return -EINVAL; |
2100 | if (start >= max_blks) | 2102 | if (start >= max_blks) |
2101 | goto out; | 2103 | goto out; |
2102 | if (start < le32_to_cpu(es->s_first_data_block)) { | ||
2103 | len -= le32_to_cpu(es->s_first_data_block) - start; | ||
2104 | start = le32_to_cpu(es->s_first_data_block); | ||
2105 | } | ||
2106 | if (start + len > max_blks) | 2104 | if (start + len > max_blks) |
2107 | len = max_blks - start; | 2105 | len = max_blks - start; |
2108 | 2106 | ||
@@ -2129,10 +2127,15 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range) | |||
2129 | if (free_blocks < minlen) | 2127 | if (free_blocks < minlen) |
2130 | continue; | 2128 | continue; |
2131 | 2129 | ||
2132 | if (len >= EXT3_BLOCKS_PER_GROUP(sb)) | 2130 | /* |
2133 | len -= (EXT3_BLOCKS_PER_GROUP(sb) - first_block); | 2131 | * For all the groups except the last one, last block will |
2134 | else | 2132 | * always be EXT3_BLOCKS_PER_GROUP(sb), so we only need to |
2133 | * change it for the last group in which case first_block + | ||
2134 | * len < EXT3_BLOCKS_PER_GROUP(sb). | ||
2135 | */ | ||
2136 | if (first_block + len < EXT3_BLOCKS_PER_GROUP(sb)) | ||
2135 | last_block = first_block + len; | 2137 | last_block = first_block + len; |
2138 | len -= last_block - first_block; | ||
2136 | 2139 | ||
2137 | ret = ext3_trim_all_free(sb, group, first_block, | 2140 | ret = ext3_trim_all_free(sb, group, first_block, |
2138 | last_block, minlen); | 2141 | last_block, minlen); |