On Wed, 2024-08-28 at 21:03 -0400, Mike Snitzer wrote: > 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@xxxxxxxxxx> > --- > fs/nfs/nfs4xdr.c | 67 -------------------------------------- > fs/nfs_common/common.c | 67 ++++++++++++++++++++++++++++++++++++++ > include/linux/nfs_common.h | 1 + > 3 files changed, 68 insertions(+), 67 deletions(-) > > diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c > index b4091af1a60d..971305bdaecb 100644 > --- a/fs/nfs/nfs4xdr.c > +++ b/fs/nfs/nfs4xdr.c > @@ -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 */ > diff --git a/fs/nfs_common/common.c b/fs/nfs_common/common.c > index a4ee95da2174..34a115176f97 100644 > --- a/fs/nfs_common/common.c > +++ b/fs/nfs_common/common.c > @@ -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); > diff --git a/include/linux/nfs_common.h b/include/linux/nfs_common.h > index 3395c4a4d372..5fc02df88252 100644 > --- a/include/linux/nfs_common.h > +++ b/include/linux/nfs_common.h > @@ -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 */ Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>