diff options
Diffstat (limited to 'fs/nfs/objlayout')
| -rw-r--r-- | fs/nfs/objlayout/objio_osd.c | 24 | ||||
| -rw-r--r-- | fs/nfs/objlayout/objlayout.c | 24 | ||||
| -rw-r--r-- | fs/nfs/objlayout/objlayout.h | 8 | 
3 files changed, 32 insertions, 24 deletions
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c index 5457745dd4f..611320753db 100644 --- a/fs/nfs/objlayout/objio_osd.c +++ b/fs/nfs/objlayout/objio_osd.c @@ -439,7 +439,7 @@ static void _read_done(struct ore_io_state *ios, void *private)  	objlayout_read_done(&objios->oir, status, objios->sync);  } -int objio_read_pagelist(struct nfs_read_data *rdata) +int objio_read_pagelist(struct nfs_pgio_data *rdata)  {  	struct nfs_pgio_header *hdr = rdata->header;  	struct objio_state *objios; @@ -487,7 +487,7 @@ static void _write_done(struct ore_io_state *ios, void *private)  static struct page *__r4w_get_page(void *priv, u64 offset, bool *uptodate)  {  	struct objio_state *objios = priv; -	struct nfs_write_data *wdata = objios->oir.rpcdata; +	struct nfs_pgio_data *wdata = objios->oir.rpcdata;  	struct address_space *mapping = wdata->header->inode->i_mapping;  	pgoff_t index = offset / PAGE_SIZE;  	struct page *page; @@ -531,7 +531,7 @@ static const struct _ore_r4w_op _r4w_op = {  	.put_page = &__r4w_put_page,  }; -int objio_write_pagelist(struct nfs_write_data *wdata, int how) +int objio_write_pagelist(struct nfs_pgio_data *wdata, int how)  {  	struct nfs_pgio_header *hdr = wdata->header;  	struct objio_state *objios; @@ -564,14 +564,22 @@ int objio_write_pagelist(struct nfs_write_data *wdata, int how)  	return 0;  } -static bool objio_pg_test(struct nfs_pageio_descriptor *pgio, +/* + * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number + * of bytes (maximum @req->wb_bytes) that can be coalesced. + */ +static size_t objio_pg_test(struct nfs_pageio_descriptor *pgio,  			  struct nfs_page *prev, struct nfs_page *req)  { -	if (!pnfs_generic_pg_test(pgio, prev, req)) -		return false; +	unsigned int size; + +	size = pnfs_generic_pg_test(pgio, prev, req); + +	if (!size || pgio->pg_count + req->wb_bytes > +	    (unsigned long)pgio->pg_layout_private) +		return 0; -	return pgio->pg_count + req->wb_bytes <= -			(unsigned long)pgio->pg_layout_private; +	return min(size, req->wb_bytes);  }  static void objio_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) diff --git a/fs/nfs/objlayout/objlayout.c b/fs/nfs/objlayout/objlayout.c index e4f9cbfec67..765d3f54e98 100644 --- a/fs/nfs/objlayout/objlayout.c +++ b/fs/nfs/objlayout/objlayout.c @@ -53,10 +53,10 @@ objlayout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)  	struct objlayout *objlay;  	objlay = kzalloc(sizeof(struct objlayout), gfp_flags); -	if (objlay) { -		spin_lock_init(&objlay->lock); -		INIT_LIST_HEAD(&objlay->err_list); -	} +	if (!objlay) +		return NULL; +	spin_lock_init(&objlay->lock); +	INIT_LIST_HEAD(&objlay->err_list);  	dprintk("%s: Return %p\n", __func__, objlay);  	return &objlay->pnfs_layout;  } @@ -229,11 +229,11 @@ objlayout_io_set_result(struct objlayout_io_res *oir, unsigned index,  static void _rpc_read_complete(struct work_struct *work)  {  	struct rpc_task *task; -	struct nfs_read_data *rdata; +	struct nfs_pgio_data *rdata;  	dprintk("%s enter\n", __func__);  	task = container_of(work, struct rpc_task, u.tk_work); -	rdata = container_of(task, struct nfs_read_data, task); +	rdata = container_of(task, struct nfs_pgio_data, task);  	pnfs_ld_read_done(rdata);  } @@ -241,7 +241,7 @@ static void _rpc_read_complete(struct work_struct *work)  void  objlayout_read_done(struct objlayout_io_res *oir, ssize_t status, bool sync)  { -	struct nfs_read_data *rdata = oir->rpcdata; +	struct nfs_pgio_data *rdata = oir->rpcdata;  	oir->status = rdata->task.tk_status = status;  	if (status >= 0) @@ -266,7 +266,7 @@ objlayout_read_done(struct objlayout_io_res *oir, ssize_t status, bool sync)   * Perform sync or async reads.   */  enum pnfs_try_status -objlayout_read_pagelist(struct nfs_read_data *rdata) +objlayout_read_pagelist(struct nfs_pgio_data *rdata)  {  	struct nfs_pgio_header *hdr = rdata->header;  	struct inode *inode = hdr->inode; @@ -312,11 +312,11 @@ objlayout_read_pagelist(struct nfs_read_data *rdata)  static void _rpc_write_complete(struct work_struct *work)  {  	struct rpc_task *task; -	struct nfs_write_data *wdata; +	struct nfs_pgio_data *wdata;  	dprintk("%s enter\n", __func__);  	task = container_of(work, struct rpc_task, u.tk_work); -	wdata = container_of(task, struct nfs_write_data, task); +	wdata = container_of(task, struct nfs_pgio_data, task);  	pnfs_ld_write_done(wdata);  } @@ -324,7 +324,7 @@ static void _rpc_write_complete(struct work_struct *work)  void  objlayout_write_done(struct objlayout_io_res *oir, ssize_t status, bool sync)  { -	struct nfs_write_data *wdata = oir->rpcdata; +	struct nfs_pgio_data *wdata = oir->rpcdata;  	oir->status = wdata->task.tk_status = status;  	if (status >= 0) { @@ -351,7 +351,7 @@ objlayout_write_done(struct objlayout_io_res *oir, ssize_t status, bool sync)   * Perform sync or async writes.   */  enum pnfs_try_status -objlayout_write_pagelist(struct nfs_write_data *wdata, +objlayout_write_pagelist(struct nfs_pgio_data *wdata,  			 int how)  {  	struct nfs_pgio_header *hdr = wdata->header; diff --git a/fs/nfs/objlayout/objlayout.h b/fs/nfs/objlayout/objlayout.h index 87aa1dec612..01e041029a6 100644 --- a/fs/nfs/objlayout/objlayout.h +++ b/fs/nfs/objlayout/objlayout.h @@ -119,8 +119,8 @@ extern void objio_free_lseg(struct pnfs_layout_segment *lseg);   */  extern void objio_free_result(struct objlayout_io_res *oir); -extern int objio_read_pagelist(struct nfs_read_data *rdata); -extern int objio_write_pagelist(struct nfs_write_data *wdata, int how); +extern int objio_read_pagelist(struct nfs_pgio_data *rdata); +extern int objio_write_pagelist(struct nfs_pgio_data *wdata, int how);  /*   * callback API @@ -168,10 +168,10 @@ extern struct pnfs_layout_segment *objlayout_alloc_lseg(  extern void objlayout_free_lseg(struct pnfs_layout_segment *);  extern enum pnfs_try_status objlayout_read_pagelist( -	struct nfs_read_data *); +	struct nfs_pgio_data *);  extern enum pnfs_try_status objlayout_write_pagelist( -	struct nfs_write_data *, +	struct nfs_pgio_data *,  	int how);  extern void objlayout_encode_layoutcommit(  | 
