Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
error.c
Go to the documentation of this file.
1 /*
2  * linux/fs/9p/error.c
3  *
4  * Error string handling
5  *
6  * Plan 9 uses error strings, Unix uses error numbers. These functions
7  * try to help manage that and provide for dynamically adding error
8  * mappings.
9  *
10  * Copyright (C) 2004 by Eric Van Hensbergen <[email protected]>
11  * Copyright (C) 2002 by Ron Minnich <[email protected]>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License version 2
15  * as published by the Free Software Foundation.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to:
24  * Free Software Foundation
25  * 51 Franklin Street, Fifth Floor
26  * Boston, MA 02111-1301 USA
27  *
28  */
29 
30 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 
32 #include <linux/module.h>
33 #include <linux/list.h>
34 #include <linux/jhash.h>
35 #include <linux/errno.h>
36 #include <net/9p/9p.h>
37 
45 struct errormap {
46  char *name;
47  int val;
48 
49  int namelen;
50  struct hlist_node list;
51 };
52 
53 #define ERRHASHSZ 32
54 static struct hlist_head hash_errmap[ERRHASHSZ];
55 
56 /* FixMe - reduce to a reasonable size */
57 static struct errormap errmap[] = {
58  {"Operation not permitted", EPERM},
59  {"wstat prohibited", EPERM},
60  {"No such file or directory", ENOENT},
61  {"directory entry not found", ENOENT},
62  {"file not found", ENOENT},
63  {"Interrupted system call", EINTR},
64  {"Input/output error", EIO},
65  {"No such device or address", ENXIO},
66  {"Argument list too long", E2BIG},
67  {"Bad file descriptor", EBADF},
68  {"Resource temporarily unavailable", EAGAIN},
69  {"Cannot allocate memory", ENOMEM},
70  {"Permission denied", EACCES},
71  {"Bad address", EFAULT},
72  {"Block device required", ENOTBLK},
73  {"Device or resource busy", EBUSY},
74  {"File exists", EEXIST},
75  {"Invalid cross-device link", EXDEV},
76  {"No such device", ENODEV},
77  {"Not a directory", ENOTDIR},
78  {"Is a directory", EISDIR},
79  {"Invalid argument", EINVAL},
80  {"Too many open files in system", ENFILE},
81  {"Too many open files", EMFILE},
82  {"Text file busy", ETXTBSY},
83  {"File too large", EFBIG},
84  {"No space left on device", ENOSPC},
85  {"Illegal seek", ESPIPE},
86  {"Read-only file system", EROFS},
87  {"Too many links", EMLINK},
88  {"Broken pipe", EPIPE},
89  {"Numerical argument out of domain", EDOM},
90  {"Numerical result out of range", ERANGE},
91  {"Resource deadlock avoided", EDEADLK},
92  {"File name too long", ENAMETOOLONG},
93  {"No locks available", ENOLCK},
94  {"Function not implemented", ENOSYS},
95  {"Directory not empty", ENOTEMPTY},
96  {"Too many levels of symbolic links", ELOOP},
97  {"No message of desired type", ENOMSG},
98  {"Identifier removed", EIDRM},
99  {"No data available", ENODATA},
100  {"Machine is not on the network", ENONET},
101  {"Package not installed", ENOPKG},
102  {"Object is remote", EREMOTE},
103  {"Link has been severed", ENOLINK},
104  {"Communication error on send", ECOMM},
105  {"Protocol error", EPROTO},
106  {"Bad message", EBADMSG},
107  {"File descriptor in bad state", EBADFD},
108  {"Streams pipe error", ESTRPIPE},
109  {"Too many users", EUSERS},
110  {"Socket operation on non-socket", ENOTSOCK},
111  {"Message too long", EMSGSIZE},
112  {"Protocol not available", ENOPROTOOPT},
113  {"Protocol not supported", EPROTONOSUPPORT},
114  {"Socket type not supported", ESOCKTNOSUPPORT},
115  {"Operation not supported", EOPNOTSUPP},
116  {"Protocol family not supported", EPFNOSUPPORT},
117  {"Network is down", ENETDOWN},
118  {"Network is unreachable", ENETUNREACH},
119  {"Network dropped connection on reset", ENETRESET},
120  {"Software caused connection abort", ECONNABORTED},
121  {"Connection reset by peer", ECONNRESET},
122  {"No buffer space available", ENOBUFS},
123  {"Transport endpoint is already connected", EISCONN},
124  {"Transport endpoint is not connected", ENOTCONN},
125  {"Cannot send after transport endpoint shutdown", ESHUTDOWN},
126  {"Connection timed out", ETIMEDOUT},
127  {"Connection refused", ECONNREFUSED},
128  {"Host is down", EHOSTDOWN},
129  {"No route to host", EHOSTUNREACH},
130  {"Operation already in progress", EALREADY},
131  {"Operation now in progress", EINPROGRESS},
132  {"Is a named type file", EISNAM},
133  {"Remote I/O error", EREMOTEIO},
134  {"Disk quota exceeded", EDQUOT},
135 /* errors from fossil, vacfs, and u9fs */
136  {"fid unknown or out of range", EBADF},
137  {"permission denied", EACCES},
138  {"file does not exist", ENOENT},
139  {"authentication failed", ECONNREFUSED},
140  {"bad offset in directory read", ESPIPE},
141  {"bad use of fid", EBADF},
142  {"wstat can't convert between files and directories", EPERM},
143  {"directory is not empty", ENOTEMPTY},
144  {"file exists", EEXIST},
145  {"file already exists", EEXIST},
146  {"file or directory already exists", EEXIST},
147  {"fid already in use", EBADF},
148  {"file in use", ETXTBSY},
149  {"i/o error", EIO},
150  {"file already open for I/O", ETXTBSY},
151  {"illegal mode", EINVAL},
152  {"illegal name", ENAMETOOLONG},
153  {"not a directory", ENOTDIR},
154  {"not a member of proposed group", EPERM},
155  {"not owner", EACCES},
156  {"only owner can change group in wstat", EACCES},
157  {"read only file system", EROFS},
158  {"no access to special file", EPERM},
159  {"i/o count too large", EIO},
160  {"unknown group", EINVAL},
161  {"unknown user", EINVAL},
162  {"bogus wstat buffer", EPROTO},
163  {"exclusive use file already open", EAGAIN},
164  {"corrupted directory entry", EIO},
165  {"corrupted file entry", EIO},
166  {"corrupted block label", EIO},
167  {"corrupted meta data", EIO},
168  {"illegal offset", EINVAL},
169  {"illegal path element", ENOENT},
170  {"root of file system is corrupted", EIO},
171  {"corrupted super block", EIO},
172  {"protocol botch", EPROTO},
173  {"file system is full", ENOSPC},
174  {"file is in use", EAGAIN},
175  {"directory entry is not allocated", ENOENT},
176  {"file is read only", EROFS},
177  {"file has been removed", EIDRM},
178  {"only support truncation to zero length", EPERM},
179  {"cannot remove root", EPERM},
180  {"file too big", EFBIG},
181  {"venti i/o error", EIO},
182  /* these are not errors */
183  {"u9fs rhostsauth: no authentication required", 0},
184  {"u9fs authnone: no authentication required", 0},
185  {NULL, -1}
186 };
187 
193 int p9_error_init(void)
194 {
195  struct errormap *c;
196  int bucket;
197 
198  /* initialize hash table */
199  for (bucket = 0; bucket < ERRHASHSZ; bucket++)
200  INIT_HLIST_HEAD(&hash_errmap[bucket]);
201 
202  /* load initial error map into hash table */
203  for (c = errmap; c->name != NULL; c++) {
204  c->namelen = strlen(c->name);
205  bucket = jhash(c->name, c->namelen, 0) % ERRHASHSZ;
206  INIT_HLIST_NODE(&c->list);
207  hlist_add_head(&c->list, &hash_errmap[bucket]);
208  }
209 
210  return 1;
211 }
213 
221 int p9_errstr2errno(char *errstr, int len)
222 {
223  int errno;
224  struct hlist_node *p;
225  struct errormap *c;
226  int bucket;
227 
228  errno = 0;
229  p = NULL;
230  c = NULL;
231  bucket = jhash(errstr, len, 0) % ERRHASHSZ;
232  hlist_for_each_entry(c, p, &hash_errmap[bucket], list) {
233  if (c->namelen == len && !memcmp(c->name, errstr, len)) {
234  errno = c->val;
235  break;
236  }
237  }
238 
239  if (errno == 0) {
240  /* TODO: if error isn't found, add it dynamically */
241  errstr[len] = 0;
242  pr_err("%s: server reported unknown error %s\n",
243  __func__, errstr);
244  errno = ESERVERFAULT;
245  }
246 
247  return -errno;
248 }