xref: /OK3568_Linux_fs/kernel/fs/afs/misc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun int 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*4882a593Smuzhiyun void 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