diff options
Diffstat (limited to 'fs/nfs/nfs4filelayout.c')
| -rw-r--r-- | fs/nfs/nfs4filelayout.c | 27 | 
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 6f8192f4cfc..be79dc9f386 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c @@ -117,6 +117,8 @@ static int filelayout_async_handle_error(struct rpc_task *task,  	case -EKEYEXPIRED:  		rpc_delay(task, FILELAYOUT_POLL_RETRY_MAX);  		break; +	case -NFS4ERR_RETRY_UNCACHED_REP: +		break;  	default:  		dprintk("%s DS error. Retry through MDS %d\n", __func__,  			task->tk_status); @@ -416,7 +418,8 @@ static int  filelayout_check_layout(struct pnfs_layout_hdr *lo,  			struct nfs4_filelayout_segment *fl,  			struct nfs4_layoutget_res *lgr, -			struct nfs4_deviceid *id) +			struct nfs4_deviceid *id, +			gfp_t gfp_flags)  {  	struct nfs4_file_layout_dsaddr *dsaddr;  	int status = -EINVAL; @@ -439,7 +442,7 @@ filelayout_check_layout(struct pnfs_layout_hdr *lo,  	/* find and reference the deviceid */  	dsaddr = nfs4_fl_find_get_deviceid(id);  	if (dsaddr == NULL) { -		dsaddr = get_device_info(lo->plh_inode, id); +		dsaddr = get_device_info(lo->plh_inode, id, gfp_flags);  		if (dsaddr == NULL)  			goto out;  	} @@ -500,7 +503,8 @@ static int  filelayout_decode_layout(struct pnfs_layout_hdr *flo,  			 struct nfs4_filelayout_segment *fl,  			 struct nfs4_layoutget_res *lgr, -			 struct nfs4_deviceid *id) +			 struct nfs4_deviceid *id, +			 gfp_t gfp_flags)  {  	struct xdr_stream stream;  	struct xdr_buf buf = { @@ -516,7 +520,7 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo,  	dprintk("%s: set_layout_map Begin\n", __func__); -	scratch = alloc_page(GFP_KERNEL); +	scratch = alloc_page(gfp_flags);  	if (!scratch)  		return -ENOMEM; @@ -554,13 +558,13 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo,  		goto out_err;  	fl->fh_array = kzalloc(fl->num_fh * sizeof(struct nfs_fh *), -			       GFP_KERNEL); +			       gfp_flags);  	if (!fl->fh_array)  		goto out_err;  	for (i = 0; i < fl->num_fh; i++) {  		/* Do we want to use a mempool here? */ -		fl->fh_array[i] = kmalloc(sizeof(struct nfs_fh), GFP_KERNEL); +		fl->fh_array[i] = kmalloc(sizeof(struct nfs_fh), gfp_flags);  		if (!fl->fh_array[i])  			goto out_err_free; @@ -605,19 +609,20 @@ filelayout_free_lseg(struct pnfs_layout_segment *lseg)  static struct pnfs_layout_segment *  filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid, -		      struct nfs4_layoutget_res *lgr) +		      struct nfs4_layoutget_res *lgr, +		      gfp_t gfp_flags)  {  	struct nfs4_filelayout_segment *fl;  	int rc;  	struct nfs4_deviceid id;  	dprintk("--> %s\n", __func__); -	fl = kzalloc(sizeof(*fl), GFP_KERNEL); +	fl = kzalloc(sizeof(*fl), gfp_flags);  	if (!fl)  		return NULL; -	rc = filelayout_decode_layout(layoutid, fl, lgr, &id); -	if (rc != 0 || filelayout_check_layout(layoutid, fl, lgr, &id)) { +	rc = filelayout_decode_layout(layoutid, fl, lgr, &id, gfp_flags); +	if (rc != 0 || filelayout_check_layout(layoutid, fl, lgr, &id, gfp_flags)) {  		_filelayout_free_lseg(fl);  		return NULL;  	} @@ -633,7 +638,7 @@ filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid,  		int size = (fl->stripe_type == STRIPE_SPARSE) ?  			fl->dsaddr->ds_num : fl->dsaddr->stripe_count; -		fl->commit_buckets = kcalloc(size, sizeof(struct list_head), GFP_KERNEL); +		fl->commit_buckets = kcalloc(size, sizeof(struct list_head), gfp_flags);  		if (!fl->commit_buckets) {  			filelayout_free_lseg(&fl->generic_hdr);  			return NULL;  |