Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62e4a769 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Revert pnfs ugliness from the generic NFS read code path



pNFS-specific code belongs in the pnfs layer. It should not be
hijacking generic NFS read or write code paths.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 2aa13531
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -299,6 +299,8 @@ extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
		struct list_head *head);

extern void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
		struct inode *inode);
extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
extern void nfs_readdata_release(struct nfs_read_data *rdata);

+21 −5
Original line number Diff line number Diff line
@@ -1259,6 +1259,25 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
}
EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages);

static void pnfs_ld_handle_read_error(struct nfs_read_data *data)
{
	struct nfs_pageio_descriptor pgio;

	put_lseg(data->lseg);
	data->lseg = NULL;
	dprintk("pnfs write error = %d\n", data->pnfs_error);

	nfs_pageio_init_read_mds(&pgio, data->inode);

	while (!list_empty(&data->pages)) {
		struct nfs_page *req = nfs_list_entry(data->pages.next);

		nfs_list_remove_request(req);
		nfs_pageio_add_request(&pgio, req);
	}
	nfs_pageio_complete(&pgio);
}

/*
 * Called by non rpc-based layout drivers
 */
@@ -1267,11 +1286,8 @@ void pnfs_ld_read_done(struct nfs_read_data *data)
	if (likely(!data->pnfs_error)) {
		__nfs4_read_done_cb(data);
		data->mds_ops->rpc_call_done(&data->task, data);
	} else {
		put_lseg(data->lseg);
		data->lseg = NULL;
		dprintk("pnfs write error = %d\n", data->pnfs_error);
	}
	} else
		pnfs_ld_handle_read_error(data);
	data->mds_ops->rpc_release(data);
}
EXPORT_SYMBOL_GPL(pnfs_ld_read_done);
+2 −12
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
	}
}

static void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
		struct inode *inode)
{
	nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops,
@@ -534,23 +534,13 @@ static void nfs_readpage_result_full(struct rpc_task *task, void *calldata)
static void nfs_readpage_release_full(void *calldata)
{
	struct nfs_read_data *data = calldata;
	struct nfs_pageio_descriptor pgio;

	if (data->pnfs_error) {
		nfs_pageio_init_read_mds(&pgio, data->inode);
		pgio.pg_recoalesce = 1;
	}
	while (!list_empty(&data->pages)) {
		struct nfs_page *req = nfs_list_entry(data->pages.next);

		nfs_list_remove_request(req);
		if (!data->pnfs_error)
		nfs_readpage_release(req);
		else
			nfs_pageio_add_request(&pgio, req);
	}
	if (data->pnfs_error)
		nfs_pageio_complete(&pgio);
	nfs_readdata_release(calldata);
}