Skip to content

Commit a99fcb0

Browse files
luca020400kdave
authored andcommitted
btrfs: split remaining space to discard in chunks
Per Qu Wenruo in case we have a very large disk, e.g. 8TiB device, mostly empty although we will do the split according to our super block locations, the last super block ends at 256G, we can submit a huge discard for the range [256G, 8T), causing a large delay. Split the space left to discard based on BTRFS_MAX_DISCARD_CHUNK_SIZE in preparation of introduction of cancellation points to trim. The value of the chunk size is arbitrary, it can be higher or derived from actual device capabilities but we can't easily read that using bio_discard_limit(). Link: https://bugzilla.kernel.org/show_bug.cgi?id=219180 Link: https://bugzilla.suse.com/show_bug.cgi?id=1229737 CC: [email protected] # 5.15+ Signed-off-by: Luca Stefani <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent d6e7ac6 commit a99fcb0

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

fs/btrfs/extent-tree.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,13 +1300,24 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len,
13001300
bytes_left = end - start;
13011301
}
13021302

1303-
if (bytes_left) {
1303+
while (bytes_left) {
1304+
u64 bytes_to_discard = min(BTRFS_MAX_DISCARD_CHUNK_SIZE, bytes_left);
1305+
13041306
ret = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT,
1305-
bytes_left >> SECTOR_SHIFT,
1307+
bytes_to_discard >> SECTOR_SHIFT,
13061308
GFP_NOFS);
1307-
if (!ret)
1308-
*discarded_bytes += bytes_left;
1309+
1310+
if (ret) {
1311+
if (ret != -EOPNOTSUPP)
1312+
break;
1313+
continue;
1314+
}
1315+
1316+
start += bytes_to_discard;
1317+
bytes_left -= bytes_to_discard;
1318+
*discarded_bytes += bytes_to_discard;
13091319
}
1320+
13101321
return ret;
13111322
}
13121323

fs/btrfs/volumes.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ struct btrfs_zoned_device_info;
3030

3131
#define BTRFS_MAX_DATA_CHUNK_SIZE (10ULL * SZ_1G)
3232

33+
/*
34+
* Arbitratry maximum size of one discard request to limit potentially long time
35+
* spent in blkdev_issue_discard().
36+
*/
37+
#define BTRFS_MAX_DISCARD_CHUNK_SIZE (SZ_1G)
38+
3339
extern struct mutex uuid_mutex;
3440

3541
#define BTRFS_STRIPE_LEN SZ_64K

0 commit comments

Comments
 (0)