Commit 5e7e5a0d authored by Bryan Schumaker's avatar Bryan Schumaker Committed by Trond Myklebust

NFS: Create an NFS v3 stat_to_errno()

In theory, NFS v3 can have different error versions than NFS v2. v4 is
already using its own nfs4_stat_to_errno() to map error codes, so
rather than create something in the generic client for v2 and v3 to
share I instead give v3 its own function.
Signed-off-by: default avatarBryan Schumaker <bjschuma@netapp.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 87c7083d
...@@ -208,7 +208,6 @@ extern void nfs_pgheader_init(struct nfs_pageio_descriptor *desc, ...@@ -208,7 +208,6 @@ extern void nfs_pgheader_init(struct nfs_pageio_descriptor *desc,
void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos); void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos);
/* nfs2xdr.c */ /* nfs2xdr.c */
extern int nfs_stat_to_errno(enum nfs_stat);
extern struct rpc_procinfo nfs_procedures[]; extern struct rpc_procinfo nfs_procedures[];
extern int nfs2_decode_dirent(struct xdr_stream *, extern int nfs2_decode_dirent(struct xdr_stream *,
struct nfs_entry *, int); struct nfs_entry *, int);
......
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
#define NFS_readdirres_sz (1) #define NFS_readdirres_sz (1)
#define NFS_statfsres_sz (1+NFS_info_sz) #define NFS_statfsres_sz (1+NFS_info_sz)
static int nfs_stat_to_errno(enum nfs_stat);
/* /*
* While encoding arguments, set up the reply buffer in advance to * While encoding arguments, set up the reply buffer in advance to
...@@ -1111,7 +1112,7 @@ static const struct { ...@@ -1111,7 +1112,7 @@ static const struct {
* Returns a local errno value, or -EIO if the NFS status code is * Returns a local errno value, or -EIO if the NFS status code is
* not recognized. This function is used jointly by NFSv2 and NFSv3. * not recognized. This function is used jointly by NFSv2 and NFSv3.
*/ */
int nfs_stat_to_errno(enum nfs_stat status) static int nfs_stat_to_errno(enum nfs_stat status)
{ {
int i; int i;
......
...@@ -86,6 +86,8 @@ ...@@ -86,6 +86,8 @@
XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE)) XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
#define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz) #define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz)
static int nfs3_stat_to_errno(enum nfs_stat);
/* /*
* Map file type to S_IFMT bits * Map file type to S_IFMT bits
*/ */
...@@ -1388,7 +1390,7 @@ static int nfs3_xdr_dec_getattr3res(struct rpc_rqst *req, ...@@ -1388,7 +1390,7 @@ static int nfs3_xdr_dec_getattr3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_default: out_default:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1427,7 +1429,7 @@ static int nfs3_xdr_dec_setattr3res(struct rpc_rqst *req, ...@@ -1427,7 +1429,7 @@ static int nfs3_xdr_dec_setattr3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1475,7 +1477,7 @@ static int nfs3_xdr_dec_lookup3res(struct rpc_rqst *req, ...@@ -1475,7 +1477,7 @@ static int nfs3_xdr_dec_lookup3res(struct rpc_rqst *req,
error = decode_post_op_attr(xdr, result->dir_attr); error = decode_post_op_attr(xdr, result->dir_attr);
if (unlikely(error)) if (unlikely(error))
goto out; goto out;
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1516,7 +1518,7 @@ static int nfs3_xdr_dec_access3res(struct rpc_rqst *req, ...@@ -1516,7 +1518,7 @@ static int nfs3_xdr_dec_access3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_default: out_default:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1557,7 +1559,7 @@ static int nfs3_xdr_dec_readlink3res(struct rpc_rqst *req, ...@@ -1557,7 +1559,7 @@ static int nfs3_xdr_dec_readlink3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_default: out_default:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1639,7 +1641,7 @@ static int nfs3_xdr_dec_read3res(struct rpc_rqst *req, struct xdr_stream *xdr, ...@@ -1639,7 +1641,7 @@ static int nfs3_xdr_dec_read3res(struct rpc_rqst *req, struct xdr_stream *xdr,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1709,7 +1711,7 @@ static int nfs3_xdr_dec_write3res(struct rpc_rqst *req, struct xdr_stream *xdr, ...@@ -1709,7 +1711,7 @@ static int nfs3_xdr_dec_write3res(struct rpc_rqst *req, struct xdr_stream *xdr,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1773,7 +1775,7 @@ static int nfs3_xdr_dec_create3res(struct rpc_rqst *req, ...@@ -1773,7 +1775,7 @@ static int nfs3_xdr_dec_create3res(struct rpc_rqst *req,
error = decode_wcc_data(xdr, result->dir_attr); error = decode_wcc_data(xdr, result->dir_attr);
if (unlikely(error)) if (unlikely(error))
goto out; goto out;
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1812,7 +1814,7 @@ static int nfs3_xdr_dec_remove3res(struct rpc_rqst *req, ...@@ -1812,7 +1814,7 @@ static int nfs3_xdr_dec_remove3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1856,7 +1858,7 @@ static int nfs3_xdr_dec_rename3res(struct rpc_rqst *req, ...@@ -1856,7 +1858,7 @@ static int nfs3_xdr_dec_rename3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -1899,7 +1901,7 @@ static int nfs3_xdr_dec_link3res(struct rpc_rqst *req, struct xdr_stream *xdr, ...@@ -1899,7 +1901,7 @@ static int nfs3_xdr_dec_link3res(struct rpc_rqst *req, struct xdr_stream *xdr,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/** /**
...@@ -2091,7 +2093,7 @@ static int nfs3_xdr_dec_readdir3res(struct rpc_rqst *req, ...@@ -2091,7 +2093,7 @@ static int nfs3_xdr_dec_readdir3res(struct rpc_rqst *req,
error = decode_post_op_attr(xdr, result->dir_attr); error = decode_post_op_attr(xdr, result->dir_attr);
if (unlikely(error)) if (unlikely(error))
goto out; goto out;
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -2159,7 +2161,7 @@ static int nfs3_xdr_dec_fsstat3res(struct rpc_rqst *req, ...@@ -2159,7 +2161,7 @@ static int nfs3_xdr_dec_fsstat3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -2235,7 +2237,7 @@ static int nfs3_xdr_dec_fsinfo3res(struct rpc_rqst *req, ...@@ -2235,7 +2237,7 @@ static int nfs3_xdr_dec_fsinfo3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -2298,7 +2300,7 @@ static int nfs3_xdr_dec_pathconf3res(struct rpc_rqst *req, ...@@ -2298,7 +2300,7 @@ static int nfs3_xdr_dec_pathconf3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
/* /*
...@@ -2339,7 +2341,7 @@ static int nfs3_xdr_dec_commit3res(struct rpc_rqst *req, ...@@ -2339,7 +2341,7 @@ static int nfs3_xdr_dec_commit3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_status: out_status:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
#ifdef CONFIG_NFS_V3_ACL #ifdef CONFIG_NFS_V3_ACL
...@@ -2404,7 +2406,7 @@ static int nfs3_xdr_dec_getacl3res(struct rpc_rqst *req, ...@@ -2404,7 +2406,7 @@ static int nfs3_xdr_dec_getacl3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_default: out_default:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req, static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req,
...@@ -2423,11 +2425,76 @@ static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req, ...@@ -2423,11 +2425,76 @@ static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req,
out: out:
return error; return error;
out_default: out_default:
return nfs_stat_to_errno(status); return nfs3_stat_to_errno(status);
} }
#endif /* CONFIG_NFS_V3_ACL */ #endif /* CONFIG_NFS_V3_ACL */
/*
* We need to translate between nfs status return values and
* the local errno values which may not be the same.
*/
static const struct {
int stat;
int errno;
} nfs_errtbl[] = {
{ NFS_OK, 0 },
{ NFSERR_PERM, -EPERM },
{ NFSERR_NOENT, -ENOENT },
{ NFSERR_IO, -errno_NFSERR_IO},
{ NFSERR_NXIO, -ENXIO },
/* { NFSERR_EAGAIN, -EAGAIN }, */
{ NFSERR_ACCES, -EACCES },
{ NFSERR_EXIST, -EEXIST },
{ NFSERR_XDEV, -EXDEV },
{ NFSERR_NODEV, -ENODEV },
{ NFSERR_NOTDIR, -ENOTDIR },
{ NFSERR_ISDIR, -EISDIR },
{ NFSERR_INVAL, -EINVAL },
{ NFSERR_FBIG, -EFBIG },
{ NFSERR_NOSPC, -ENOSPC },
{ NFSERR_ROFS, -EROFS },
{ NFSERR_MLINK, -EMLINK },
{ NFSERR_NAMETOOLONG, -ENAMETOOLONG },
{ NFSERR_NOTEMPTY, -ENOTEMPTY },
{ NFSERR_DQUOT, -EDQUOT },
{ NFSERR_STALE, -ESTALE },
{ NFSERR_REMOTE, -EREMOTE },
#ifdef EWFLUSH
{ NFSERR_WFLUSH, -EWFLUSH },
#endif
{ NFSERR_BADHANDLE, -EBADHANDLE },
{ NFSERR_NOT_SYNC, -ENOTSYNC },
{ NFSERR_BAD_COOKIE, -EBADCOOKIE },
{ NFSERR_NOTSUPP, -ENOTSUPP },
{ NFSERR_TOOSMALL, -ETOOSMALL },
{ NFSERR_SERVERFAULT, -EREMOTEIO },
{ NFSERR_BADTYPE, -EBADTYPE },
{ NFSERR_JUKEBOX, -EJUKEBOX },
{ -1, -EIO }
};
/**
* nfs3_stat_to_errno - convert an NFS status code to a local errno
* @status: NFS status code to convert
*
* Returns a local errno value, or -EIO if the NFS status code is
* not recognized. This function is used jointly by NFSv2 and NFSv3.
*/
static int nfs3_stat_to_errno(enum nfs_stat status)
{
int i;
for (i = 0; nfs_errtbl[i].stat != -1; i++) {
if (nfs_errtbl[i].stat == (int)status)
return nfs_errtbl[i].errno;
}
dprintk("NFS: Unrecognized nfs status value: %u\n", status);
return nfs_errtbl[i].errno;
}
#define PROC(proc, argtype, restype, timer) \ #define PROC(proc, argtype, restype, timer) \
[NFS3PROC_##proc] = { \ [NFS3PROC_##proc] = { \
.p_proc = NFS3PROC_##proc, \ .p_proc = NFS3PROC_##proc, \
......
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