diff options
| author | Tony Lindgren <tony@atomide.com> | 2012-11-09 14:58:01 -0800 | 
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2012-11-09 14:58:01 -0800 | 
| commit | edf8dde393f879fc2d8c22d4bc01ff8d37b80e1a (patch) | |
| tree | 61425adc8b2059a9c12a3ce66ba7361fea1b0bb3 /fs/nfs/nfs4filelayout.c | |
| parent | 6ba54ab4a49bbad736b0254aa6bdf0cb83013815 (diff) | |
| parent | 3d70f8c617a436c7146ecb81df2265b4626dfe89 (diff) | |
| download | olio-linux-3.10-edf8dde393f879fc2d8c22d4bc01ff8d37b80e1a.tar.xz olio-linux-3.10-edf8dde393f879fc2d8c22d4bc01ff8d37b80e1a.zip  | |
Merge branch 'linus' into omap-for-v3.8/cleanup-headers-prepare-multiplatform-v3
Diffstat (limited to 'fs/nfs/nfs4filelayout.c')
| -rw-r--r-- | fs/nfs/nfs4filelayout.c | 21 | 
1 files changed, 16 insertions, 5 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 52d84721206..2e45fd9c02a 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c @@ -122,12 +122,21 @@ static void filelayout_reset_read(struct nfs_read_data *data)  	}  } +static void filelayout_fenceme(struct inode *inode, struct pnfs_layout_hdr *lo) +{ +	if (!test_and_clear_bit(NFS_LAYOUT_RETURN, &lo->plh_flags)) +		return; +	clear_bit(NFS_INO_LAYOUTCOMMIT, &NFS_I(inode)->flags); +	pnfs_return_layout(inode); +} +  static int filelayout_async_handle_error(struct rpc_task *task,  					 struct nfs4_state *state,  					 struct nfs_client *clp,  					 struct pnfs_layout_segment *lseg)  { -	struct inode *inode = lseg->pls_layout->plh_inode; +	struct pnfs_layout_hdr *lo = lseg->pls_layout; +	struct inode *inode = lo->plh_inode;  	struct nfs_server *mds_server = NFS_SERVER(inode);  	struct nfs4_deviceid_node *devid = FILELAYOUT_DEVID_NODE(lseg);  	struct nfs_client *mds_client = mds_server->nfs_client; @@ -204,10 +213,8 @@ static int filelayout_async_handle_error(struct rpc_task *task,  		dprintk("%s DS connection error %d\n", __func__,  			task->tk_status);  		nfs4_mark_deviceid_unavailable(devid); -		clear_bit(NFS_INO_LAYOUTCOMMIT, &NFS_I(inode)->flags); -		_pnfs_return_layout(inode); +		set_bit(NFS_LAYOUT_RETURN, &lo->plh_flags);  		rpc_wake_up(&tbl->slot_tbl_waitq); -		nfs4_ds_disconnect(clp);  		/* fall through */  	default:  reset: @@ -331,7 +338,9 @@ static void filelayout_read_count_stats(struct rpc_task *task, void *data)  static void filelayout_read_release(void *data)  {  	struct nfs_read_data *rdata = data; +	struct pnfs_layout_hdr *lo = rdata->header->lseg->pls_layout; +	filelayout_fenceme(lo->plh_inode, lo);  	nfs_put_client(rdata->ds_clp);  	rdata->header->mds_ops->rpc_release(data);  } @@ -429,7 +438,9 @@ static void filelayout_write_count_stats(struct rpc_task *task, void *data)  static void filelayout_write_release(void *data)  {  	struct nfs_write_data *wdata = data; +	struct pnfs_layout_hdr *lo = wdata->header->lseg->pls_layout; +	filelayout_fenceme(lo->plh_inode, lo);  	nfs_put_client(wdata->ds_clp);  	wdata->header->mds_ops->rpc_release(data);  } @@ -739,7 +750,7 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo,  		goto out_err;  	if (fl->num_fh > 0) { -		fl->fh_array = kzalloc(fl->num_fh * sizeof(struct nfs_fh *), +		fl->fh_array = kcalloc(fl->num_fh, sizeof(fl->fh_array[0]),  				       gfp_flags);  		if (!fl->fh_array)  			goto out_err;  |