Commit 90fecfcb authored by Andy Adamson's avatar Andy Adamson Committed by Trond Myklebust

NFSv4.1 cleanup filelayout invalid layout handling

The invalid layout bits are should only be used to block LAYOUTGETs.

Do not invalidate a layout on deviceid invalidation.
Do not invalidate a layout on un-handled READ, WRITE, COMMIT errors.
Signed-off-by: default avatarAndy Adamson <andros@netapp.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 554d458d
...@@ -148,7 +148,6 @@ static int filelayout_async_handle_error(struct rpc_task *task, ...@@ -148,7 +148,6 @@ static int filelayout_async_handle_error(struct rpc_task *task,
static int filelayout_read_done_cb(struct rpc_task *task, static int filelayout_read_done_cb(struct rpc_task *task,
struct nfs_read_data *data) struct nfs_read_data *data)
{ {
struct nfs_pgio_header *hdr = data->header;
int reset = 0; int reset = 0;
dprintk("%s DS read\n", __func__); dprintk("%s DS read\n", __func__);
...@@ -157,10 +156,8 @@ static int filelayout_read_done_cb(struct rpc_task *task, ...@@ -157,10 +156,8 @@ static int filelayout_read_done_cb(struct rpc_task *task,
data->ds_clp, &reset) == -EAGAIN) { data->ds_clp, &reset) == -EAGAIN) {
dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n",
__func__, data->ds_clp, data->ds_clp->cl_session); __func__, data->ds_clp, data->ds_clp->cl_session);
if (reset) { if (reset)
pnfs_set_lo_fail(hdr->lseg);
nfs4_reset_read(task, data); nfs4_reset_read(task, data);
}
rpc_restart_call_prepare(task); rpc_restart_call_prepare(task);
return -EAGAIN; return -EAGAIN;
} }
...@@ -233,17 +230,14 @@ static void filelayout_read_release(void *data) ...@@ -233,17 +230,14 @@ static void filelayout_read_release(void *data)
static int filelayout_write_done_cb(struct rpc_task *task, static int filelayout_write_done_cb(struct rpc_task *task,
struct nfs_write_data *data) struct nfs_write_data *data)
{ {
struct nfs_pgio_header *hdr = data->header;
int reset = 0; int reset = 0;
if (filelayout_async_handle_error(task, data->args.context->state, if (filelayout_async_handle_error(task, data->args.context->state,
data->ds_clp, &reset) == -EAGAIN) { data->ds_clp, &reset) == -EAGAIN) {
dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n",
__func__, data->ds_clp, data->ds_clp->cl_session); __func__, data->ds_clp, data->ds_clp->cl_session);
if (reset) { if (reset)
pnfs_set_lo_fail(hdr->lseg);
nfs4_reset_write(task, data); nfs4_reset_write(task, data);
}
rpc_restart_call_prepare(task); rpc_restart_call_prepare(task);
return -EAGAIN; return -EAGAIN;
} }
...@@ -272,10 +266,9 @@ static int filelayout_commit_done_cb(struct rpc_task *task, ...@@ -272,10 +266,9 @@ static int filelayout_commit_done_cb(struct rpc_task *task,
data->ds_clp, &reset) == -EAGAIN) { data->ds_clp, &reset) == -EAGAIN) {
dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n",
__func__, data->ds_clp, data->ds_clp->cl_session); __func__, data->ds_clp, data->ds_clp->cl_session);
if (reset) { if (reset)
prepare_to_resend_writes(data); prepare_to_resend_writes(data);
pnfs_set_lo_fail(data->lseg); else
} else
rpc_restart_call_prepare(task); rpc_restart_call_prepare(task);
return -EAGAIN; return -EAGAIN;
} }
...@@ -393,12 +386,8 @@ filelayout_read_pagelist(struct nfs_read_data *data) ...@@ -393,12 +386,8 @@ filelayout_read_pagelist(struct nfs_read_data *data)
j = nfs4_fl_calc_j_index(lseg, offset); j = nfs4_fl_calc_j_index(lseg, offset);
idx = nfs4_fl_calc_ds_index(lseg, j); idx = nfs4_fl_calc_ds_index(lseg, j);
ds = nfs4_fl_prepare_ds(lseg, idx); ds = nfs4_fl_prepare_ds(lseg, idx);
if (!ds) { if (!ds)
/* Either layout fh index faulty, or ds connect failed */
set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags);
set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags);
return PNFS_NOT_ATTEMPTED; return PNFS_NOT_ATTEMPTED;
}
dprintk("%s USE DS: %s\n", __func__, ds->ds_remotestr); dprintk("%s USE DS: %s\n", __func__, ds->ds_remotestr);
/* No multipath support. Use first DS */ /* No multipath support. Use first DS */
...@@ -433,11 +422,8 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync) ...@@ -433,11 +422,8 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync)
j = nfs4_fl_calc_j_index(lseg, offset); j = nfs4_fl_calc_j_index(lseg, offset);
idx = nfs4_fl_calc_ds_index(lseg, j); idx = nfs4_fl_calc_ds_index(lseg, j);
ds = nfs4_fl_prepare_ds(lseg, idx); ds = nfs4_fl_prepare_ds(lseg, idx);
if (!ds) { if (!ds)
set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags);
set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags);
return PNFS_NOT_ATTEMPTED; return PNFS_NOT_ATTEMPTED;
}
dprintk("%s ino %lu sync %d req %Zu@%llu DS: %s\n", __func__, dprintk("%s ino %lu sync %d req %Zu@%llu DS: %s\n", __func__,
hdr->inode->i_ino, sync, (size_t) data->args.count, offset, hdr->inode->i_ino, sync, (size_t) data->args.count, offset,
ds->ds_remotestr); ds->ds_remotestr);
...@@ -969,8 +955,6 @@ static int filelayout_initiate_commit(struct nfs_commit_data *data, int how) ...@@ -969,8 +955,6 @@ static int filelayout_initiate_commit(struct nfs_commit_data *data, int how)
idx = calc_ds_index_from_commit(lseg, data->ds_commit_index); idx = calc_ds_index_from_commit(lseg, data->ds_commit_index);
ds = nfs4_fl_prepare_ds(lseg, idx); ds = nfs4_fl_prepare_ds(lseg, idx);
if (!ds) { if (!ds) {
set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags);
set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags);
prepare_to_resend_writes(data); prepare_to_resend_writes(data);
filelayout_commit_release(data); filelayout_commit_release(data);
return -EAGAIN; return -EAGAIN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment