mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 12:14:10 +08:00
nfs_common: factor out nfs4_errtbl and nfs4_stat_to_errno
Common nfs4_stat_to_errno() is used by fs/nfs/nfs4xdr.c and will be used by fs/nfs/localio.c Signed-off-by: Mike Snitzer <snitzer@kernel.org> Reviewed-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: NeilBrown <neilb@suse.de> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
parent
4806ded4c1
commit
1fcb16674e
@ -65,7 +65,6 @@
|
||||
#define NFSDBG_FACILITY NFSDBG_XDR
|
||||
|
||||
struct compound_hdr;
|
||||
static int nfs4_stat_to_errno(int);
|
||||
static void encode_layoutget(struct xdr_stream *xdr,
|
||||
const struct nfs4_layoutget_args *args,
|
||||
struct compound_hdr *hdr);
|
||||
@ -7619,72 +7618,6 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to translate between nfs status return values and
|
||||
* the local errno values which may not be the same.
|
||||
*/
|
||||
static struct {
|
||||
int stat;
|
||||
int errno;
|
||||
} nfs_errtbl[] = {
|
||||
{ NFS4_OK, 0 },
|
||||
{ NFS4ERR_PERM, -EPERM },
|
||||
{ NFS4ERR_NOENT, -ENOENT },
|
||||
{ NFS4ERR_IO, -errno_NFSERR_IO},
|
||||
{ NFS4ERR_NXIO, -ENXIO },
|
||||
{ NFS4ERR_ACCESS, -EACCES },
|
||||
{ NFS4ERR_EXIST, -EEXIST },
|
||||
{ NFS4ERR_XDEV, -EXDEV },
|
||||
{ NFS4ERR_NOTDIR, -ENOTDIR },
|
||||
{ NFS4ERR_ISDIR, -EISDIR },
|
||||
{ NFS4ERR_INVAL, -EINVAL },
|
||||
{ NFS4ERR_FBIG, -EFBIG },
|
||||
{ NFS4ERR_NOSPC, -ENOSPC },
|
||||
{ NFS4ERR_ROFS, -EROFS },
|
||||
{ NFS4ERR_MLINK, -EMLINK },
|
||||
{ NFS4ERR_NAMETOOLONG, -ENAMETOOLONG },
|
||||
{ NFS4ERR_NOTEMPTY, -ENOTEMPTY },
|
||||
{ NFS4ERR_DQUOT, -EDQUOT },
|
||||
{ NFS4ERR_STALE, -ESTALE },
|
||||
{ NFS4ERR_BADHANDLE, -EBADHANDLE },
|
||||
{ NFS4ERR_BAD_COOKIE, -EBADCOOKIE },
|
||||
{ NFS4ERR_NOTSUPP, -ENOTSUPP },
|
||||
{ NFS4ERR_TOOSMALL, -ETOOSMALL },
|
||||
{ NFS4ERR_SERVERFAULT, -EREMOTEIO },
|
||||
{ NFS4ERR_BADTYPE, -EBADTYPE },
|
||||
{ NFS4ERR_LOCKED, -EAGAIN },
|
||||
{ NFS4ERR_SYMLINK, -ELOOP },
|
||||
{ NFS4ERR_OP_ILLEGAL, -EOPNOTSUPP },
|
||||
{ NFS4ERR_DEADLOCK, -EDEADLK },
|
||||
{ NFS4ERR_NOXATTR, -ENODATA },
|
||||
{ NFS4ERR_XATTR2BIG, -E2BIG },
|
||||
{ -1, -EIO }
|
||||
};
|
||||
|
||||
/*
|
||||
* Convert an NFS error code to a local one.
|
||||
* This one is used jointly by NFSv2 and NFSv3.
|
||||
*/
|
||||
static int
|
||||
nfs4_stat_to_errno(int stat)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; nfs_errtbl[i].stat != -1; i++) {
|
||||
if (nfs_errtbl[i].stat == stat)
|
||||
return nfs_errtbl[i].errno;
|
||||
}
|
||||
if (stat <= 10000 || stat > 10100) {
|
||||
/* The server is looney tunes. */
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
/* If we cannot translate the error, the recovery routines should
|
||||
* handle it.
|
||||
* Note: remaining NFSv4 error codes have values > 10000, so should
|
||||
* not conflict with native Linux error codes.
|
||||
*/
|
||||
return -stat;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFS_V4_2
|
||||
#include "nfs42xdr.c"
|
||||
#endif /* CONFIG_NFS_V4_2 */
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/nfs_common.h>
|
||||
#include <linux/nfs4.h>
|
||||
|
||||
/*
|
||||
* We need to translate between nfs status return values and
|
||||
@ -65,3 +66,69 @@ int nfs_stat_to_errno(enum nfs_stat status)
|
||||
return nfs_errtbl[i].errno;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_stat_to_errno);
|
||||
|
||||
/*
|
||||
* We need to translate between nfs v4 status return values and
|
||||
* the local errno values which may not be the same.
|
||||
*/
|
||||
static const struct {
|
||||
int stat;
|
||||
int errno;
|
||||
} nfs4_errtbl[] = {
|
||||
{ NFS4_OK, 0 },
|
||||
{ NFS4ERR_PERM, -EPERM },
|
||||
{ NFS4ERR_NOENT, -ENOENT },
|
||||
{ NFS4ERR_IO, -errno_NFSERR_IO},
|
||||
{ NFS4ERR_NXIO, -ENXIO },
|
||||
{ NFS4ERR_ACCESS, -EACCES },
|
||||
{ NFS4ERR_EXIST, -EEXIST },
|
||||
{ NFS4ERR_XDEV, -EXDEV },
|
||||
{ NFS4ERR_NOTDIR, -ENOTDIR },
|
||||
{ NFS4ERR_ISDIR, -EISDIR },
|
||||
{ NFS4ERR_INVAL, -EINVAL },
|
||||
{ NFS4ERR_FBIG, -EFBIG },
|
||||
{ NFS4ERR_NOSPC, -ENOSPC },
|
||||
{ NFS4ERR_ROFS, -EROFS },
|
||||
{ NFS4ERR_MLINK, -EMLINK },
|
||||
{ NFS4ERR_NAMETOOLONG, -ENAMETOOLONG },
|
||||
{ NFS4ERR_NOTEMPTY, -ENOTEMPTY },
|
||||
{ NFS4ERR_DQUOT, -EDQUOT },
|
||||
{ NFS4ERR_STALE, -ESTALE },
|
||||
{ NFS4ERR_BADHANDLE, -EBADHANDLE },
|
||||
{ NFS4ERR_BAD_COOKIE, -EBADCOOKIE },
|
||||
{ NFS4ERR_NOTSUPP, -ENOTSUPP },
|
||||
{ NFS4ERR_TOOSMALL, -ETOOSMALL },
|
||||
{ NFS4ERR_SERVERFAULT, -EREMOTEIO },
|
||||
{ NFS4ERR_BADTYPE, -EBADTYPE },
|
||||
{ NFS4ERR_LOCKED, -EAGAIN },
|
||||
{ NFS4ERR_SYMLINK, -ELOOP },
|
||||
{ NFS4ERR_OP_ILLEGAL, -EOPNOTSUPP },
|
||||
{ NFS4ERR_DEADLOCK, -EDEADLK },
|
||||
{ NFS4ERR_NOXATTR, -ENODATA },
|
||||
{ NFS4ERR_XATTR2BIG, -E2BIG },
|
||||
{ -1, -EIO }
|
||||
};
|
||||
|
||||
/*
|
||||
* Convert an NFS error code to a local one.
|
||||
* This one is used by NFSv4.
|
||||
*/
|
||||
int nfs4_stat_to_errno(int stat)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; nfs4_errtbl[i].stat != -1; i++) {
|
||||
if (nfs4_errtbl[i].stat == stat)
|
||||
return nfs4_errtbl[i].errno;
|
||||
}
|
||||
if (stat <= 10000 || stat > 10100) {
|
||||
/* The server is looney tunes. */
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
/* If we cannot translate the error, the recovery routines should
|
||||
* handle it.
|
||||
* Note: remaining NFSv4 error codes have values > 10000, so should
|
||||
* not conflict with native Linux error codes.
|
||||
*/
|
||||
return -stat;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs4_stat_to_errno);
|
||||
|
@ -12,5 +12,6 @@
|
||||
#define errno_NFSERR_IO EIO
|
||||
|
||||
int nfs_stat_to_errno(enum nfs_stat status);
|
||||
int nfs4_stat_to_errno(int stat);
|
||||
|
||||
#endif /* _LINUX_NFS_COMMON_H */
|
||||
|
Loading…
Reference in New Issue
Block a user