Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /* miscellaneous bits
0003  *
0004  * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
0005  * Written by David Howells (dhowells@redhat.com)
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  * convert an AFS abort code to a Linux error number
0017  */
0018 int afs_abort_to_error(u32 abort_code)
0019 {
0020     switch (abort_code) {
0021         /* Low errno codes inserted into abort namespace */
0022     case 13:        return -EACCES;
0023     case 27:        return -EFBIG;
0024     case 30:        return -EROFS;
0025 
0026         /* VICE "special error" codes; 101 - 111 */
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         /* Volume Location server errors */
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         /* Unified AFS error table */
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         /* RXKAD abort codes; from include/rxrpc/packet.h.  ET "RXK" == 0x1260B00 */
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  * Select the error to report from a set of errors.
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: /* Responded, but call expired. */
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: /* Responded, but we seem to have changed address */
0170         e->responded = true;
0171         e->error = error;
0172         return;
0173     }
0174 }