On Mon, Jun 15, 2015 at 2:41 PM,  <[email protected]> wrote:
> From: Jeff Mahoney <[email protected]>
>
> It's possible, though unexpected, to pass unaligned offsets and lengths
> to btrfs_issue_discard.  We then shift the offset/length values to sector
> units.  If an unaligned offset has been passed, it will result in the
> entire sector being discarded, possibly losing data.  An unaligned
> length is safe but we'll end up returning an inaccurate number of
> discarded bytes.
>
> This patch aligns the offset to the 512B boundary, adjusts the length,
> and warns, since we shouldn't be discarding on an offset that isn't
> aligned with our sector size.
>
> Signed-off-by: Jeff Mahoney <[email protected]>
Reviewed-by: Filipe Manana <[email protected]>
Tested-by: Filipe Manana <[email protected]>

> ---
>  fs/btrfs/extent-tree.c | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index da1145d..cf9cefd 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -1888,12 +1888,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;
>  }
>
> --
> 2.4.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Filipe David Manana,

"Reasonable men adapt themselves to the world.
 Unreasonable men adapt the world to themselves.
 That's why all progress depends on unreasonable men."
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to