From: Zygo Blaxell <ce3g8jdj@umail.furryterror.org>
To: Chris Mason <clm@fb.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v3] btrfs: add missing memset while reading compressed inline extents
Date: Thu, 9 Mar 2017 23:41:13 -0500 [thread overview]
Message-ID: <20170310044112.GD21290@hungrycats.org> (raw)
In-Reply-To: <446e5250-2a96-5f46-737f-5c142bfc1471@fb.com>
[-- Attachment #1: Type: text/plain, Size: 2193 bytes --]
On Thu, Mar 09, 2017 at 10:39:49AM -0500, Chris Mason wrote:
>
>
> On 03/08/2017 09:12 PM, Zygo Blaxell wrote:
> >This is a story about 4 distinct (and very old) btrfs bugs.
> >
>
> Really great write up.
>
> [ ... ]
>
> >
> >diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> >index 25ac2cf..4d41a31 100644
> >--- a/fs/btrfs/inode.c
> >+++ b/fs/btrfs/inode.c
> >@@ -6805,6 +6805,12 @@ static noinline int uncompress_inline(struct btrfs_path *path,
> > max_size = min_t(unsigned long, PAGE_SIZE, max_size);
> > ret = btrfs_decompress(compress_type, tmp, page,
> > extent_offset, inline_size, max_size);
> >+ WARN_ON(max_size + pg_offset > PAGE_SIZE);
>
> Can you please drop this WARN_ON and make the math reflect any possible
> pg_offset? I do agree it shouldn't be happening, but its easy to correct
> for and the WARN is likely to get lost.
I'm not sure how to do that. It looks like I'd have to pass pg_offset
through btrfs_decompress to the decompress functions?
ret = btrfs_decompress(compress_type, tmp, page,
extent_offset, inline_size, max_size, pg_offset);
and in the compression functions get pg_offset from the argument list
instead of hardcoding zero.
But how does pg_offset become non-zero for an inline extent? A micro-hole
before the first byte? If the offset was >= 4096, the data wouldn't
be in the first block so there would never be an inline extent in the
first place.
> >+ if (max_size + pg_offset < PAGE_SIZE) {
> >+ char *map = kmap(page);
> >+ memset(map + pg_offset + max_size, 0, PAGE_SIZE - max_size - pg_offset);
> >+ kunmap(page);
> >+ }
>
> Both lzo and zlib have a memset to cover the gap between what they actually
> decompress and the max_size that we pass here. That's important because
> ram_bytes may not be 100% accurate.
>
> Can you also please toss in a comment about how the decompression code is
> responsible for the memset up to max_bytes?
>
> -chris
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
next prev parent reply other threads:[~2017-03-10 4:41 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-09 2:12 [PATCH v3] btrfs: add missing memset while reading compressed inline extents Zygo Blaxell
2017-03-09 15:39 ` Chris Mason
2017-03-10 4:41 ` Zygo Blaxell [this message]
2017-03-10 16:19 ` Chris Mason
2017-03-10 18:56 ` Zygo Blaxell
2017-03-10 19:12 ` Chris Mason
2017-03-10 21:45 ` Zygo Blaxell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170310044112.GD21290@hungrycats.org \
--to=ce3g8jdj@umail.furryterror.org \
--cc=clm@fb.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.