162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* miscellaneous bits 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved. 562306a36Sopenharmony_ci * Written by David Howells (dhowells@redhat.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/kernel.h> 962306a36Sopenharmony_ci#include <linux/module.h> 1062306a36Sopenharmony_ci#include <linux/errno.h> 1162306a36Sopenharmony_ci#include "internal.h" 1262306a36Sopenharmony_ci#include "afs_fs.h" 1362306a36Sopenharmony_ci#include "protocol_uae.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* 1662306a36Sopenharmony_ci * convert an AFS abort code to a Linux error number 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ciint afs_abort_to_error(u32 abort_code) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci switch (abort_code) { 2162306a36Sopenharmony_ci /* Low errno codes inserted into abort namespace */ 2262306a36Sopenharmony_ci case 13: return -EACCES; 2362306a36Sopenharmony_ci case 27: return -EFBIG; 2462306a36Sopenharmony_ci case 30: return -EROFS; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci /* VICE "special error" codes; 101 - 111 */ 2762306a36Sopenharmony_ci case VSALVAGE: return -EIO; 2862306a36Sopenharmony_ci case VNOVNODE: return -ENOENT; 2962306a36Sopenharmony_ci case VNOVOL: return -ENOMEDIUM; 3062306a36Sopenharmony_ci case VVOLEXISTS: return -EEXIST; 3162306a36Sopenharmony_ci case VNOSERVICE: return -EIO; 3262306a36Sopenharmony_ci case VOFFLINE: return -ENOENT; 3362306a36Sopenharmony_ci case VONLINE: return -EEXIST; 3462306a36Sopenharmony_ci case VDISKFULL: return -ENOSPC; 3562306a36Sopenharmony_ci case VOVERQUOTA: return -EDQUOT; 3662306a36Sopenharmony_ci case VBUSY: return -EBUSY; 3762306a36Sopenharmony_ci case VMOVED: return -ENXIO; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci /* Volume Location server errors */ 4062306a36Sopenharmony_ci case AFSVL_IDEXIST: return -EEXIST; 4162306a36Sopenharmony_ci case AFSVL_IO: return -EREMOTEIO; 4262306a36Sopenharmony_ci case AFSVL_NAMEEXIST: return -EEXIST; 4362306a36Sopenharmony_ci case AFSVL_CREATEFAIL: return -EREMOTEIO; 4462306a36Sopenharmony_ci case AFSVL_NOENT: return -ENOMEDIUM; 4562306a36Sopenharmony_ci case AFSVL_EMPTY: return -ENOMEDIUM; 4662306a36Sopenharmony_ci case AFSVL_ENTDELETED: return -ENOMEDIUM; 4762306a36Sopenharmony_ci case AFSVL_BADNAME: return -EINVAL; 4862306a36Sopenharmony_ci case AFSVL_BADINDEX: return -EINVAL; 4962306a36Sopenharmony_ci case AFSVL_BADVOLTYPE: return -EINVAL; 5062306a36Sopenharmony_ci case AFSVL_BADSERVER: return -EINVAL; 5162306a36Sopenharmony_ci case AFSVL_BADPARTITION: return -EINVAL; 5262306a36Sopenharmony_ci case AFSVL_REPSFULL: return -EFBIG; 5362306a36Sopenharmony_ci case AFSVL_NOREPSERVER: return -ENOENT; 5462306a36Sopenharmony_ci case AFSVL_DUPREPSERVER: return -EEXIST; 5562306a36Sopenharmony_ci case AFSVL_RWNOTFOUND: return -ENOENT; 5662306a36Sopenharmony_ci case AFSVL_BADREFCOUNT: return -EINVAL; 5762306a36Sopenharmony_ci case AFSVL_SIZEEXCEEDED: return -EINVAL; 5862306a36Sopenharmony_ci case AFSVL_BADENTRY: return -EINVAL; 5962306a36Sopenharmony_ci case AFSVL_BADVOLIDBUMP: return -EINVAL; 6062306a36Sopenharmony_ci case AFSVL_IDALREADYHASHED: return -EINVAL; 6162306a36Sopenharmony_ci case AFSVL_ENTRYLOCKED: return -EBUSY; 6262306a36Sopenharmony_ci case AFSVL_BADVOLOPER: return -EBADRQC; 6362306a36Sopenharmony_ci case AFSVL_BADRELLOCKTYPE: return -EINVAL; 6462306a36Sopenharmony_ci case AFSVL_RERELEASE: return -EREMOTEIO; 6562306a36Sopenharmony_ci case AFSVL_BADSERVERFLAG: return -EINVAL; 6662306a36Sopenharmony_ci case AFSVL_PERM: return -EACCES; 6762306a36Sopenharmony_ci case AFSVL_NOMEM: return -EREMOTEIO; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci /* Unified AFS error table */ 7062306a36Sopenharmony_ci case UAEPERM: return -EPERM; 7162306a36Sopenharmony_ci case UAENOENT: return -ENOENT; 7262306a36Sopenharmony_ci case UAEAGAIN: return -EAGAIN; 7362306a36Sopenharmony_ci case UAEACCES: return -EACCES; 7462306a36Sopenharmony_ci case UAEBUSY: return -EBUSY; 7562306a36Sopenharmony_ci case UAEEXIST: return -EEXIST; 7662306a36Sopenharmony_ci case UAENOTDIR: return -ENOTDIR; 7762306a36Sopenharmony_ci case UAEISDIR: return -EISDIR; 7862306a36Sopenharmony_ci case UAEFBIG: return -EFBIG; 7962306a36Sopenharmony_ci case UAENOSPC: return -ENOSPC; 8062306a36Sopenharmony_ci case UAEROFS: return -EROFS; 8162306a36Sopenharmony_ci case UAEMLINK: return -EMLINK; 8262306a36Sopenharmony_ci case UAEDEADLK: return -EDEADLK; 8362306a36Sopenharmony_ci case UAENAMETOOLONG: return -ENAMETOOLONG; 8462306a36Sopenharmony_ci case UAENOLCK: return -ENOLCK; 8562306a36Sopenharmony_ci case UAENOTEMPTY: return -ENOTEMPTY; 8662306a36Sopenharmony_ci case UAELOOP: return -ELOOP; 8762306a36Sopenharmony_ci case UAEOVERFLOW: return -EOVERFLOW; 8862306a36Sopenharmony_ci case UAENOMEDIUM: return -ENOMEDIUM; 8962306a36Sopenharmony_ci case UAEDQUOT: return -EDQUOT; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci /* RXKAD abort codes; from include/rxrpc/packet.h. ET "RXK" == 0x1260B00 */ 9262306a36Sopenharmony_ci case RXKADINCONSISTENCY: return -EPROTO; 9362306a36Sopenharmony_ci case RXKADPACKETSHORT: return -EPROTO; 9462306a36Sopenharmony_ci case RXKADLEVELFAIL: return -EKEYREJECTED; 9562306a36Sopenharmony_ci case RXKADTICKETLEN: return -EKEYREJECTED; 9662306a36Sopenharmony_ci case RXKADOUTOFSEQUENCE: return -EPROTO; 9762306a36Sopenharmony_ci case RXKADNOAUTH: return -EKEYREJECTED; 9862306a36Sopenharmony_ci case RXKADBADKEY: return -EKEYREJECTED; 9962306a36Sopenharmony_ci case RXKADBADTICKET: return -EKEYREJECTED; 10062306a36Sopenharmony_ci case RXKADUNKNOWNKEY: return -EKEYREJECTED; 10162306a36Sopenharmony_ci case RXKADEXPIRED: return -EKEYEXPIRED; 10262306a36Sopenharmony_ci case RXKADSEALEDINCON: return -EKEYREJECTED; 10362306a36Sopenharmony_ci case RXKADDATALEN: return -EKEYREJECTED; 10462306a36Sopenharmony_ci case RXKADILLEGALLEVEL: return -EKEYREJECTED; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci case RXGEN_OPCODE: return -ENOTSUPP; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci default: return -EREMOTEIO; 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* 11362306a36Sopenharmony_ci * Select the error to report from a set of errors. 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_civoid afs_prioritise_error(struct afs_error *e, int error, u32 abort_code) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci switch (error) { 11862306a36Sopenharmony_ci case 0: 11962306a36Sopenharmony_ci return; 12062306a36Sopenharmony_ci default: 12162306a36Sopenharmony_ci if (e->error == -ETIMEDOUT || 12262306a36Sopenharmony_ci e->error == -ETIME) 12362306a36Sopenharmony_ci return; 12462306a36Sopenharmony_ci fallthrough; 12562306a36Sopenharmony_ci case -ETIMEDOUT: 12662306a36Sopenharmony_ci case -ETIME: 12762306a36Sopenharmony_ci if (e->error == -ENOMEM || 12862306a36Sopenharmony_ci e->error == -ENONET) 12962306a36Sopenharmony_ci return; 13062306a36Sopenharmony_ci fallthrough; 13162306a36Sopenharmony_ci case -ENOMEM: 13262306a36Sopenharmony_ci case -ENONET: 13362306a36Sopenharmony_ci if (e->error == -ERFKILL) 13462306a36Sopenharmony_ci return; 13562306a36Sopenharmony_ci fallthrough; 13662306a36Sopenharmony_ci case -ERFKILL: 13762306a36Sopenharmony_ci if (e->error == -EADDRNOTAVAIL) 13862306a36Sopenharmony_ci return; 13962306a36Sopenharmony_ci fallthrough; 14062306a36Sopenharmony_ci case -EADDRNOTAVAIL: 14162306a36Sopenharmony_ci if (e->error == -ENETUNREACH) 14262306a36Sopenharmony_ci return; 14362306a36Sopenharmony_ci fallthrough; 14462306a36Sopenharmony_ci case -ENETUNREACH: 14562306a36Sopenharmony_ci if (e->error == -EHOSTUNREACH) 14662306a36Sopenharmony_ci return; 14762306a36Sopenharmony_ci fallthrough; 14862306a36Sopenharmony_ci case -EHOSTUNREACH: 14962306a36Sopenharmony_ci if (e->error == -EHOSTDOWN) 15062306a36Sopenharmony_ci return; 15162306a36Sopenharmony_ci fallthrough; 15262306a36Sopenharmony_ci case -EHOSTDOWN: 15362306a36Sopenharmony_ci if (e->error == -ECONNREFUSED) 15462306a36Sopenharmony_ci return; 15562306a36Sopenharmony_ci fallthrough; 15662306a36Sopenharmony_ci case -ECONNREFUSED: 15762306a36Sopenharmony_ci if (e->error == -ECONNRESET) 15862306a36Sopenharmony_ci return; 15962306a36Sopenharmony_ci fallthrough; 16062306a36Sopenharmony_ci case -ECONNRESET: /* Responded, but call expired. */ 16162306a36Sopenharmony_ci if (e->responded) 16262306a36Sopenharmony_ci return; 16362306a36Sopenharmony_ci e->error = error; 16462306a36Sopenharmony_ci return; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci case -ECONNABORTED: 16762306a36Sopenharmony_ci error = afs_abort_to_error(abort_code); 16862306a36Sopenharmony_ci fallthrough; 16962306a36Sopenharmony_ci case -ENETRESET: /* Responded, but we seem to have changed address */ 17062306a36Sopenharmony_ci e->responded = true; 17162306a36Sopenharmony_ci e->error = error; 17262306a36Sopenharmony_ci return; 17362306a36Sopenharmony_ci } 17462306a36Sopenharmony_ci} 175