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