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 UAENOMEDIUM: return -ENOMEDIUM; 87 case UAEDQUOT: return -EDQUOT; 88 89 /* RXKAD abort codes; from include/rxrpc/packet.h. ET "RXK" == 0x1260B00 */ 90 case RXKADINCONSISTENCY: return -EPROTO; 91 case RXKADPACKETSHORT: return -EPROTO; 92 case RXKADLEVELFAIL: return -EKEYREJECTED; 93 case RXKADTICKETLEN: return -EKEYREJECTED; 94 case RXKADOUTOFSEQUENCE: return -EPROTO; 95 case RXKADNOAUTH: return -EKEYREJECTED; 96 case RXKADBADKEY: return -EKEYREJECTED; 97 case RXKADBADTICKET: return -EKEYREJECTED; 98 case RXKADUNKNOWNKEY: return -EKEYREJECTED; 99 case RXKADEXPIRED: return -EKEYEXPIRED; 100 case RXKADSEALEDINCON: return -EKEYREJECTED; 101 case RXKADDATALEN: return -EKEYREJECTED; 102 case RXKADILLEGALLEVEL: return -EKEYREJECTED; 103 104 case RXGEN_OPCODE: return -ENOTSUPP; 105 106 default: return -EREMOTEIO; 107 } 108 } 109 110 /* 111 * Select the error to report from a set of errors. 112 */ 113 void afs_prioritise_error(struct afs_error *e, int error, u32 abort_code) 114 { 115 switch (error) { 116 case 0: 117 return; 118 default: 119 if (e->error == -ETIMEDOUT || 120 e->error == -ETIME) 121 return; 122 /* Fall through */ 123 case -ETIMEDOUT: 124 case -ETIME: 125 if (e->error == -ENOMEM || 126 e->error == -ENONET) 127 return; 128 /* Fall through */ 129 case -ENOMEM: 130 case -ENONET: 131 if (e->error == -ERFKILL) 132 return; 133 /* Fall through */ 134 case -ERFKILL: 135 if (e->error == -EADDRNOTAVAIL) 136 return; 137 /* Fall through */ 138 case -EADDRNOTAVAIL: 139 if (e->error == -ENETUNREACH) 140 return; 141 /* Fall through */ 142 case -ENETUNREACH: 143 if (e->error == -EHOSTUNREACH) 144 return; 145 /* Fall through */ 146 case -EHOSTUNREACH: 147 if (e->error == -EHOSTDOWN) 148 return; 149 /* Fall through */ 150 case -EHOSTDOWN: 151 if (e->error == -ECONNREFUSED) 152 return; 153 /* Fall through */ 154 case -ECONNREFUSED: 155 if (e->error == -ECONNRESET) 156 return; 157 /* Fall through */ 158 case -ECONNRESET: /* Responded, but call expired. */ 159 if (e->responded) 160 return; 161 e->error = error; 162 return; 163 164 case -ECONNABORTED: 165 e->responded = true; 166 e->error = afs_abort_to_error(abort_code); 167 return; 168 } 169 } 170