GNU Linux-libre 6.1.86-gnu
[releases.git] / fs / afs / misc.c
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  */
18 int 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 UAEAGAIN:                  return -EAGAIN;
73         case UAEACCES:                  return -EACCES;
74         case UAEBUSY:                   return -EBUSY;
75         case UAEEXIST:                  return -EEXIST;
76         case UAENOTDIR:                 return -ENOTDIR;
77         case UAEISDIR:                  return -EISDIR;
78         case UAEFBIG:                   return -EFBIG;
79         case UAENOSPC:                  return -ENOSPC;
80         case UAEROFS:                   return -EROFS;
81         case UAEMLINK:                  return -EMLINK;
82         case UAEDEADLK:                 return -EDEADLK;
83         case UAENAMETOOLONG:            return -ENAMETOOLONG;
84         case UAENOLCK:                  return -ENOLCK;
85         case UAENOTEMPTY:               return -ENOTEMPTY;
86         case UAELOOP:                   return -ELOOP;
87         case UAEOVERFLOW:               return -EOVERFLOW;
88         case UAENOMEDIUM:               return -ENOMEDIUM;
89         case UAEDQUOT:                  return -EDQUOT;
90
91                 /* RXKAD abort codes; from include/rxrpc/packet.h.  ET "RXK" == 0x1260B00 */
92         case RXKADINCONSISTENCY: return -EPROTO;
93         case RXKADPACKETSHORT:  return -EPROTO;
94         case RXKADLEVELFAIL:    return -EKEYREJECTED;
95         case RXKADTICKETLEN:    return -EKEYREJECTED;
96         case RXKADOUTOFSEQUENCE: return -EPROTO;
97         case RXKADNOAUTH:       return -EKEYREJECTED;
98         case RXKADBADKEY:       return -EKEYREJECTED;
99         case RXKADBADTICKET:    return -EKEYREJECTED;
100         case RXKADUNKNOWNKEY:   return -EKEYREJECTED;
101         case RXKADEXPIRED:      return -EKEYEXPIRED;
102         case RXKADSEALEDINCON:  return -EKEYREJECTED;
103         case RXKADDATALEN:      return -EKEYREJECTED;
104         case RXKADILLEGALLEVEL: return -EKEYREJECTED;
105
106         case RXGEN_OPCODE:      return -ENOTSUPP;
107
108         default:                return -EREMOTEIO;
109         }
110 }
111
112 /*
113  * Select the error to report from a set of errors.
114  */
115 void afs_prioritise_error(struct afs_error *e, int error, u32 abort_code)
116 {
117         switch (error) {
118         case 0:
119                 return;
120         default:
121                 if (e->error == -ETIMEDOUT ||
122                     e->error == -ETIME)
123                         return;
124                 fallthrough;
125         case -ETIMEDOUT:
126         case -ETIME:
127                 if (e->error == -ENOMEM ||
128                     e->error == -ENONET)
129                         return;
130                 fallthrough;
131         case -ENOMEM:
132         case -ENONET:
133                 if (e->error == -ERFKILL)
134                         return;
135                 fallthrough;
136         case -ERFKILL:
137                 if (e->error == -EADDRNOTAVAIL)
138                         return;
139                 fallthrough;
140         case -EADDRNOTAVAIL:
141                 if (e->error == -ENETUNREACH)
142                         return;
143                 fallthrough;
144         case -ENETUNREACH:
145                 if (e->error == -EHOSTUNREACH)
146                         return;
147                 fallthrough;
148         case -EHOSTUNREACH:
149                 if (e->error == -EHOSTDOWN)
150                         return;
151                 fallthrough;
152         case -EHOSTDOWN:
153                 if (e->error == -ECONNREFUSED)
154                         return;
155                 fallthrough;
156         case -ECONNREFUSED:
157                 if (e->error == -ECONNRESET)
158                         return;
159                 fallthrough;
160         case -ECONNRESET: /* Responded, but call expired. */
161                 if (e->responded)
162                         return;
163                 e->error = error;
164                 return;
165
166         case -ECONNABORTED:
167                 error = afs_abort_to_error(abort_code);
168                 fallthrough;
169         case -ENETRESET: /* Responded, but we seem to have changed address */
170                 e->responded = true;
171                 e->error = error;
172                 return;
173         }
174 }