[pnfs] [PATCH 13/14] pnfs: pnfs_modify_new_request

Fredric Isaman iisaman at citi.umich.edu
Wed Apr 2 09:44:08 EDT 2008



On Mon, 31 Mar 2008, Dean Hildebrand wrote:

>
>
> Fred Isaman wrote:
>> Add hook into nfs_page initialization to allow for setup of wb_private,
>> and any other nfs_page fields that need twiddling.
>> 
> It seems we have a general concept with fsdata (assume a boolean) storing 
> whether or not the write request will use pnfs or not.  If so, we don't need 
> to have a new interface op, 'new_request'.  Let's just have the general code 
> check to see if fsdata == true (using pnfs) and then set PG_USE_PNFS in the 
> nfs_page.wb_flags.  Essentially, I think your bl_new_request is general 
> enough to move into pnfs_modify_new_request.
>
> Dean
>

Note it is not the case that fsdata stores a boolean, it actually stores a 
tri-state value, corresponding to:
1. READ
2. WRITE, so far ok to use pnfs
3. WRITE, must not use pnfs

I've no complaint about moving bl_new_request into 
pnfs_modify_new_request, but I want to make sure everyone understands the 
subtleties.  This would also require moving PG_USE_PNFS out of the 
block-specific code, which again is reasonable to me, especially if others 
can find use for it.

 	Fred

>> Signed-off-by: Fred Isaman <iisaman at citi.umich.edu>
>> ---
>>  fs/nfs/pagelist.c         |    1 +
>>  fs/nfs/pnfs.c             |   15 +++++++++++++++
>>  fs/nfs/pnfs.h             |   18 ++++++++++++++++++
>>  include/linux/nfs4_pnfs.h |    4 ++++
>>  4 files changed, 38 insertions(+), 0 deletions(-)
>> 
>> diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
>> index cfd3652..f365f7b 100644
>> --- a/fs/nfs/pagelist.c
>> +++ b/fs/nfs/pagelist.c
>> @@ -88,6 +88,7 @@ nfs_create_request(struct nfs_open_context *ctx, struct 
>> inode *inode,
>>  	req->wb_bytes   = count;
>>  	req->wb_context = get_nfs_open_context(ctx);
>>  	kref_init(&req->wb_kref);
>> +	pnfs_modify_new_request(inode, req, fsdata);
>>  	return req;
>>  }
>>  diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
>> index 9025132..2774a6d 100644
>> --- a/fs/nfs/pnfs.c
>> +++ b/fs/nfs/pnfs.c
>> @@ -1932,6 +1932,21 @@ out_unlock:
>>  	goto out;
>>  }
>>  +void _pnfs_modify_new_request(struct nfs_server *nfss, struct inode 
>> *inode,
>> +			      struct nfs_page *req, struct pnfs_fsdata 
>> *fsdata)
>> +{
>> +	struct pnfs_layout_segment *lseg = NULL;
>> +	loff_t pos;
>> +	unsigned count;
>> +
>> +	pos = ((loff_t)req->wb_index << PAGE_CACHE_SHIFT) + req->wb_offset;
>> +	count = req->wb_bytes;
>> +	lseg = pnfs_find_get_lseg(inode, pos, count, IOMODE_RW);
>> +	nfss->pnfs_curr_ld->ld_io_ops->new_request(lseg, req, pos, count,
>> +						   fsdata);
>> +	put_lseg(lseg);
>> +}
>> +
>>  void pnfs_free_request_data(struct nfs_page *req)
>>  {
>>  	struct layoutdriver_io_operations *lo;
>> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
>> index 44d9f35..5948be4 100644
>> --- a/fs/nfs/pnfs.h
>> +++ b/fs/nfs/pnfs.h
>> @@ -58,6 +58,8 @@ int _pnfs_write_begin(struct inode *inode, struct 
>> nfs_server *nfss,
>>  		      unsigned flags, struct pnfs_fsdata **fsdata);
>>  int _pnfs_do_flush(struct inode *inode, struct nfs_server *nfss,
>>  		   struct nfs_page *req, struct pnfs_fsdata *fsdata);
>> +void _pnfs_modify_new_request(struct nfs_server *nfss, struct inode 
>> *inode,
>> +			      struct nfs_page *req, struct pnfs_fsdata 
>> *fsdata);
>>   #define PNFS_EXISTS_LDIO_OP(opname) (nfss->pnfs_curr_ld && \
>>  				     nfss->pnfs_curr_ld->ld_io_ops && \
>> @@ -96,6 +98,16 @@ static inline void pnfs_write_end_cleanup(void *fsdata)
>>  {
>>  	pnfs_free_fsdata(fsdata);
>>  }
>> +
>> +static inline void pnfs_modify_new_request(struct inode *inode,
>> +					   struct nfs_page *req,
>> +					   void *fsdata)
>> +{
>> +	struct nfs_server *nfss = NFS_SERVER(inode);
>> +	if (PNFS_EXISTS_LDIO_OP(new_request))
>> +		_pnfs_modify_new_request(nfss, inode, req, fsdata);
>> +}
>> +
>>  #else /* CONFIG_PNFS */
>>   static inline int pnfs_do_flush(struct nfs_page *req, void *fsdata)
>> @@ -114,6 +126,12 @@ static inline void pnfs_write_end_cleanup(void 
>> *fsdata)
>>  {
>>  }
>>  +static inline void pnfs_modify_new_request(struct inode *inode,
>> +					   struct nfs_page *req,
>> +					   void *fsdata)
>> +{
>> +}
>> +
>>  #endif /* CONFIG_PNFS */
>>   #endif /* FS_NFS_PNFS_H */
>> diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
>> index f711df2..ea1d308 100644
>> --- a/include/linux/nfs4_pnfs.h
>> +++ b/include/linux/nfs4_pnfs.h
>> @@ -142,6 +142,10 @@ struct layoutdriver_io_operations {
>>  	int (*write_begin) (struct pnfs_layout_segment *lseg, struct page 
>> *page,
>>  			    loff_t pos, unsigned count,
>>  			    struct pnfs_fsdata **fsdata);
>> +	/* Hook into nfs_create_request, for setting wb_private */
>> +	void (*new_request)(struct pnfs_layout_segment *lseg,
>> +			    struct nfs_page *req, loff_t pos, unsigned count,
>> +			    struct pnfs_fsdata *fsdata);
>>  	void (*free_request_data) (struct nfs_page *);
>>  	void (*free_fsdata) (struct pnfs_fsdata *data);
>>


More information about the pNFS mailing list