1002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe#ifndef FIO_ERR_H
2002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe#define FIO_ERR_H
3002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
4002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe/*
5002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * Kernel pointers have redundant information, so we can use a
6002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * scheme where we can return either an error code or a dentry
7002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * pointer with the same return value.
8002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe *
9002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * This should be a per-architecture thing, to allow different
10002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe * error and pointer decisions.
11002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe */
12002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe#define MAX_ERRNO	4095
13002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
14e0739a728590d0890615a47988f3e79128e47a05Jens Axboe#define IS_ERR_VALUE(x) ((x) >= (uintptr_t)-MAX_ERRNO)
15002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
16e0739a728590d0890615a47988f3e79128e47a05Jens Axboestatic inline void *ERR_PTR(uintptr_t error)
17002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
18002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	return (void *) error;
19002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
20002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
21e0739a728590d0890615a47988f3e79128e47a05Jens Axboestatic inline uintptr_t PTR_ERR(const void *ptr)
22002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
23e0739a728590d0890615a47988f3e79128e47a05Jens Axboe	return (uintptr_t) ptr;
24002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
25002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
26e0739a728590d0890615a47988f3e79128e47a05Jens Axboestatic inline uintptr_t IS_ERR(const void *ptr)
27002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
28e0739a728590d0890615a47988f3e79128e47a05Jens Axboe	return IS_ERR_VALUE((uintptr_t)ptr);
29002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
30002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
31e0739a728590d0890615a47988f3e79128e47a05Jens Axboestatic inline uintptr_t IS_ERR_OR_NULL(const void *ptr)
32002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
33e0739a728590d0890615a47988f3e79128e47a05Jens Axboe	return !ptr || IS_ERR_VALUE((uintptr_t)ptr);
34002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
35002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
36002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboestatic inline int PTR_ERR_OR_ZERO(const void *ptr)
37002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe{
38002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	if (IS_ERR(ptr))
39002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		return PTR_ERR(ptr);
40002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe	else
41002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe		return 0;
42002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe}
43002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe
44002fe73409d1e3d5e7dfe2885f75885bfaf506bcJens Axboe#endif
45