181 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/* miscellaneous bits3 *4 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.5 * Written by David Howells (dhowells@redhat.com)6 */7 8#include <linux/kernel.h>9#include <linux/module.h>10#include <linux/errno.h>11#include "internal.h"12#include "afs_fs.h"13#include "protocol_uae.h"14 15/*16 * convert an AFS abort code to a Linux error number17 */18int afs_abort_to_error(u32 abort_code)19{20 switch (abort_code) {21 /* Low errno codes inserted into abort namespace */22 case 13: return -EACCES;23 case 27: return -EFBIG;24 case 30: return -EROFS;25 26 /* VICE "special error" codes; 101 - 111 */27 case VSALVAGE: return -EIO;28 case VNOVNODE: return -ENOENT;29 case VNOVOL: return -ENOMEDIUM;30 case VVOLEXISTS: return -EEXIST;31 case VNOSERVICE: return -EIO;32 case VOFFLINE: return -ENOENT;33 case VONLINE: return -EEXIST;34 case VDISKFULL: return -ENOSPC;35 case VOVERQUOTA: return -EDQUOT;36 case VBUSY: return -EBUSY;37 case VMOVED: return -ENXIO;38 39 /* Volume Location server errors */40 case AFSVL_IDEXIST: return -EEXIST;41 case AFSVL_IO: return -EREMOTEIO;42 case AFSVL_NAMEEXIST: return -EEXIST;43 case AFSVL_CREATEFAIL: return -EREMOTEIO;44 case AFSVL_NOENT: return -ENOMEDIUM;45 case AFSVL_EMPTY: return -ENOMEDIUM;46 case AFSVL_ENTDELETED: return -ENOMEDIUM;47 case AFSVL_BADNAME: return -EINVAL;48 case AFSVL_BADINDEX: return -EINVAL;49 case AFSVL_BADVOLTYPE: return -EINVAL;50 case AFSVL_BADSERVER: return -EINVAL;51 case AFSVL_BADPARTITION: return -EINVAL;52 case AFSVL_REPSFULL: return -EFBIG;53 case AFSVL_NOREPSERVER: return -ENOENT;54 case AFSVL_DUPREPSERVER: return -EEXIST;55 case AFSVL_RWNOTFOUND: return -ENOENT;56 case AFSVL_BADREFCOUNT: return -EINVAL;57 case AFSVL_SIZEEXCEEDED: return -EINVAL;58 case AFSVL_BADENTRY: return -EINVAL;59 case AFSVL_BADVOLIDBUMP: return -EINVAL;60 case AFSVL_IDALREADYHASHED: return -EINVAL;61 case AFSVL_ENTRYLOCKED: return -EBUSY;62 case AFSVL_BADVOLOPER: return -EBADRQC;63 case AFSVL_BADRELLOCKTYPE: return -EINVAL;64 case AFSVL_RERELEASE: return -EREMOTEIO;65 case AFSVL_BADSERVERFLAG: return -EINVAL;66 case AFSVL_PERM: return -EACCES;67 case AFSVL_NOMEM: return -EREMOTEIO;68 69 /* Unified AFS error table */70 case UAEPERM: return -EPERM;71 case UAENOENT: return -ENOENT;72 case UAEAGAIN: return -EAGAIN;73 case UAEACCES: return -EACCES;74 case UAEBUSY: return -EBUSY;75 case UAEEXIST: return -EEXIST;76 case UAENOTDIR: return -ENOTDIR;77 case UAEISDIR: return -EISDIR;78 case UAEFBIG: return -EFBIG;79 case UAENOSPC: return -ENOSPC;80 case UAEROFS: return -EROFS;81 case UAEMLINK: return -EMLINK;82 case UAEDEADLK: return -EDEADLK;83 case UAENAMETOOLONG: return -ENAMETOOLONG;84 case UAENOLCK: return -ENOLCK;85 case UAENOTEMPTY: return -ENOTEMPTY;86 case UAELOOP: return -ELOOP;87 case UAEOVERFLOW: return -EOVERFLOW;88 case UAENOMEDIUM: return -ENOMEDIUM;89 case UAEDQUOT: return -EDQUOT;90 91 /* RXKAD abort codes; from include/rxrpc/packet.h. ET "RXK" == 0x1260B00 */92 case RXKADINCONSISTENCY: return -EPROTO;93 case RXKADPACKETSHORT: return -EPROTO;94 case RXKADLEVELFAIL: return -EKEYREJECTED;95 case RXKADTICKETLEN: return -EKEYREJECTED;96 case RXKADOUTOFSEQUENCE: return -EPROTO;97 case RXKADNOAUTH: return -EKEYREJECTED;98 case RXKADBADKEY: return -EKEYREJECTED;99 case RXKADBADTICKET: return -EKEYREJECTED;100 case RXKADUNKNOWNKEY: return -EKEYREJECTED;101 case RXKADEXPIRED: return -EKEYEXPIRED;102 case RXKADSEALEDINCON: return -EKEYREJECTED;103 case RXKADDATALEN: return -EKEYREJECTED;104 case RXKADILLEGALLEVEL: return -EKEYREJECTED;105 106 case RXGEN_OPCODE: return -ENOTSUPP;107 108 default: return -EREMOTEIO;109 }110}111 112/*113 * Select the error to report from a set of errors.114 */115void afs_prioritise_error(struct afs_error *e, int error, u32 abort_code)116{117 switch (error) {118 case 0:119 e->aborted = false;120 e->error = 0;121 return;122 default:123 if (e->error == -ETIMEDOUT ||124 e->error == -ETIME)125 return;126 fallthrough;127 case -ETIMEDOUT:128 case -ETIME:129 if (e->error == -ENOMEM ||130 e->error == -ENONET)131 return;132 fallthrough;133 case -ENOMEM:134 case -ENONET:135 if (e->error == -ERFKILL)136 return;137 fallthrough;138 case -ERFKILL:139 if (e->error == -EADDRNOTAVAIL)140 return;141 fallthrough;142 case -EADDRNOTAVAIL:143 if (e->error == -ENETUNREACH)144 return;145 fallthrough;146 case -ENETUNREACH:147 if (e->error == -EHOSTUNREACH)148 return;149 fallthrough;150 case -EHOSTUNREACH:151 if (e->error == -EHOSTDOWN)152 return;153 fallthrough;154 case -EHOSTDOWN:155 if (e->error == -ECONNREFUSED)156 return;157 fallthrough;158 case -ECONNREFUSED:159 if (e->error == -ECONNRESET)160 return;161 fallthrough;162 case -ECONNRESET: /* Responded, but call expired. */163 if (e->responded)164 return;165 e->error = error;166 e->aborted = false;167 return;168 169 case -ECONNABORTED:170 e->error = afs_abort_to_error(abort_code);171 e->aborted = true;172 e->responded = true;173 return;174 case -ENETRESET: /* Responded, but we seem to have changed address */175 e->aborted = false;176 e->responded = true;177 e->error = error;178 return;179 }180}181