linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Benny Halevy <bhalevy@panasas.com>
To: Fred Isaman <iisaman@netapp.com>
Cc: andros@netapp.com, trond.myklebust@netapp.com,
	linux-nfs@vger.kernel.org, Andy Adamon <andros@citi.umich.edu>,
	Dean Hildebrand <dhildeb@us.ibm.com>,
	Fred Isaman <iisaman@citi.umich.edu>,
	Boaz Harrosh <bharrosh@panasas.com>,
	Oleg Drokin <green@linuxhacker.ru>
Subject: Re: [PATCH pNFS wave 3 Version 2 10/18] NFSv4.1: shift pnfs_update_layout locations
Date: Wed, 16 Feb 2011 15:08:56 -0500	[thread overview]
Message-ID: <4D5C2ED8.1030200@panasas.com> (raw)
In-Reply-To: <3CAD00F0-0B5E-4A70-B3AA-265E75100DD6@netapp.com>

On 2011-02-16 14:55, Fred Isaman wrote:
> 
> On Feb 16, 2011, at 2:42 PM, Benny Halevy wrote:
> 
>> On 2011-02-15 03:38, andros@netapp.com wrote:
>>> From: Fred Isaman <iisaman@netapp.com>
>>>
>>> Move the pnfs_update_layout call location to nfs_pageio_do_add_request().
>>> Grab the lseg sent in the doio function to nfs_read_rpcsetup and attach
>>> it to each nfs_read_data so it can be sent to the layout driver.
>>>
>>> @@ -131,10 +132,12 @@ int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
>>> 		zero_user_segment(page, len, PAGE_CACHE_SIZE);
>>>
>>> 	nfs_list_add_request(new, &one_request);
>>> +	lseg = pnfs_update_layout(inode, ctx, IOMODE_READ);
>>> 	if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE)
>>> -		nfs_pagein_multi(inode, &one_request, 1, len, 0);
>>> +		nfs_pagein_multi(inode, &one_request, 1, len, 0, lseg);
>>> 	else
>>> -		nfs_pagein_one(inode, &one_request, 1, len, 0);
>>> +		nfs_pagein_one(inode, &one_request, 1, len, 0, lseg);
>>> +	put_lseg(lseg);
>>> 	return 0;
>>> }
>>>
>>> @@ -160,7 +163,8 @@ static void nfs_readpage_release(struct nfs_page *req)
>>>  */
>>> static int nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
>>> 		const struct rpc_call_ops *call_ops,
>>> -		unsigned int count, unsigned int offset)
>>> +		unsigned int count, unsigned int offset,
>>> +		struct pnfs_layout_segment *lseg)
>>> {
>>> 	struct inode *inode = req->wb_context->path.dentry->d_inode;
>>> 	int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0;
>>> @@ -183,6 +187,7 @@ static int nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
>>> 	data->req	  = req;
>>> 	data->inode	  = inode;
>>> 	data->cred	  = msg.rpc_cred;
>>> +	data->lseg	  = get_lseg(lseg);
>>>
>>> 	data->args.fh     = NFS_FH(inode);
>>> 	data->args.offset = req_offset(req) + offset;
>>> @@ -240,7 +245,7 @@ nfs_async_read_error(struct list_head *head)
>>>  * won't see the new data until our attribute cache is updated.  This is more
>>>  * or less conventional NFS client behavior.
>>>  */
>>> -static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags)
>>> +static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags, struct pnfs_layout_segment *lseg)
>>> {
>>> 	struct nfs_page *req = nfs_list_entry(head->next);
>>> 	struct page *page = req->wb_page;
>>> @@ -266,6 +271,8 @@ static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigne
>>> 	} while(nbytes != 0);
>>> 	atomic_set(&req->wb_complete, requests);
>>>
>>> +	/* We know lseg==NULL */

Can you provide more details?
If it's always NULL why bother to pass it in?

>>> +	lseg = pnfs_update_layout(inode, req->wb_context, IOMODE_READ);
>>> 	ClearPageError(page);
>>> 	offset = 0;
>>> 	nbytes = count;
>>> @@ -280,12 +287,13 @@ static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigne
>>> 		if (nbytes < rsize)
>>> 			rsize = nbytes;
>>> 		ret2 = nfs_read_rpcsetup(req, data, &nfs_read_partial_ops,
>>> -				  rsize, offset);
>>> +					 rsize, offset, lseg);
>>> 		if (ret == 0)
>>> 			ret = ret2;
>>> 		offset += rsize;
>>> 		nbytes -= rsize;
>>> 	} while (nbytes != 0);
>>> +	put_lseg(lseg);
>>>
>>> 	return ret;
>>>
>>> @@ -300,7 +308,7 @@ out_bad:
>>> 	return -ENOMEM;
>>> }
>>>
>>> -static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags)
>>> +static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags, struct pnfs_layout_segment *lseg)
>>> {
>>> 	struct nfs_page		*req;
>>> 	struct page		**pages;
>>> @@ -320,9 +328,14 @@ static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned
>>> 		*pages++ = req->wb_page;
>>> 	}
>>> 	req = nfs_list_entry(data->pages.next);
>>> +	if ((!lseg) && list_is_singular(&data->pages))
>>> +		lseg = pnfs_update_layout(inode, req->wb_context, IOMODE_READ);

When is lseg NULL and why getting it here works better than in nfs_readpage_async?

>>>
>>> -	return nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0);
>>> +	ret = nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0, lseg);
>>> +	put_lseg(lseg);
>>
>> Shouldn't that be done only if pnfs_update_layout was called here?
>> Otherwise, the caller, nfs_readpage_async puts the lseg it passes down.
>>
> 
> You are right there is a problem.  But it needs to be fixed by removing the put_lseg from nfs_readpage_async.
> 
> 

If we can avoid getting the lseg in one place and putting it in another that would be better.

Benny

>>> +	return ret;
>>> out_bad:
>>> +	put_lseg(lseg);
>>
>> I'd unify the common exit path by doing nfs_async_read_error on the error path
>> and then goto out for the common code.
>>
> 
> OK.
> 
> Fred
> 

  reply	other threads:[~2011-02-16 20:08 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-15  8:38 [PATCH 0/18] pNFS wave 3 submission Version 2 andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 01/18] NFSv4: remove CONFIG_NFS_V4 from nfs_read_data andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 02/18] NFSv4.1: put_layout_hdr can remove nfsi->layout andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 03/18] NFS move nfs_client initialization into nfs_get_client andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 04/18] NFSv4.1: send zero stateid seqid on v4.1 i/o andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 05/18] NFSv4.1: new flag for state renewal check andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 06/18] NFSv4.1: new flag for lease time check andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 07/18] NFSv4.1: add MDS mount DS only check andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 08/18] NFSv4.1: lseg refcounting andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 09/18] NFSv4.1: coelesce across layout stripes andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 10/18] NFSv4.1: shift pnfs_update_layout locations andros
2011-02-16 19:42   ` Benny Halevy
2011-02-16 19:55     ` Fred Isaman
2011-02-16 20:08       ` Benny Halevy [this message]
2011-02-16 21:09         ` Fred Isaman
2011-02-16 22:56           ` Fred Isaman
2011-02-17  8:15             ` Christoph Hellwig
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 11/18] NFSv4.1: generic read andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 12/18] NFSv4.1: data server connection andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 13/18] NFSv4.1: filelayout i/o helpers andros
2011-02-15  8:38 ` [PATCH pNFS wave 3 Version 2 14/18] NFSv4.1: filelayout read andros
2011-02-15  8:39 ` [PATCH pNFS wave 3 Version 2 15/18] NFSv4.1: filelayout async error handler andros
2011-02-16 19:57   ` Benny Halevy
2011-02-15  8:39 ` [PATCH pNFS wave 3 Version 2 16/18] NFSv4.1 move deviceid cache to filelayout driver andros
2011-02-16 18:48   ` Andy Adamson
2011-02-15  8:39 ` [PATCH pNFS wave 3 Version 2 17/18] NFSv4.1: turn off pNFS on ds connection failure andros
2011-02-15  8:39 ` [PATCH pNFS wave 3 Version 2 18/18] NFSv4.1: lseg documentation andros
2011-02-16 18:49   ` Andy Adamson

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=4D5C2ED8.1030200@panasas.com \
    --to=bhalevy@panasas.com \
    --cc=andros@citi.umich.edu \
    --cc=andros@netapp.com \
    --cc=bharrosh@panasas.com \
    --cc=dhildeb@us.ibm.com \
    --cc=green@linuxhacker.ru \
    --cc=iisaman@citi.umich.edu \
    --cc=iisaman@netapp.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trond.myklebust@netapp.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).