btrfs: trim: make reserved device area adjustments more explicit
authorNikolay Borisov <nborisov@suse.com>
Mon, 3 Jun 2019 10:06:01 +0000 (13:06 +0300)
committerDavid Sterba <dsterba@suse.com>
Mon, 1 Jul 2019 11:35:02 +0000 (13:35 +0200)
Currently the first megabyte on a device housing a btrfs filesystem is
exempt from allocation and trimming. Currently this is not a problem
since 'start' is set to 1M at the beginning of btrfs_trim_free_extents
and find_first_clear_extent_bit always returns a range that is >= start.

However, in a follow up patch find_first_clear_extent_bit will be
changed such that it will return a range containing 'start' and this
range may very well be 0...>=1M so 'start'.

Future proof the sole user of find_first_clear_extent_bit by setting
'start' after the function is called. No functional changes.

Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-tree.c

index 5d736d8ae3e3ed461d6684aff181430504099ab5..862df2066e7a7ffe4c6152b13f844e7d9e95a557 100644 (file)
@@ -11179,12 +11179,17 @@ static int btrfs_trim_free_extents(struct btrfs_device *device, u64 *trimmed)
                find_first_clear_extent_bit(&device->alloc_state, start,
                                            &start, &end,
                                            CHUNK_TRIMMED | CHUNK_ALLOCATED);
+
+               /* Ensure we skip the reserved area in the first 1M */
+               start = max_t(u64, start, SZ_1M);
+
                /*
                 * If find_first_clear_extent_bit find a range that spans the
                 * end of the device it will set end to -1, in this case it's up
                 * to the caller to trim the value to the size of the device.
                 */
                end = min(end, device->total_bytes - 1);
+
                len = end - start + 1;
 
                /* We didn't find any extents */