summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/extent-tree.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 16655bb..7aa6ad1 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -1887,12 +1887,21 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len,
u64 *discarded_bytes)
{
int ret = 0;
+ u64 aligned_start = ALIGN(start, 1 << 9);
- *discarded_bytes = 0;
- ret = blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_NOFS, 0);
- if (!ret)
- *discarded_bytes = len;
+ if (WARN_ON(start != aligned_start)) {
+ len -= aligned_start - start;
+ len = round_down(len, 1 << 9);
+ start = aligned_start;
+ }
+ *discarded_bytes = 0;
+ if (len) {
+ ret = blkdev_issue_discard(bdev, start >> 9, len >> 9,
+ GFP_NOFS, 0);
+ if (!ret)
+ *discarded_bytes = len;
+ }
return ret;
}
OpenPOWER on IntegriCloud