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