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