1 /* miscellaneous bits 2 * 3 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 12 #include <linux/kernel.h> 13 #include <linux/module.h> 14 #include <linux/errno.h> 15 #include "internal.h" 16 #include "afs_fs.h" 17 18 /* 19 * convert an AFS abort code to a Linux error number 20 */ 21 int afs_abort_to_error(u32 abort_code) 22 { 23 switch (abort_code) { 24 /* Low errno codes inserted into abort namespace */ 25 case 13: return -EACCES; 26 case 27: return -EFBIG; 27 case 30: return -EROFS; 28 29 /* VICE "special error" codes; 101 - 111 */ 30 case VSALVAGE: return -EIO; 31 case VNOVNODE: return -ENOENT; 32 case VNOVOL: return -ENOMEDIUM; 33 case VVOLEXISTS: return -EEXIST; 34 case VNOSERVICE: return -EIO; 35 case VOFFLINE: return -ENOENT; 36 case VONLINE: return -EEXIST; 37 case VDISKFULL: return -ENOSPC; 38 case VOVERQUOTA: return -EDQUOT; 39 case VBUSY: return -EBUSY; 40 case VMOVED: return -ENXIO; 41 42 /* Volume Location server errors */ 43 case AFSVL_IDEXIST: return -EEXIST; 44 case AFSVL_IO: return -EREMOTEIO; 45 case AFSVL_NAMEEXIST: return -EEXIST; 46 case AFSVL_CREATEFAIL: return -EREMOTEIO; 47 case AFSVL_NOENT: return -ENOMEDIUM; 48 case AFSVL_EMPTY: return -ENOMEDIUM; 49 case AFSVL_ENTDELETED: return -ENOMEDIUM; 50 case AFSVL_BADNAME: return -EINVAL; 51 case AFSVL_BADINDEX: return -EINVAL; 52 case AFSVL_BADVOLTYPE: return -EINVAL; 53 case AFSVL_BADSERVER: return -EINVAL; 54 case AFSVL_BADPARTITION: return -EINVAL; 55 case AFSVL_REPSFULL: return -EFBIG; 56 case AFSVL_NOREPSERVER: return -ENOENT; 57 case AFSVL_DUPREPSERVER: return -EEXIST; 58 case AFSVL_RWNOTFOUND: return -ENOENT; 59 case AFSVL_BADREFCOUNT: return -EINVAL; 60 case AFSVL_SIZEEXCEEDED: return -EINVAL; 61 case AFSVL_BADENTRY: return -EINVAL; 62 case AFSVL_BADVOLIDBUMP: return -EINVAL; 63 case AFSVL_IDALREADYHASHED: return -EINVAL; 64 case AFSVL_ENTRYLOCKED: return -EBUSY; 65 case AFSVL_BADVOLOPER: return -EBADRQC; 66 case AFSVL_BADRELLOCKTYPE: return -EINVAL; 67 case AFSVL_RERELEASE: return -EREMOTEIO; 68 case AFSVL_BADSERVERFLAG: return -EINVAL; 69 case AFSVL_PERM: return -EACCES; 70 case AFSVL_NOMEM: return -EREMOTEIO; 71 72 /* Unified AFS error table; ET "uae" == 0x2f6df00 */ 73 case 0x2f6df00: return -EPERM; 74 case 0x2f6df01: return -ENOENT; 75 case 0x2f6df04: return -EIO; 76 case 0x2f6df0a: return -EAGAIN; 77 case 0x2f6df0b: return -ENOMEM; 78 case 0x2f6df0c: return -EACCES; 79 case 0x2f6df0f: return -EBUSY; 80 case 0x2f6df10: return -EEXIST; 81 case 0x2f6df11: return -EXDEV; 82 case 0x2f6df12: return -ENODEV; 83 case 0x2f6df13: return -ENOTDIR; 84 case 0x2f6df14: return -EISDIR; 85 case 0x2f6df15: return -EINVAL; 86 case 0x2f6df1a: return -EFBIG; 87 case 0x2f6df1b: return -ENOSPC; 88 case 0x2f6df1d: return -EROFS; 89 case 0x2f6df1e: return -EMLINK; 90 case 0x2f6df20: return -EDOM; 91 case 0x2f6df21: return -ERANGE; 92 case 0x2f6df22: return -EDEADLK; 93 case 0x2f6df23: return -ENAMETOOLONG; 94 case 0x2f6df24: return -ENOLCK; 95 case 0x2f6df26: return -ENOTEMPTY; 96 case 0x2f6df28: return -EWOULDBLOCK; 97 case 0x2f6df69: return -ENOTCONN; 98 case 0x2f6df6c: return -ETIMEDOUT; 99 case 0x2f6df78: return -EDQUOT; 100 101 /* RXKAD abort codes; from include/rxrpc/packet.h. ET "RXK" == 0x1260B00 */ 102 case RXKADINCONSISTENCY: return -EPROTO; 103 case RXKADPACKETSHORT: return -EPROTO; 104 case RXKADLEVELFAIL: return -EKEYREJECTED; 105 case RXKADTICKETLEN: return -EKEYREJECTED; 106 case RXKADOUTOFSEQUENCE: return -EPROTO; 107 case RXKADNOAUTH: return -EKEYREJECTED; 108 case RXKADBADKEY: return -EKEYREJECTED; 109 case RXKADBADTICKET: return -EKEYREJECTED; 110 case RXKADUNKNOWNKEY: return -EKEYREJECTED; 111 case RXKADEXPIRED: return -EKEYEXPIRED; 112 case RXKADSEALEDINCON: return -EKEYREJECTED; 113 case RXKADDATALEN: return -EKEYREJECTED; 114 case RXKADILLEGALLEVEL: return -EKEYREJECTED; 115 116 case RXGEN_OPCODE: return -ENOTSUPP; 117 118 default: return -EREMOTEIO; 119 } 120 } 121 122 /* 123 * Select the error to report from a set of errors. 124 */ 125 void afs_prioritise_error(struct afs_error *e, int error, u32 abort_code) 126 { 127 switch (error) { 128 case 0: 129 return; 130 default: 131 if (e->error == -ETIMEDOUT || 132 e->error == -ETIME) 133 return; 134 /* Fall through */ 135 case -ETIMEDOUT: 136 case -ETIME: 137 if (e->error == -ENOMEM || 138 e->error == -ENONET) 139 return; 140 /* Fall through */ 141 case -ENOMEM: 142 case -ENONET: 143 if (e->error == -ERFKILL) 144 return; 145 /* Fall through */ 146 case -ERFKILL: 147 if (e->error == -EADDRNOTAVAIL) 148 return; 149 /* Fall through */ 150 case -EADDRNOTAVAIL: 151 if (e->error == -ENETUNREACH) 152 return; 153 /* Fall through */ 154 case -ENETUNREACH: 155 if (e->error == -EHOSTUNREACH) 156 return; 157 /* Fall through */ 158 case -EHOSTUNREACH: 159 if (e->error == -EHOSTDOWN) 160 return; 161 /* Fall through */ 162 case -EHOSTDOWN: 163 if (e->error == -ECONNREFUSED) 164 return; 165 /* Fall through */ 166 case -ECONNREFUSED: 167 if (e->error == -ECONNRESET) 168 return; 169 /* Fall through */ 170 case -ECONNRESET: /* Responded, but call expired. */ 171 if (e->responded) 172 return; 173 e->error = error; 174 return; 175 176 case -ECONNABORTED: 177 e->responded = true; 178 e->error = afs_abort_to_error(abort_code); 179 return; 180 } 181 } 182