From: Benny Halevy <bhalevy@panasas.com>
To: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 1/3] NFSv4.1: Fix some issues with pnfs_generic_pg_test
Date: Thu, 09 Jun 2011 14:43:48 -0400 [thread overview]
Message-ID: <4DF11464.60802@panasas.com> (raw)
In-Reply-To: <1307637069.20245.8.camel@lade.trondhjem.org>
On 2011-06-09 12:31, Trond Myklebust wrote:
> On Tue, 2011-06-07 at 22:24 -0400, Benny Halevy wrote:
>> On 2011-06-07 21:12, Trond Myklebust wrote:
>>> On Tue, 2011-06-07 at 20:53 -0400, Benny Halevy wrote:
>>>> On 2011-06-06 18:32, Trond Myklebust wrote:
>>>>> 1. If the intention is to coalesce requests 'prev' and 'req' then we
>>>>> have to ensure at least that we have a layout starting at
>>>>> req_offset(prev).
>>>>>
>>>>> 2. If we're only requesting a minimal layout of length desc->pg_count,
>>>>> we need to test the length actually returned by the server before
>>>>> we allow the coalescing to occur.
>>>>>
>>>>> 3. We need to deal correctly with (pgio->lseg == NULL)
>>>>>
>>>>> 4. Fixup the test guarding the pnfs_update_layout.
>>>>>
>>>>> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
>>>>> ---
>>>>> fs/nfs/objlayout/objio_osd.c | 3 +++
>>>>> fs/nfs/pnfs.c | 12 +++++++-----
>>>>> 2 files changed, 10 insertions(+), 5 deletions(-)
>>>>>
>>>>> diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
>>>>> index 9cf208d..4c41a60 100644
>>>>> --- a/fs/nfs/objlayout/objio_osd.c
>>>>> +++ b/fs/nfs/objlayout/objio_osd.c
>>>>> @@ -1001,6 +1001,9 @@ static bool objio_pg_test(struct nfs_pageio_descriptor *pgio,
>>>>> if (!pnfs_generic_pg_test(pgio, prev, req))
>>>>> return false;
>>>>>
>>>>> + if (pgio->pg_lseg == NULL)
>>>>> + return true;
>>>>> +
>>>>> return pgio->pg_count + req->wb_bytes <=
>>>>> OBJIO_LSEG(pgio->pg_lseg)->max_io_size;
>>>>> }
>>>>> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
>>>>> index 8c1309d..12b53ef 100644
>>>>> --- a/fs/nfs/pnfs.c
>>>>> +++ b/fs/nfs/pnfs.c
>>>>> @@ -1059,19 +1059,21 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
>>>>> gfp_flags = GFP_NOFS;
>>>>> }
>>>>>
>>>>> - if (pgio->pg_count == prev->wb_bytes) {
>>>>> + if (pgio->pg_lseg == NULL) {
>>>>> + if (pgio->pg_count != prev->wb_bytes)
>>>>> + return true;
>>>>> /* This is first coelesce call for a series of nfs_pages */
>>>>> pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
>>>>> prev->wb_context,
>>>>> - req_offset(req),
>>>>> + req_offset(prev),
>>>>> pgio->pg_count,
>>>>> access_type,
>>>>> gfp_flags);
>>>>> - return true;
>>>>> + if (pgio->pg_lseg == NULL)
>>>>> + return true;
>>>>> }
>>>>>
>>>>> - if (pgio->pg_lseg &&
>>>>> - req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset,
>>>>> + if (req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset,
>>>>
>>>> One more issue to fix: the condition should be for ">=", not ">"
>>>
>>> Hmm.... Shouldn't it rather be:
>>>
>>> if (end_offset(req_offset(req), req->wb_bytes) > end_offset(pgio->pg_lseg->pls_range.offset,
>>> pgio->pg_lseg->pls_range.length))
>>> return false;
>>>
>>> Otherwise you don't know if the entire request fits in this layout
>>> segment...
>>
>> True.
>> Though since we make sure the layout segments are page aligned
>> having the first offset covered is enough, this is the correct
>> way to express the condition.
>
> Ugh... That definitely would require a comment, and probably deserves a
> helper function of its own.
>
Agreed. I'm totally with you on your proposal.
> Also, the name 'end_offset()' is rather confusing. It really is the
> offset of the first byte that lies _outside_ the actual layout segment.
>
Correct. I do not mind changing it to a better name if you have something
in mind.
Benny
prev parent reply other threads:[~2011-06-09 18:44 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-06 22:32 [PATCH 1/3] NFSv4.1: Fix some issues with pnfs_generic_pg_test Trond Myklebust
2011-06-06 22:32 ` [PATCH 2/3] NFS: Cleanup of the nfs_pageio code in preparation for a pnfs bugfix Trond Myklebust
2011-06-06 22:32 ` [PATCH 3/3] NFSv4.1: Add an initialisation callback for pNFS Trond Myklebust
2011-06-08 0:28 ` [PATCH 2/3] NFS: Cleanup of the nfs_pageio code in preparation for a pnfs bugfix Benny Halevy
2011-06-08 0:51 ` Trond Myklebust
2011-06-08 2:30 ` Benny Halevy
2011-06-09 16:37 ` Trond Myklebust
2011-06-09 17:51 ` Boaz Harrosh
2011-06-09 18:13 ` Trond Myklebust
2011-06-09 18:58 ` Benny Halevy
2011-06-09 21:31 ` Boaz Harrosh
2011-06-08 0:53 ` [PATCH 1/3] NFSv4.1: Fix some issues with pnfs_generic_pg_test Benny Halevy
2011-06-08 1:12 ` Trond Myklebust
2011-06-08 2:24 ` Benny Halevy
2011-06-09 16:31 ` Trond Myklebust
2011-06-09 18:43 ` Benny Halevy [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=4DF11464.60802@panasas.com \
--to=bhalevy@panasas.com \
--cc=Trond.Myklebust@netapp.com \
--cc=linux-nfs@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox