/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is included * in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see * http://www.gnu.org/licenses/gpl-2.0.txt * * GPL HEADER END */ /* * Copyright (C) 2011 FUJITSU LIMITED. All rights reserved. * * Copyright (c) 2013, Intel Corporation. */ #include #include #ifdef LUSTRE_TRANSLATE_ERRNOS /* * The two translation tables below must define a one-to-one mapping between * host and network errnos. * * EWOULDBLOCK is equal to EAGAIN on all architectures except for parisc, which * appears irrelevant. Thus, existing references to EWOULDBLOCK are fine. * * EDEADLOCK is equal to EDEADLK on x86 but not on sparc, at least. A sparc * host has no context-free way to determine if a LUSTRE_EDEADLK represents an * EDEADLK or an EDEADLOCK. Therefore, all existing references to EDEADLOCK * that need to be transferred on wire have been replaced with EDEADLK. */ static int lustre_errno_hton_mapping[] = { [EPERM] = LUSTRE_EPERM, [ENOENT] = LUSTRE_ENOENT, [ESRCH] = LUSTRE_ESRCH, [EINTR] = LUSTRE_EINTR, [EIO] = LUSTRE_EIO, [ENXIO] = LUSTRE_ENXIO, [E2BIG] = LUSTRE_E2BIG, [ENOEXEC] = LUSTRE_ENOEXEC, [EBADF] = LUSTRE_EBADF, [ECHILD] = LUSTRE_ECHILD, [EAGAIN] = LUSTRE_EAGAIN, [ENOMEM] = LUSTRE_ENOMEM, [EACCES] = LUSTRE_EACCES, [EFAULT] = LUSTRE_EFAULT, [ENOTBLK] = LUSTRE_ENOTBLK, [EBUSY] = LUSTRE_EBUSY, [EEXIST] = LUSTRE_EEXIST, [EXDEV] = LUSTRE_EXDEV, [ENODEV] = LUSTRE_ENODEV, [ENOTDIR] = LUSTRE_ENOTDIR, [EISDIR] = LUSTRE_EISDIR, [EINVAL] = LUSTRE_EINVAL, [ENFILE] = LUSTRE_ENFILE, [EMFILE] = LUSTRE_EMFILE, [ENOTTY] = LUSTRE_ENOTTY, [ETXTBSY] = LUSTRE_ETXTBSY, [EFBIG] = LUSTRE_EFBIG, [ENOSPC] = LUSTRE_ENOSPC, [ESPIPE] = LUSTRE_ESPIPE, [EROFS] = LUSTRE_EROFS, [EMLINK] = LUSTRE_EMLINK, [EPIPE] = LUSTRE_EPIPE, [EDOM] = LUSTRE_EDOM, [ERANGE] = LUSTRE_ERANGE, [EDEADLK] = LUSTRE_EDEADLK, [ENAMETOOLONG] = LUSTRE_ENAMETOOLONG, [ENOLCK] = LUSTRE_ENOLCK, [ENOSYS] = LUSTRE_ENOSYS, [ENOTEMPTY] = LUSTRE_ENOTEMPTY, [ELOOP] = LUSTRE_ELOOP, [ENOMSG] = LUSTRE_ENOMSG, [EIDRM] = LUSTRE_EIDRM, [ECHRNG] = LUSTRE_ECHRNG, [EL2NSYNC] = LUSTRE_EL2NSYNC, [EL3HLT] = LUSTRE_EL3HLT, [EL3RST] = LUSTRE_EL3RST, [ELNRNG] = LUSTRE_ELNRNG, [EUNATCH] = LUSTRE_EUNATCH, [ENOCSI] = LUSTRE_ENOCSI, [EL2HLT] = LUSTRE_EL2HLT, [EBADE] = LUSTRE_EBADE, [EBADR] = LUSTRE_EBADR, [EXFULL] = LUSTRE_EXFULL, [ENOANO] = LUSTRE_ENOANO, [EBADRQC] = LUSTRE_EBADRQC, [EBADSLT] = LUSTRE_EBADSLT, [EBFONT] = LUSTRE_EBFONT, [ENOSTR] = LUSTRE_ENOSTR, [ENODATA] = LUSTRE_ENODATA, [ETIME] = LUSTRE_ETIME, [ENOSR] = LUSTRE_ENOSR, [ENONET] = LUSTRE_ENONET, [ENOPKG] = LUSTRE_ENOPKG, [EREMOTE] = LUSTRE_EREMOTE, [ENOLINK] = LUSTRE_ENOLINK, [EADV] = LUSTRE_EADV, [ESRMNT] = LUSTRE_ESRMNT, [ECOMM] = LUSTRE_ECOMM, [EPROTO] = LUSTRE_EPROTO, [EMULTIHOP] = LUSTRE_EMULTIHOP, [EDOTDOT] = LUSTRE_EDOTDOT, [EBADMSG] = LUSTRE_EBADMSG, [EOVERFLOW] = LUSTRE_EOVERFLOW, [ENOTUNIQ] = LUSTRE_ENOTUNIQ, [EBADFD] = LUSTRE_EBADFD, [EREMCHG] = LUSTRE_EREMCHG, [ELIBACC] = LUSTRE_ELIBACC, [ELIBBAD] = LUSTRE_ELIBBAD, [ELIBSCN] = LUSTRE_ELIBSCN, [ELIBMAX] = LUSTRE_ELIBMAX, [ELIBEXEC] = LUSTRE_ELIBEXEC, [EILSEQ] = LUSTRE_EILSEQ, [ERESTART] = LUSTRE_ERESTART, [ESTRPIPE] = LUSTRE_ESTRPIPE, [EUSERS] = LUSTRE_EUSERS, [ENOTSOCK] = LUSTRE_ENOTSOCK, [EDESTADDRREQ] = LUSTRE_EDESTADDRREQ, [EMSGSIZE] = LUSTRE_EMSGSIZE, [EPROTOTYPE] = LUSTRE_EPROTOTYPE, [ENOPROTOOPT] = LUSTRE_ENOPROTOOPT, [EPROTONOSUPPORT] = LUSTRE_EPROTONOSUPPORT, [ESOCKTNOSUPPORT] = LUSTRE_ESOCKTNOSUPPORT, [EOPNOTSUPP] = LUSTRE_EOPNOTSUPP, [EPFNOSUPPORT] = LUSTRE_EPFNOSUPPORT, [EAFNOSUPPORT] = LUSTRE_EAFNOSUPPORT, [EADDRINUSE] = LUSTRE_EADDRINUSE, [EADDRNOTAVAIL] = LUSTRE_EADDRNOTAVAIL, [ENETDOWN] = LUSTRE_ENETDOWN, [ENETUNREACH] = LUSTRE_ENETUNREACH, [ENETRESET] = LUSTRE_ENETRESET, [ECONNABORTED] = LUSTRE_ECONNABORTED, [ECONNRESET] = LUSTRE_ECONNRESET, [ENOBUFS] = LUSTRE_ENOBUFS, [EISCONN] = LUSTRE_EISCONN, [ENOTCONN] = LUSTRE_ENOTCONN, [ESHUTDOWN] = LUSTRE_ESHUTDOWN, [ETOOMANYREFS] = LUSTRE_ETOOMANYREFS, [ETIMEDOUT] = LUSTRE_ETIMEDOUT, [ECONNREFUSED] = LUSTRE_ECONNREFUSED, [EHOSTDOWN] = LUSTRE_EHOSTDOWN, [EHOSTUNREACH] = LUSTRE_EHOSTUNREACH, [EALREADY] = LUSTRE_EALREADY, [EINPROGRESS] = LUSTRE_EINPROGRESS, [ESTALE] = LUSTRE_ESTALE, [EUCLEAN] = LUSTRE_EUCLEAN, [ENOTNAM] = LUSTRE_ENOTNAM, [ENAVAIL] = LUSTRE_ENAVAIL, [EISNAM] = LUSTRE_EISNAM, [EREMOTEIO] = LUSTRE_EREMOTEIO, [EDQUOT] = LUSTRE_EDQUOT, [ENOMEDIUM] = LUSTRE_ENOMEDIUM, [EMEDIUMTYPE] = LUSTRE_EMEDIUMTYPE, [ECANCELED] = LUSTRE_ECANCELED, [ENOKEY] = LUSTRE_ENOKEY, [EKEYEXPIRED] = LUSTRE_EKEYEXPIRED, [EKEYREVOKED] = LUSTRE_EKEYREVOKED, [EKEYREJECTED] = LUSTRE_EKEYREJECTED, [EOWNERDEAD] = LUSTRE_EOWNERDEAD, [ENOTRECOVERABLE] = LUSTRE_ENOTRECOVERABLE, [ERESTARTSYS] = LUSTRE_ERESTARTSYS, [ERESTARTNOINTR] = LUSTRE_ERESTARTNOINTR, [ERESTARTNOHAND] = LUSTRE_ERESTARTNOHAND, [ENOIOCTLCMD] = LUSTRE_ENOIOCTLCMD, [ERESTART_RESTARTBLOCK] = LUSTRE_ERESTART_RESTARTBLOCK, [EBADHANDLE] = LUSTRE_EBADHANDLE, [ENOTSYNC] = LUSTRE_ENOTSYNC, [EBADCOOKIE] = LUSTRE_EBADCOOKIE, [ENOTSUPP] = LUSTRE_ENOTSUPP, [ETOOSMALL] = LUSTRE_ETOOSMALL, [ESERVERFAULT] = LUSTRE_ESERVERFAULT, [EBADTYPE] = LUSTRE_EBADTYPE, [EJUKEBOX] = LUSTRE_EJUKEBOX, [EIOCBQUEUED] = LUSTRE_EIOCBQUEUED }; static int lustre_errno_ntoh_mapping[] = { [LUSTRE_EPERM] = EPERM, [LUSTRE_ENOENT] = ENOENT, [LUSTRE_ESRCH] = ESRCH, [LUSTRE_EINTR] = EINTR, [LUSTRE_EIO] = EIO, [LUSTRE_ENXIO] = ENXIO, [LUSTRE_E2BIG] = E2BIG, [LUSTRE_ENOEXEC] = ENOEXEC, [LUSTRE_EBADF] = EBADF, [LUSTRE_ECHILD] = ECHILD, [LUSTRE_EAGAIN] = EAGAIN, [LUSTRE_ENOMEM] = ENOMEM, [LUSTRE_EACCES] = EACCES, [LUSTRE_EFAULT] = EFAULT, [LUSTRE_ENOTBLK] = ENOTBLK, [LUSTRE_EBUSY] = EBUSY, [LUSTRE_EEXIST] = EEXIST, [LUSTRE_EXDEV] = EXDEV, [LUSTRE_ENODEV] = ENODEV, [LUSTRE_ENOTDIR] = ENOTDIR, [LUSTRE_EISDIR] = EISDIR, [LUSTRE_EINVAL] = EINVAL, [LUSTRE_ENFILE] = ENFILE, [LUSTRE_EMFILE] = EMFILE, [LUSTRE_ENOTTY] = ENOTTY, [LUSTRE_ETXTBSY] = ETXTBSY, [LUSTRE_EFBIG] = EFBIG, [LUSTRE_ENOSPC] = ENOSPC, [LUSTRE_ESPIPE] = ESPIPE, [LUSTRE_EROFS] = EROFS, [LUSTRE_EMLINK] = EMLINK, [LUSTRE_EPIPE] = EPIPE, [LUSTRE_EDOM] = EDOM, [LUSTRE_ERANGE] = ERANGE, [LUSTRE_EDEADLK] = EDEADLK, [LUSTRE_ENAMETOOLONG] = ENAMETOOLONG, [LUSTRE_ENOLCK] = ENOLCK, [LUSTRE_ENOSYS] = ENOSYS, [LUSTRE_ENOTEMPTY] = ENOTEMPTY, [LUSTRE_ELOOP] = ELOOP, [LUSTRE_ENOMSG] = ENOMSG, [LUSTRE_EIDRM] = EIDRM, [LUSTRE_ECHRNG] = ECHRNG, [LUSTRE_EL2NSYNC] = EL2NSYNC, [LUSTRE_EL3HLT] = EL3HLT, [LUSTRE_EL3RST] = EL3RST, [LUSTRE_ELNRNG] = ELNRNG, [LUSTRE_EUNATCH] = EUNATCH, [LUSTRE_ENOCSI] = ENOCSI, [LUSTRE_EL2HLT] = EL2HLT, [LUSTRE_EBADE] = EBADE, [LUSTRE_EBADR] = EBADR, [LUSTRE_EXFULL] = EXFULL, [LUSTRE_ENOANO] = ENOANO, [LUSTRE_EBADRQC] = EBADRQC, [LUSTRE_EBADSLT] = EBADSLT, [LUSTRE_EBFONT] = EBFONT, [LUSTRE_ENOSTR] = ENOSTR, [LUSTRE_ENODATA] = ENODATA, [LUSTRE_ETIME] = ETIME, [LUSTRE_ENOSR] = ENOSR, [LUSTRE_ENONET] = ENONET, [LUSTRE_ENOPKG] = ENOPKG, [LUSTRE_EREMOTE] = EREMOTE, [LUSTRE_ENOLINK] = ENOLINK, [LUSTRE_EADV] = EADV, [LUSTRE_ESRMNT] = ESRMNT, [LUSTRE_ECOMM] = ECOMM, [LUSTRE_EPROTO] = EPROTO, [LUSTRE_EMULTIHOP] = EMULTIHOP, [LUSTRE_EDOTDOT] = EDOTDOT, [LUSTRE_EBADMSG] = EBADMSG, [LUSTRE_EOVERFLOW] = EOVERFLOW, [LUSTRE_ENOTUNIQ] = ENOTUNIQ, [LUSTRE_EBADFD] = EBADFD, [LUSTRE_EREMCHG] = EREMCHG, [LUSTRE_ELIBACC] = ELIBACC, [LUSTRE_ELIBBAD] = ELIBBAD, [LUSTRE_ELIBSCN] = ELIBSCN, [LUSTRE_ELIBMAX] = ELIBMAX, [LUSTRE_ELIBEXEC] = ELIBEXEC, [LUSTRE_EILSEQ] = EILSEQ, [LUSTRE_ERESTART] = ERESTART, [LUSTRE_ESTRPIPE] = ESTRPIPE, [LUSTRE_EUSERS] = EUSERS, [LUSTRE_ENOTSOCK] = ENOTSOCK, [LUSTRE_EDESTADDRREQ] = EDESTADDRREQ, [LUSTRE_EMSGSIZE] = EMSGSIZE, [LUSTRE_EPROTOTYPE] = EPROTOTYPE, [LUSTRE_ENOPROTOOPT] = ENOPROTOOPT, [LUSTRE_EPROTONOSUPPORT] = EPROTONOSUPPORT, [LUSTRE_ESOCKTNOSUPPORT] = ESOCKTNOSUPPORT, [LUSTRE_EOPNOTSUPP] = EOPNOTSUPP, [LUSTRE_EPFNOSUPPORT] = EPFNOSUPPORT, [LUSTRE_EAFNOSUPPORT] = EAFNOSUPPORT, [LUSTRE_EADDRINUSE] = EADDRINUSE, [LUSTRE_EADDRNOTAVAIL] = EADDRNOTAVAIL, [LUSTRE_ENETDOWN] = ENETDOWN, [LUSTRE_ENETUNREACH] = ENETUNREACH, [LUSTRE_ENETRESET] = ENETRESET, [LUSTRE_ECONNABORTED] = ECONNABORTED, [LUSTRE_ECONNRESET] = ECONNRESET, [LUSTRE_ENOBUFS] = ENOBUFS, [LUSTRE_EISCONN] = EISCONN, [LUSTRE_ENOTCONN] = ENOTCONN, [LUSTRE_ESHUTDOWN] = ESHUTDOWN, [LUSTRE_ETOOMANYREFS] = ETOOMANYREFS, [LUSTRE_ETIMEDOUT] = ETIMEDOUT, [LUSTRE_ECONNREFUSED] = ECONNREFUSED, [LUSTRE_EHOSTDOWN] = EHOSTDOWN, [LUSTRE_EHOSTUNREACH] = EHOSTUNREACH, [LUSTRE_EALREADY] = EALREADY, [LUSTRE_EINPROGRESS] = EINPROGRESS, [LUSTRE_ESTALE] = ESTALE, [LUSTRE_EUCLEAN] = EUCLEAN, [LUSTRE_ENOTNAM] = ENOTNAM, [LUSTRE_ENAVAIL] = ENAVAIL, [LUSTRE_EISNAM] = EISNAM, [LUSTRE_EREMOTEIO] = EREMOTEIO, [LUSTRE_EDQUOT] = EDQUOT, [LUSTRE_ENOMEDIUM] = ENOMEDIUM, [LUSTRE_EMEDIUMTYPE] = EMEDIUMTYPE, [LUSTRE_ECANCELED] = ECANCELED, [LUSTRE_ENOKEY] = ENOKEY, [LUSTRE_EKEYEXPIRED] = EKEYEXPIRED, [LUSTRE_EKEYREVOKED] = EKEYREVOKED, [LUSTRE_EKEYREJECTED] = EKEYREJECTED, [LUSTRE_EOWNERDEAD] = EOWNERDEAD, [LUSTRE_ENOTRECOVERABLE] = ENOTRECOVERABLE, [LUSTRE_ERESTARTSYS] = ERESTARTSYS, [LUSTRE_ERESTARTNOINTR] = ERESTARTNOINTR, [LUSTRE_ERESTARTNOHAND] = ERESTARTNOHAND, [LUSTRE_ENOIOCTLCMD] = ENOIOCTLCMD, [LUSTRE_ERESTART_RESTARTBLOCK] = ERESTART_RESTARTBLOCK, [LUSTRE_EBADHANDLE] = EBADHANDLE, [LUSTRE_ENOTSYNC] = ENOTSYNC, [LUSTRE_EBADCOOKIE] = EBADCOOKIE, [LUSTRE_ENOTSUPP] = ENOTSUPP, [LUSTRE_ETOOSMALL] = ETOOSMALL, [LUSTRE_ESERVERFAULT] = ESERVERFAULT, [LUSTRE_EBADTYPE] = EBADTYPE, [LUSTRE_EJUKEBOX] = EJUKEBOX, [LUSTRE_EIOCBQUEUED] = EIOCBQUEUED }; unsigned int lustre_errno_hton(unsigned int h) { unsigned int n; if (h == 0) { n = 0; } else if (h < ARRAY_SIZE(lustre_errno_hton_mapping)) { n = lustre_errno_hton_mapping[h]; if (n == 0) goto generic; } else { generic: /* * A generic errno is better than the unknown one that could * mean anything to a different host. */ n = LUSTRE_EIO; } return n; } EXPORT_SYMBOL(lustre_errno_hton); unsigned int lustre_errno_ntoh(unsigned int n) { unsigned int h; if (n == 0) { h = 0; } else if (n < ARRAY_SIZE(lustre_errno_ntoh_mapping)) { h = lustre_errno_ntoh_mapping[n]; if (h == 0) goto generic; } else { generic: /* * Similar to the situation in lustre_errno_hton(), an unknown * network errno could coincide with anything. Hence, it is * better to return a generic errno. */ h = EIO; } return h; } EXPORT_SYMBOL(lustre_errno_ntoh); #endif /* LUSTRE_TRANSLATE_ERRNOS */