1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* miscellaneous bits 3 * 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 number 17 */ 18 int 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 UAEACCES: return -EACCES; 73 case UAEBUSY: return -EBUSY; 74 case UAEEXIST: return -EEXIST; 75 case UAENOTDIR: return -ENOTDIR; 76 case UAEISDIR: return -EISDIR; 77 case UAEFBIG: return -EFBIG; 78 case UAENOSPC: return -ENOSPC; 79 case UAEROFS: return -EROFS; 80 case UAEMLINK: return -EMLINK; 81 case UAEDEADLK: return -EDEADLK; 82 case UAENAMETOOLONG: return -ENAMETOOLONG; 83 case UAENOLCK: return -ENOLCK; 84 case UAENOTEMPTY: return -ENOTEMPTY; 85 case UAELOOP: return -ELOOP; 86 case UAEOVERFLOW: return -EOVERFLOW; 87 case UAENOMEDIUM: return -ENOMEDIUM; 88 case UAEDQUOT: return -EDQUOT; 89 90 /* RXKAD abort codes; from include/rxrpc/packet.h. ET "RXK" == 0x1260B00 */ 91 case RXKADINCONSISTENCY: return -EPROTO; 92 case RXKADPACKETSHORT: return -EPROTO; 93 case RXKADLEVELFAIL: return -EKEYREJECTED; 94 case RXKADTICKETLEN: return -EKEYREJECTED; 95 case RXKADOUTOFSEQUENCE: return -EPROTO; 96 case RXKADNOAUTH: return -EKEYREJECTED; 97 case RXKADBADKEY: return -EKEYREJECTED; 98 case RXKADBADTICKET: return -EKEYREJECTED; 99 case RXKADUNKNOWNKEY: return -EKEYREJECTED; 100 case RXKADEXPIRED: return -EKEYEXPIRED; 101 case RXKADSEALEDINCON: return -EKEYREJECTED; 102 case RXKADDATALEN: return -EKEYREJECTED; 103 case RXKADILLEGALLEVEL: return -EKEYREJECTED; 104 105 case RXGEN_OPCODE: return -ENOTSUPP; 106 107 default: return -EREMOTEIO; 108 } 109 } 110 111 /* 112 * Select the error to report from a set of errors. 113 */ 114 void afs_prioritise_error(struct afs_error *e, int error, u32 abort_code) 115 { 116 switch (error) { 117 case 0: 118 return; 119 default: 120 if (e->error == -ETIMEDOUT || 121 e->error == -ETIME) 122 return; 123 fallthrough; 124 case -ETIMEDOUT: 125 case -ETIME: 126 if (e->error == -ENOMEM || 127 e->error == -ENONET) 128 return; 129 fallthrough; 130 case -ENOMEM: 131 case -ENONET: 132 if (e->error == -ERFKILL) 133 return; 134 fallthrough; 135 case -ERFKILL: 136 if (e->error == -EADDRNOTAVAIL) 137 return; 138 fallthrough; 139 case -EADDRNOTAVAIL: 140 if (e->error == -ENETUNREACH) 141 return; 142 fallthrough; 143 case -ENETUNREACH: 144 if (e->error == -EHOSTUNREACH) 145 return; 146 fallthrough; 147 case -EHOSTUNREACH: 148 if (e->error == -EHOSTDOWN) 149 return; 150 fallthrough; 151 case -EHOSTDOWN: 152 if (e->error == -ECONNREFUSED) 153 return; 154 fallthrough; 155 case -ECONNREFUSED: 156 if (e->error == -ECONNRESET) 157 return; 158 fallthrough; 159 case -ECONNRESET: /* Responded, but call expired. */ 160 if (e->responded) 161 return; 162 e->error = error; 163 return; 164 165 case -ECONNABORTED: 166 error = afs_abort_to_error(abort_code); 167 fallthrough; 168 case -ENETRESET: /* Responded, but we seem to have changed address */ 169 e->responded = true; 170 e->error = error; 171 return; 172 } 173 } 174