^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* miscellaneous bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Written by David Howells (dhowells@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "afs_fs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "protocol_uae.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * convert an AFS abort code to a Linux error number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) int afs_abort_to_error(u32 abort_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) switch (abort_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) /* Low errno codes inserted into abort namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) case 13: return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) case 27: return -EFBIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) case 30: return -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* VICE "special error" codes; 101 - 111 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) case VSALVAGE: return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) case VNOVNODE: return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) case VNOVOL: return -ENOMEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) case VVOLEXISTS: return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) case VNOSERVICE: return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) case VOFFLINE: return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) case VONLINE: return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) case VDISKFULL: return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) case VOVERQUOTA: return -EDQUOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) case VBUSY: return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) case VMOVED: return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* Volume Location server errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) case AFSVL_IDEXIST: return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) case AFSVL_IO: return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) case AFSVL_NAMEEXIST: return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) case AFSVL_CREATEFAIL: return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) case AFSVL_NOENT: return -ENOMEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) case AFSVL_EMPTY: return -ENOMEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) case AFSVL_ENTDELETED: return -ENOMEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) case AFSVL_BADNAME: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) case AFSVL_BADINDEX: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) case AFSVL_BADVOLTYPE: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) case AFSVL_BADSERVER: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) case AFSVL_BADPARTITION: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) case AFSVL_REPSFULL: return -EFBIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) case AFSVL_NOREPSERVER: return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) case AFSVL_DUPREPSERVER: return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) case AFSVL_RWNOTFOUND: return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) case AFSVL_BADREFCOUNT: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) case AFSVL_SIZEEXCEEDED: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) case AFSVL_BADENTRY: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) case AFSVL_BADVOLIDBUMP: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) case AFSVL_IDALREADYHASHED: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) case AFSVL_ENTRYLOCKED: return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) case AFSVL_BADVOLOPER: return -EBADRQC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) case AFSVL_BADRELLOCKTYPE: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) case AFSVL_RERELEASE: return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) case AFSVL_BADSERVERFLAG: return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) case AFSVL_PERM: return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) case AFSVL_NOMEM: return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* Unified AFS error table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) case UAEPERM: return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) case UAENOENT: return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) case UAEACCES: return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) case UAEBUSY: return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) case UAEEXIST: return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) case UAENOTDIR: return -ENOTDIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) case UAEISDIR: return -EISDIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) case UAEFBIG: return -EFBIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) case UAENOSPC: return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) case UAEROFS: return -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) case UAEMLINK: return -EMLINK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) case UAEDEADLK: return -EDEADLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) case UAENAMETOOLONG: return -ENAMETOOLONG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) case UAENOLCK: return -ENOLCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) case UAENOTEMPTY: return -ENOTEMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) case UAELOOP: return -ELOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) case UAEOVERFLOW: return -EOVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) case UAENOMEDIUM: return -ENOMEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) case UAEDQUOT: return -EDQUOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* RXKAD abort codes; from include/rxrpc/packet.h. ET "RXK" == 0x1260B00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) case RXKADINCONSISTENCY: return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) case RXKADPACKETSHORT: return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) case RXKADLEVELFAIL: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) case RXKADTICKETLEN: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) case RXKADOUTOFSEQUENCE: return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) case RXKADNOAUTH: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) case RXKADBADKEY: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) case RXKADBADTICKET: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) case RXKADUNKNOWNKEY: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) case RXKADEXPIRED: return -EKEYEXPIRED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) case RXKADSEALEDINCON: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) case RXKADDATALEN: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) case RXKADILLEGALLEVEL: return -EKEYREJECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) case RXGEN_OPCODE: return -ENOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) default: return -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * Select the error to report from a set of errors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) void afs_prioritise_error(struct afs_error *e, int error, u32 abort_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) switch (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) if (e->error == -ETIMEDOUT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) e->error == -ETIME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) case -ETIMEDOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) case -ETIME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) if (e->error == -ENOMEM ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) e->error == -ENONET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) case -ENOMEM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) case -ENONET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) if (e->error == -ERFKILL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) case -ERFKILL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) if (e->error == -EADDRNOTAVAIL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) case -EADDRNOTAVAIL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) if (e->error == -ENETUNREACH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) case -ENETUNREACH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (e->error == -EHOSTUNREACH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) case -EHOSTUNREACH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if (e->error == -EHOSTDOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) case -EHOSTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (e->error == -ECONNREFUSED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) case -ECONNREFUSED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) if (e->error == -ECONNRESET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) case -ECONNRESET: /* Responded, but call expired. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) if (e->responded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) e->error = error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) case -ECONNABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) e->responded = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) e->error = afs_abort_to_error(abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) }