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 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 */ 115 void 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