|
@@ -1166,7 +1166,13 @@ static void nfs_writeback_done_full(struct rpc_task *task, void *calldata)
|
|
|
static void nfs_writeback_release_full(void *calldata)
|
|
|
{
|
|
|
struct nfs_write_data *data = calldata;
|
|
|
- int status = data->task.tk_status;
|
|
|
+ int ret, status = data->task.tk_status;
|
|
|
+ struct nfs_pageio_descriptor pgio;
|
|
|
+
|
|
|
+ if (data->pnfs_error) {
|
|
|
+ nfs_pageio_init_write_mds(&pgio, data->inode, FLUSH_STABLE);
|
|
|
+ pgio.pg_recoalesce = 1;
|
|
|
+ }
|
|
|
|
|
|
/* Update attributes as result of writeback. */
|
|
|
while (!list_empty(&data->pages)) {
|
|
@@ -1182,6 +1188,11 @@ static void nfs_writeback_release_full(void *calldata)
|
|
|
req->wb_bytes,
|
|
|
(long long)req_offset(req));
|
|
|
|
|
|
+ if (data->pnfs_error) {
|
|
|
+ dprintk(", pnfs error = %d\n", data->pnfs_error);
|
|
|
+ goto next;
|
|
|
+ }
|
|
|
+
|
|
|
if (status < 0) {
|
|
|
nfs_set_pageerror(page);
|
|
|
nfs_context_set_write_error(req->wb_context, status);
|
|
@@ -1201,7 +1212,19 @@ remove_request:
|
|
|
next:
|
|
|
nfs_clear_page_tag_locked(req);
|
|
|
nfs_end_page_writeback(page);
|
|
|
+ if (data->pnfs_error) {
|
|
|
+ lock_page(page);
|
|
|
+ nfs_pageio_cond_complete(&pgio, page->index);
|
|
|
+ ret = nfs_page_async_flush(&pgio, page, 0);
|
|
|
+ if (ret) {
|
|
|
+ nfs_set_pageerror(page);
|
|
|
+ dprintk("rewrite to MDS error = %d\n", ret);
|
|
|
+ }
|
|
|
+ unlock_page(page);
|
|
|
+ }
|
|
|
}
|
|
|
+ if (data->pnfs_error)
|
|
|
+ nfs_pageio_complete(&pgio);
|
|
|
nfs_writedata_release(calldata);
|
|
|
}
|
|
|
|