Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit f00545e

Browse files
luca020400gregkh
authored andcommitted
btrfs: split remaining space to discard in chunks
commit a99fcb0 upstream. 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]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 73a4f5a commit f00545e

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
@@ -1303,13 +1303,24 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len,
13031303
bytes_left = end - start;
13041304
}
13051305

1306-
if (bytes_left) {
1306+
while (bytes_left) {
1307+
u64 bytes_to_discard = min(BTRFS_MAX_DISCARD_CHUNK_SIZE, bytes_left);
1308+
13071309
ret = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT,
1308-
bytes_left >> SECTOR_SHIFT,
1310+
bytes_to_discard >> SECTOR_SHIFT,
13091311
GFP_NOFS);
1310-
if (!ret)
1311-
*discarded_bytes += bytes_left;
1312+
1313+
if (ret) {
1314+
if (ret != -EOPNOTSUPP)
1315+
break;
1316+
continue;
1317+
}
1318+
1319+
start += bytes_to_discard;
1320+
bytes_left -= bytes_to_discard;
1321+
*discarded_bytes += bytes_to_discard;
13121322
}
1323+
13131324
return ret;
13141325
}
13151326

fs/btrfs/volumes.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515

1616
#define BTRFS_MAX_DATA_CHUNK_SIZE (10ULL * SZ_1G)
1717

18+
/*
19+
* Arbitratry maximum size of one discard request to limit potentially long time
20+
* spent in blkdev_issue_discard().
21+
*/
22+
#define BTRFS_MAX_DISCARD_CHUNK_SIZE (SZ_1G)
23+
1824
extern struct mutex uuid_mutex;
1925

2026
#define BTRFS_STRIPE_LEN SZ_64K

0 commit comments

Comments
 (0)