sizeof(range)))
                        return -EFAULT;
 
-               range.minlen = max((unsigned int)range.minlen,
-                                  q->limits.discard_granularity);
                ret = ext4_trim_fs(sb, &range);
                if (ret < 0)
                        return ret;
 
  */
 int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range)
 {
+       struct request_queue *q = bdev_get_queue(sb->s_bdev);
        struct ext4_group_info *grp;
        ext4_group_t group, first_group, last_group;
        ext4_grpblk_t cnt = 0, first_cluster, last_cluster;
            start >= max_blks ||
            range->len < sb->s_blocksize)
                return -EINVAL;
+       /* No point to try to trim less than discard granularity */
+       if (range->minlen < q->limits.discard_granularity) {
+               minlen = EXT4_NUM_B2C(EXT4_SB(sb),
+                       q->limits.discard_granularity >> sb->s_blocksize_bits);
+               if (minlen > EXT4_CLUSTERS_PER_GROUP(sb))
+                       goto out;
+       }
        if (end >= max_blks)
                end = max_blks - 1;
        if (end <= first_data_blk)