0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/kernel.h>
0009 #include <linux/module.h>
0010 #include <linux/errno.h>
0011 #include "internal.h"
0012 #include "afs_fs.h"
0013 #include "protocol_uae.h"
0014
0015
0016
0017
0018 int afs_abort_to_error(u32 abort_code)
0019 {
0020 switch (abort_code) {
0021
0022 case 13: return -EACCES;
0023 case 27: return -EFBIG;
0024 case 30: return -EROFS;
0025
0026
0027 case VSALVAGE: return -EIO;
0028 case VNOVNODE: return -ENOENT;
0029 case VNOVOL: return -ENOMEDIUM;
0030 case VVOLEXISTS: return -EEXIST;
0031 case VNOSERVICE: return -EIO;
0032 case VOFFLINE: return -ENOENT;
0033 case VONLINE: return -EEXIST;
0034 case VDISKFULL: return -ENOSPC;
0035 case VOVERQUOTA: return -EDQUOT;
0036 case VBUSY: return -EBUSY;
0037 case VMOVED: return -ENXIO;
0038
0039
0040 case AFSVL_IDEXIST: return -EEXIST;
0041 case AFSVL_IO: return -EREMOTEIO;
0042 case AFSVL_NAMEEXIST: return -EEXIST;
0043 case AFSVL_CREATEFAIL: return -EREMOTEIO;
0044 case AFSVL_NOENT: return -ENOMEDIUM;
0045 case AFSVL_EMPTY: return -ENOMEDIUM;
0046 case AFSVL_ENTDELETED: return -ENOMEDIUM;
0047 case AFSVL_BADNAME: return -EINVAL;
0048 case AFSVL_BADINDEX: return -EINVAL;
0049 case AFSVL_BADVOLTYPE: return -EINVAL;
0050 case AFSVL_BADSERVER: return -EINVAL;
0051 case AFSVL_BADPARTITION: return -EINVAL;
0052 case AFSVL_REPSFULL: return -EFBIG;
0053 case AFSVL_NOREPSERVER: return -ENOENT;
0054 case AFSVL_DUPREPSERVER: return -EEXIST;
0055 case AFSVL_RWNOTFOUND: return -ENOENT;
0056 case AFSVL_BADREFCOUNT: return -EINVAL;
0057 case AFSVL_SIZEEXCEEDED: return -EINVAL;
0058 case AFSVL_BADENTRY: return -EINVAL;
0059 case AFSVL_BADVOLIDBUMP: return -EINVAL;
0060 case AFSVL_IDALREADYHASHED: return -EINVAL;
0061 case AFSVL_ENTRYLOCKED: return -EBUSY;
0062 case AFSVL_BADVOLOPER: return -EBADRQC;
0063 case AFSVL_BADRELLOCKTYPE: return -EINVAL;
0064 case AFSVL_RERELEASE: return -EREMOTEIO;
0065 case AFSVL_BADSERVERFLAG: return -EINVAL;
0066 case AFSVL_PERM: return -EACCES;
0067 case AFSVL_NOMEM: return -EREMOTEIO;
0068
0069
0070 case UAEPERM: return -EPERM;
0071 case UAENOENT: return -ENOENT;
0072 case UAEAGAIN: return -EAGAIN;
0073 case UAEACCES: return -EACCES;
0074 case UAEBUSY: return -EBUSY;
0075 case UAEEXIST: return -EEXIST;
0076 case UAENOTDIR: return -ENOTDIR;
0077 case UAEISDIR: return -EISDIR;
0078 case UAEFBIG: return -EFBIG;
0079 case UAENOSPC: return -ENOSPC;
0080 case UAEROFS: return -EROFS;
0081 case UAEMLINK: return -EMLINK;
0082 case UAEDEADLK: return -EDEADLK;
0083 case UAENAMETOOLONG: return -ENAMETOOLONG;
0084 case UAENOLCK: return -ENOLCK;
0085 case UAENOTEMPTY: return -ENOTEMPTY;
0086 case UAELOOP: return -ELOOP;
0087 case UAEOVERFLOW: return -EOVERFLOW;
0088 case UAENOMEDIUM: return -ENOMEDIUM;
0089 case UAEDQUOT: return -EDQUOT;
0090
0091
0092 case RXKADINCONSISTENCY: return -EPROTO;
0093 case RXKADPACKETSHORT: return -EPROTO;
0094 case RXKADLEVELFAIL: return -EKEYREJECTED;
0095 case RXKADTICKETLEN: return -EKEYREJECTED;
0096 case RXKADOUTOFSEQUENCE: return -EPROTO;
0097 case RXKADNOAUTH: return -EKEYREJECTED;
0098 case RXKADBADKEY: return -EKEYREJECTED;
0099 case RXKADBADTICKET: return -EKEYREJECTED;
0100 case RXKADUNKNOWNKEY: return -EKEYREJECTED;
0101 case RXKADEXPIRED: return -EKEYEXPIRED;
0102 case RXKADSEALEDINCON: return -EKEYREJECTED;
0103 case RXKADDATALEN: return -EKEYREJECTED;
0104 case RXKADILLEGALLEVEL: return -EKEYREJECTED;
0105
0106 case RXGEN_OPCODE: return -ENOTSUPP;
0107
0108 default: return -EREMOTEIO;
0109 }
0110 }
0111
0112
0113
0114
0115 void afs_prioritise_error(struct afs_error *e, int error, u32 abort_code)
0116 {
0117 switch (error) {
0118 case 0:
0119 return;
0120 default:
0121 if (e->error == -ETIMEDOUT ||
0122 e->error == -ETIME)
0123 return;
0124 fallthrough;
0125 case -ETIMEDOUT:
0126 case -ETIME:
0127 if (e->error == -ENOMEM ||
0128 e->error == -ENONET)
0129 return;
0130 fallthrough;
0131 case -ENOMEM:
0132 case -ENONET:
0133 if (e->error == -ERFKILL)
0134 return;
0135 fallthrough;
0136 case -ERFKILL:
0137 if (e->error == -EADDRNOTAVAIL)
0138 return;
0139 fallthrough;
0140 case -EADDRNOTAVAIL:
0141 if (e->error == -ENETUNREACH)
0142 return;
0143 fallthrough;
0144 case -ENETUNREACH:
0145 if (e->error == -EHOSTUNREACH)
0146 return;
0147 fallthrough;
0148 case -EHOSTUNREACH:
0149 if (e->error == -EHOSTDOWN)
0150 return;
0151 fallthrough;
0152 case -EHOSTDOWN:
0153 if (e->error == -ECONNREFUSED)
0154 return;
0155 fallthrough;
0156 case -ECONNREFUSED:
0157 if (e->error == -ECONNRESET)
0158 return;
0159 fallthrough;
0160 case -ECONNRESET:
0161 if (e->responded)
0162 return;
0163 e->error = error;
0164 return;
0165
0166 case -ECONNABORTED:
0167 error = afs_abort_to_error(abort_code);
0168 fallthrough;
0169 case -ENETRESET:
0170 e->responded = true;
0171 e->error = error;
0172 return;
0173 }
0174 }