diff options
Diffstat (limited to 'fs/nfs/nfs4filelayout.c')
| -rw-r--r-- | fs/nfs/nfs4filelayout.c | 41 | 
1 files changed, 27 insertions, 14 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 53f94d915bd..52d84721206 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c @@ -190,8 +190,6 @@ static int filelayout_async_handle_error(struct rpc_task *task,  		 * i/o and all i/o waiting on the slot table to the MDS until  		 * layout is destroyed and a new valid layout is obtained.  		 */ -		set_bit(NFS_LAYOUT_INVALID, -				&NFS_I(inode)->layout->plh_flags);  		pnfs_destroy_layout(NFS_I(inode));  		rpc_wake_up(&tbl->slot_tbl_waitq);  		goto reset; @@ -205,7 +203,7 @@ static int filelayout_async_handle_error(struct rpc_task *task,  	case -EPIPE:  		dprintk("%s DS connection error %d\n", __func__,  			task->tk_status); -		filelayout_mark_devid_invalid(devid); +		nfs4_mark_deviceid_unavailable(devid);  		clear_bit(NFS_INO_LAYOUTCOMMIT, &NFS_I(inode)->flags);  		_pnfs_return_layout(inode);  		rpc_wake_up(&tbl->slot_tbl_waitq); @@ -269,6 +267,21 @@ filelayout_set_layoutcommit(struct nfs_write_data *wdata)  		(unsigned long) NFS_I(hdr->inode)->layout->plh_lwb);  } +bool +filelayout_test_devid_unavailable(struct nfs4_deviceid_node *node) +{ +	return filelayout_test_devid_invalid(node) || +		nfs4_test_deviceid_unavailable(node); +} + +static bool +filelayout_reset_to_mds(struct pnfs_layout_segment *lseg) +{ +	struct nfs4_deviceid_node *node = FILELAYOUT_DEVID_NODE(lseg); + +	return filelayout_test_devid_unavailable(node); +} +  /*   * Call ops for the async read/write cases   * In the case of dense layouts, the offset needs to be reset to its @@ -453,7 +466,7 @@ static void filelayout_commit_release(void *calldata)  	struct nfs_commit_data *data = calldata;  	data->completion_ops->completion(data); -	put_lseg(data->lseg); +	pnfs_put_lseg(data->lseg);  	nfs_put_client(data->ds_clp);  	nfs_commitdata_release(data);  } @@ -608,13 +621,13 @@ filelayout_check_layout(struct pnfs_layout_hdr *lo,  	d = nfs4_find_get_deviceid(NFS_SERVER(lo->plh_inode)->pnfs_curr_ld,  				   NFS_SERVER(lo->plh_inode)->nfs_client, id);  	if (d == NULL) { -		dsaddr = get_device_info(lo->plh_inode, id, gfp_flags); +		dsaddr = filelayout_get_device_info(lo->plh_inode, id, gfp_flags);  		if (dsaddr == NULL)  			goto out;  	} else  		dsaddr = container_of(d, struct nfs4_file_layout_dsaddr, id_node); -	/* Found deviceid is being reaped */ -	if (test_bit(NFS_DEVICEID_INVALID, &dsaddr->id_node.flags)) +	/* Found deviceid is unavailable */ +	if (filelayout_test_devid_unavailable(&dsaddr->id_node))  			goto out_put;  	fl->dsaddr = dsaddr; @@ -931,7 +944,7 @@ filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio,  	nfs_init_cinfo(&cinfo, pgio->pg_inode, pgio->pg_dreq);  	status = filelayout_alloc_commit_info(pgio->pg_lseg, &cinfo, GFP_NOFS);  	if (status < 0) { -		put_lseg(pgio->pg_lseg); +		pnfs_put_lseg(pgio->pg_lseg);  		pgio->pg_lseg = NULL;  		goto out_mds;  	} @@ -985,7 +998,7 @@ filelayout_clear_request_commit(struct nfs_page *req,  out:  	nfs_request_remove_commit_list(req, cinfo);  	spin_unlock(cinfo->lock); -	put_lseg(freeme); +	pnfs_put_lseg(freeme);  }  static struct list_head * @@ -1018,7 +1031,7 @@ filelayout_choose_commit_list(struct nfs_page *req,  		 * off due to a rewrite, in which case it will be done in  		 * filelayout_clear_request_commit  		 */ -		buckets[i].wlseg = get_lseg(lseg); +		buckets[i].wlseg = pnfs_get_lseg(lseg);  	}  	set_bit(PG_COMMIT_TO_DS, &req->wb_flags);  	cinfo->ds->nwritten++; @@ -1128,7 +1141,7 @@ filelayout_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,  		if (list_empty(src))  			bucket->wlseg = NULL;  		else -			get_lseg(bucket->clseg); +			pnfs_get_lseg(bucket->clseg);  	}  	return ret;  } @@ -1159,12 +1172,12 @@ static void filelayout_recover_commit_reqs(struct list_head *dst,  	/* NOTE cinfo->lock is NOT held, relying on fact that this is  	 * only called on single thread per dreq. -	 * Can't take the lock because need to do put_lseg +	 * Can't take the lock because need to do pnfs_put_lseg  	 */  	for (i = 0, b = cinfo->ds->buckets; i < cinfo->ds->nbuckets; i++, b++) {  		if (transfer_commit_list(&b->written, dst, cinfo, 0)) {  			BUG_ON(!list_empty(&b->written)); -			put_lseg(b->wlseg); +			pnfs_put_lseg(b->wlseg);  			b->wlseg = NULL;  		}  	} @@ -1200,7 +1213,7 @@ alloc_ds_commits(struct nfs_commit_info *cinfo, struct list_head *list)  		if (list_empty(&bucket->committing))  			continue;  		nfs_retry_commit(&bucket->committing, bucket->clseg, cinfo); -		put_lseg(bucket->clseg); +		pnfs_put_lseg(bucket->clseg);  		bucket->clseg = NULL;  	}  	/* Caller will clean up entries put on list */  |