From: Alex Elder <elder@ieee.org>
To: Ilya Dryomov <ilya.dryomov@inktank.com>, ceph-devel@vger.kernel.org
Subject: Re: [PATCH] libceph: set last_piece in ceph_msg_data_pages_cursor_init() correctly
Date: Fri, 08 Aug 2014 15:59:56 -0500 [thread overview]
Message-ID: <53E53A4C.9000306@ieee.org> (raw)
In-Reply-To: <1407496707-11641-1-git-send-email-ilya.dryomov@inktank.com>
On 08/08/2014 06:18 AM, Ilya Dryomov wrote:
> Determining ->last_piece based on the value of ->page_offset + length
> is incorrect because length here is the length of the entire message.
> ->last_piece set to false even if page array data item length is <=
> PAGE_SIZE, which results in invalid length passed to
> ceph_tcp_{send,recv}page() and causes various asserts to fire.
I glanced at this this morning and thought it might have
a problem. Now that I've had the time to look at it a
little more closely I conclude it's fine.
I'm going to explain my reasoning, which just reaffirms what
you've explained. (Doing this helps me brush up on things,
I'm starting to get rusty...)
A message has a list of data items, and a data item is
broken into pieces, each of which (for a pages data item)
holds data from a single page. A cursor keeps the data item
now being processed in cursor->data, and cursor->resid is the
number of un-consumed bytes in the current data item. We want
to set cursor->last_piece when the next piece to process is
the last in the *data item*, not the last in the *message*,
so we need to compare against cursor->resid, not the message
length.
Before your change, any message with more than one data
item including a page array data item that was not last
in the list would have problems.
So in summary: Looks good.
Reviewed-by: Alex Elder <elder@linaro.org>
> # cat pages-cursor-init.sh
> #!/bin/bash
> rbd create --size 10 --image-format 2 foo
> FOO_DEV=$(rbd map foo)
> dd if=/dev/urandom of=$FOO_DEV bs=1M &>/dev/null
> rbd snap create foo@snap
> rbd snap protect foo@snap
> rbd clone foo@snap bar
> # rbd_resize calls librbd rbd_resize(), size is in bytes
> ./rbd_resize bar $(((4 << 20) + 512))
> rbd resize --size 10 bar
> BAR_DEV=$(rbd map bar)
> # trigger a 512-byte copyup -- 512-byte page array data item
> dd if=/dev/urandom of=$BAR_DEV bs=1M count=1 seek=5
>
> The problem exists only in ceph_msg_data_pages_cursor_init(),
> ceph_msg_data_pages_advance() does the right thing. The size_t cast is
> unnecessary.
>
> Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
> ---
> net/ceph/messenger.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
> index e51cad0db580..b2f571dd933d 100644
> --- a/net/ceph/messenger.c
> +++ b/net/ceph/messenger.c
> @@ -901,7 +901,7 @@ static void ceph_msg_data_pages_cursor_init(struct ceph_msg_data_cursor *cursor,
> BUG_ON(page_count > (int)USHRT_MAX);
> cursor->page_count = (unsigned short)page_count;
> BUG_ON(length > SIZE_MAX - cursor->page_offset);
> - cursor->last_piece = (size_t)cursor->page_offset + length <= PAGE_SIZE;
> + cursor->last_piece = cursor->page_offset + cursor->resid <= PAGE_SIZE;
> }
>
> static struct page *
>
prev parent reply other threads:[~2014-08-08 20:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-08 11:18 [PATCH] libceph: set last_piece in ceph_msg_data_pages_cursor_init() correctly Ilya Dryomov
2014-08-08 17:46 ` Sage Weil
2014-08-08 20:59 ` Alex Elder [this message]
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=53E53A4C.9000306@ieee.org \
--to=elder@ieee.org \
--cc=ceph-devel@vger.kernel.org \
--cc=ilya.dryomov@inktank.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.