Commit 6e01260c authored by Fred Isaman's avatar Fred Isaman Committed by Trond Myklebust

pnfs: Stop attempting LAYOUTGET on OPEN on failure

Signed-off-by: default avatarFred Isaman <fred.isaman@gmail.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 78746a38
...@@ -9465,7 +9465,8 @@ static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = { ...@@ -9465,7 +9465,8 @@ static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
| NFS_CAP_ATOMIC_OPEN | NFS_CAP_ATOMIC_OPEN
| NFS_CAP_POSIX_LOCK | NFS_CAP_POSIX_LOCK
| NFS_CAP_STATEID_NFSV41 | NFS_CAP_STATEID_NFSV41
| NFS_CAP_ATOMIC_OPEN_V1, | NFS_CAP_ATOMIC_OPEN_V1
| NFS_CAP_LGOPEN,
.init_client = nfs41_init_client, .init_client = nfs41_init_client,
.shutdown_client = nfs41_shutdown_client, .shutdown_client = nfs41_shutdown_client,
.match_stateid = nfs41_match_stateid, .match_stateid = nfs41_match_stateid,
...@@ -9490,6 +9491,7 @@ static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = { ...@@ -9490,6 +9491,7 @@ static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = {
| NFS_CAP_POSIX_LOCK | NFS_CAP_POSIX_LOCK
| NFS_CAP_STATEID_NFSV41 | NFS_CAP_STATEID_NFSV41
| NFS_CAP_ATOMIC_OPEN_V1 | NFS_CAP_ATOMIC_OPEN_V1
| NFS_CAP_LGOPEN
| NFS_CAP_ALLOCATE | NFS_CAP_ALLOCATE
| NFS_CAP_COPY | NFS_CAP_COPY
| NFS_CAP_DEALLOCATE | NFS_CAP_DEALLOCATE
......
...@@ -2088,6 +2088,8 @@ void pnfs_lgopen_prepare(struct nfs4_opendata *data, ...@@ -2088,6 +2088,8 @@ void pnfs_lgopen_prepare(struct nfs4_opendata *data,
server->pnfs_curr_ld->flags & PNFS_LAYOUTGET_ON_OPEN)) server->pnfs_curr_ld->flags & PNFS_LAYOUTGET_ON_OPEN))
return; return;
/* Could check on max_ops, but currently hardcoded high enough */ /* Could check on max_ops, but currently hardcoded high enough */
if (!nfs_server_capable(data->dir->d_inode, NFS_CAP_LGOPEN))
return;
if (data->state) if (data->state)
_lgopen_prepare_attached(data, ctx); _lgopen_prepare_attached(data, ctx);
else else
...@@ -2101,8 +2103,23 @@ void pnfs_parse_lgopen(struct inode *ino, struct nfs4_layoutget *lgp, ...@@ -2101,8 +2103,23 @@ void pnfs_parse_lgopen(struct inode *ino, struct nfs4_layoutget *lgp,
struct pnfs_layout_segment *lseg; struct pnfs_layout_segment *lseg;
u32 iomode; u32 iomode;
if (!lgp || lgp->res.layoutp->len == 0) if (!lgp)
return;
dprintk("%s: entered with status %i\n", __func__, lgp->res.status);
if (lgp->res.status) {
switch (lgp->res.status) {
case -NFS4ERR_DELAY:
case -NFS4ERR_GRACE:
case -NFS4ERR_LAYOUTTRYLATER:
break;
default:
/* FIXME - Any error not listed above permanently
* halts lgopen attempts.
*/
NFS_SERVER(ino)->caps &= ~NFS_CAP_LGOPEN;
}
return; return;
}
if (!lgp->args.inode) { if (!lgp->args.inode) {
lo = _pnfs_grab_empty_layout(ino, ctx); lo = _pnfs_grab_empty_layout(ino, ctx);
if (!lo) if (!lo)
......
...@@ -235,6 +235,7 @@ struct nfs_server { ...@@ -235,6 +235,7 @@ struct nfs_server {
#define NFS_CAP_ACLS (1U << 3) #define NFS_CAP_ACLS (1U << 3)
#define NFS_CAP_ATOMIC_OPEN (1U << 4) #define NFS_CAP_ATOMIC_OPEN (1U << 4)
/* #define NFS_CAP_CHANGE_ATTR (1U << 5) */ /* #define NFS_CAP_CHANGE_ATTR (1U << 5) */
#define NFS_CAP_LGOPEN (1U << 5)
#define NFS_CAP_FILEID (1U << 6) #define NFS_CAP_FILEID (1U << 6)
#define NFS_CAP_MODE (1U << 7) #define NFS_CAP_MODE (1U << 7)
#define NFS_CAP_NLINK (1U << 8) #define NFS_CAP_NLINK (1U << 8)
......
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