diff options
author | Jeff Mahoney <jeffm@suse.com> | 2015-06-15 09:41:14 -0400 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2015-07-29 11:15:22 -0400 |
commit | d04c6b88320debb403bff8d8b634a1efa48b8d3d (patch) | |
tree | 31dbc36b458bfbeb7d640b0a2a183d4057699df4 | |
parent | 00d80e342c0f4f1990ab69f594ee1e2348e51dd9 (diff) |
btrfs: make btrfs_issue_discard return bytes discarded
Initially this will just be the length argument passed to it,
but the following patches will adjust that to reflect re-alignment
and skipped blocks.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Tested-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r-- | fs/btrfs/extent-tree.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 07204bf601ed..16655bb5f293 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -1883,10 +1883,17 @@ static int remove_extent_backref(struct btrfs_trans_handle *trans, | |||
1883 | return ret; | 1883 | return ret; |
1884 | } | 1884 | } |
1885 | 1885 | ||
1886 | static int btrfs_issue_discard(struct block_device *bdev, | 1886 | static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len, |
1887 | u64 start, u64 len) | 1887 | u64 *discarded_bytes) |
1888 | { | 1888 | { |
1889 | return blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_NOFS, 0); | 1889 | int ret = 0; |
1890 | |||
1891 | *discarded_bytes = 0; | ||
1892 | ret = blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_NOFS, 0); | ||
1893 | if (!ret) | ||
1894 | *discarded_bytes = len; | ||
1895 | |||
1896 | return ret; | ||
1890 | } | 1897 | } |
1891 | 1898 | ||
1892 | int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, | 1899 | int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, |
@@ -1907,14 +1914,16 @@ int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, | |||
1907 | 1914 | ||
1908 | 1915 | ||
1909 | for (i = 0; i < bbio->num_stripes; i++, stripe++) { | 1916 | for (i = 0; i < bbio->num_stripes; i++, stripe++) { |
1917 | u64 bytes; | ||
1910 | if (!stripe->dev->can_discard) | 1918 | if (!stripe->dev->can_discard) |
1911 | continue; | 1919 | continue; |
1912 | 1920 | ||
1913 | ret = btrfs_issue_discard(stripe->dev->bdev, | 1921 | ret = btrfs_issue_discard(stripe->dev->bdev, |
1914 | stripe->physical, | 1922 | stripe->physical, |
1915 | stripe->length); | 1923 | stripe->length, |
1924 | &bytes); | ||
1916 | if (!ret) | 1925 | if (!ret) |
1917 | discarded_bytes += stripe->length; | 1926 | discarded_bytes += bytes; |
1918 | else if (ret != -EOPNOTSUPP) | 1927 | else if (ret != -EOPNOTSUPP) |
1919 | break; /* Logic errors or -ENOMEM, or -EIO but I don't know how that could happen JDM */ | 1928 | break; /* Logic errors or -ENOMEM, or -EIO but I don't know how that could happen JDM */ |
1920 | 1929 | ||