[pnfs] [PATCH 02/25] pnfs: fix pnfs4_*_done routines

Fredric Isaman iisaman at citi.umich.edu
Fri Feb 15 12:00:18 EST 2008



On Fri, 15 Feb 2008, Benny Halevy wrote:

> On Feb. 14, 2008, 20:21 +0200, Fred Isaman <iisaman at citi.umich.edu> wrote:
>> The pnfs4_*_done routines are ignoring the possibility that the code
>> fell back to nfs.  This patch chops out layoutcommit setup that is done
>> there (incorrectly in the fallback case) which is already done by
>> pnfs_writepages anyway.
>
> Well, in the async case it is done in pnfs_writeback_done, but
> only for pnfs_get_type(data->inode) != LAYOUT_NFSV4_FILES.
> IIRC, last time I looked into this, I came to the conclusion
> that the call to pnfs_update_last_write in pnfs4_write_done
> is for the file layout rpc (via MDS) path.
>

Actually, I was alooking at the call near the end of pnfs_writepages.
I hadn't noticed it was also (conditionally) called during writeback_done.


> Have you tested this patchset with over the file layout and made
> sure layoutcommit is generated correctly after write?
>

No, since patch 01 was guaranteed to break file layout.

> Benny
>
>>
>> TO CHECK: pnfs4_read_done does not do a nfs_invalidate_atime that
>> nfs4_read_done does.  Does it need to be done in the fallback case?
>> In that case, do we need to add a flag to data->pnfsflags?
>>
>> Signed-off-by: Fred Isaman <iisaman at citi.umich.edu>
>> ---
>>  fs/nfs/nfs4proc.c |   22 +++++++++-------------
>>  1 files changed, 9 insertions(+), 13 deletions(-)
>>
>> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
>> index eaaaeed..87c7451 100644
>> --- a/fs/nfs/nfs4proc.c
>> +++ b/fs/nfs/nfs4proc.c
>> @@ -3039,6 +3039,10 @@ static int pnfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
>>  		return -EAGAIN;
>>  	}
>>
>> +	/* FRED - if we fell back to nfs, do we need to call
>> +	 * nfs_invalidate_atime(data->inode) ?
>> +	 */
>> +
>>  	/* Only renew lease if this was a read call to MDS */
>>  	if (task->tk_status > 0 && !data->ds_nfs_client)
>>  		renew_lease(mds_svr, data->timestamp);
>> @@ -3083,15 +3087,10 @@ static int pnfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
>>  	 * MDS write: renew lease
>>  	 * DS write: update lastbyte written
>>  	 */
>> -	if (task->tk_status > 0) {
>> -		if (!data->ds_nfs_client) {
>> -			nfs_post_op_update_inode_force_wcc(data->inode,
>> -							data->res.fattr);
>> -			renew_lease(mds_svr, data->timestamp);
>> -		} else
>> -			pnfs_update_last_write(NFS_I(data->inode),
>> -					       data->args.offset,
>> -					       data->res.count);
>> +	if (task->tk_status > 0 && !data->ds_nfs_client) {
>> +		nfs_post_op_update_inode_force_wcc(data->inode,
>> +						   data->res.fattr);
>> +		renew_lease(mds_svr, data->timestamp);
>>  	}
>>  	return 0;
>>  }
>> @@ -3125,13 +3124,10 @@ static int pnfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
>>  		return -EAGAIN;
>>  	}
>>
>> -	if (task->tk_status >= 0) {
>> +	if (task->tk_status >= 0 && !data->ds_nfs_client) {
>>  		/* Update inode if commit to MDS */
>>  		if (!data->ds_nfs_client)
>>  			nfs_refresh_inode(data->inode, data->res.fattr);
>> -
>> -		/* Mark for LAYOUTCOMMIT */
>> -		pnfs_need_layoutcommit(NFS_I(data->inode), data->args.context);
>
> This might actually need to move to pnfs4_write_done after the call to
> pnfs_update_last_write if it's indeed needed for the file layout type.
>
>>  	}
>>  	dprintk("<-- %s\n", __func__);
>>  	return 0;
>
>


More information about the pNFS mailing list