From: Niklas Schnelle <niklas@komani.de>
To: Sergei Trofimovich <slyich@gmail.com>
Cc: Josef Bacik <josef@redhat.com>,
chris.mason@oracle.com, linux-btrfs@vger.kernel.org,
cwillu <cwillu@cwillu.com>
Subject: Re: [PATCH v3] Re: btrfs does not work on usermode linux
Date: Mon, 11 Apr 2011 21:49:39 +0200 [thread overview]
Message-ID: <1302551379.4074.1.camel@pluto> (raw)
In-Reply-To: <20110411224452.4a5149da@sf>
[-- Attachment #1: Type: text/plain, Size: 1993 bytes --]
I think the problem here is that memcpy beahviour changed in recent
glibc in this regard see here http://lwn.net/Articles/414467/
On Mon, 2011-04-11 at 22:44 +0300, Sergei Trofimovich wrote:
> > Fix data corruption caused by memcpy() usage on overlapping data.
> > I've observed it first when found out usermode linux crash on btrfs.
>
> Changes since v2:
> - Code style cleanup
> - 2 versions of patch: BUG_ON and WARN_ON variants,
> _but_ see below why I prefer BUG_ON
>
> Changes since v1:
>
> > else
> > src_kaddr = dst_kaddr;
> >
> > + BUG_ON(abs(src_off - dst_off) < len);
> > memcpy(dst_kaddr + dst_off, src_kaddr + src_off, len);
>
> Too eager BUG_ON. Now used only for src_page == dst_page.
>
> > - if (dst_offset < src_offset) {
> > + if (abs(dst_offset - src_offset) >= len) {
>
> abs() is not a good thing to use un unsigned values. aded helper overlapping_areas.
>
> On Mon, 11 Apr 2011 11:37:57 -0400
> Josef Bacik <josef@redhat.com> wrote:
>
> > + {
> > you will want to turn that into
> >
> > if (dst_page != src_page) {
>
> done
>
> > Also maybe BUG_ON() is a little strong, since the kernel will do this
> > right, it just screws up UML. So maybe just do a WARN_ON() so we notice
> > it. Thanks,
>
> I'm afaid I didn't understand this part. The commit I've found a deviation
> was linux's implementation of memcpy (UML uses it as kernel does). Why the
> kernel differs to UML in that respect? Seems I don't know/understand something
> fundamental here.
> So, if data overlaps - it's a moment before data corruption, thus BUG_ON.
>
> Another thought is (if memcpy semantics differ from standard C's function):
> does linux's memcpy guarantee copying direction behaviour?
> If it does, then it's really a weird memmove and x86/memcpy_64.S is a bit broken.
>
> Attached both patches, I personally like BUG_ON variant.
> Pick the one you like more :]
>
> Thanks for the feedback!
>
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
next prev parent reply other threads:[~2011-04-11 19:49 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-10 10:37 btrfs does not work on usermode linux Sergei Trofimovich
2011-04-10 15:42 ` Sergei Trofimovich
2011-04-10 20:06 ` Sergei Trofimovich
2011-04-10 20:24 ` [PATCH] " Sergei Trofimovich
2011-04-10 20:58 ` [PATCH v2] " Sergei Trofimovich
2011-04-11 15:37 ` Josef Bacik
2011-04-11 19:44 ` [PATCH v3] " Sergei Trofimovich
2011-04-11 19:49 ` Niklas Schnelle [this message]
2011-04-11 19:50 ` Josef Bacik
2011-04-12 21:23 ` Sergei Trofimovich
2011-04-13 11:32 ` Chris Mason
2011-04-13 20:12 ` Sergei Trofimovich
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=1302551379.4074.1.camel@pluto \
--to=niklas@komani.de \
--cc=chris.mason@oracle.com \
--cc=cwillu@cwillu.com \
--cc=josef@redhat.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=slyich@gmail.com \
/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.