94 lines
3.6 KiB
C
94 lines
3.6 KiB
C
#include <common/storage/StorageErrors.h>
|
|
#include <common/Common.h>
|
|
|
|
|
|
#define __FHGFSOPS_ERRLIST_SIZE \
|
|
( (sizeof(__FHGFSOPS_ERRLIST) ) / (sizeof(struct FhgfsOpsErrListEntry) ) - 1)
|
|
/* -1 because last elem is NULL */
|
|
|
|
|
|
|
|
// Note: This is based on the FhgfsOpsErr entries
|
|
// Note: We use EREMOTEIO as a generic error here
|
|
struct FhgfsOpsErrListEntry const __FHGFSOPS_ERRLIST[] =
|
|
{
|
|
{"Success", 0}, // FhgfsOpsErr_SUCCESS
|
|
{"Internal error", EREMOTEIO}, // FhgfsOpsErr_INTERNAL
|
|
{"Interrupted system call", EINTR}, // FhgfsOpsErr_INTERRUPTED
|
|
{"Communication error", ECOMM}, // FhgfsOpsErr_COMMUNICATION
|
|
{"Communication timeout", ETIMEDOUT}, // FhgfsOpsErr_COMMTIMEDOUT
|
|
{"Unknown node", EREMOTEIO}, // FhgfsOpsErr_UNKNOWNNODE
|
|
{"Node is not owner of entry", EREMOTEIO}, // FhgfsOpsErr_NOTOWNER
|
|
{"Entry exists already", EEXIST}, // FhgfsOpsErr_EXISTS
|
|
{"Path does not exist", ENOENT}, // FhgfsOpsErr_PATHNOTEXISTS
|
|
{"Entry is in use", EBUSY}, // FhgfsOpsErr_INUSE
|
|
{"Dynamic attributes of entry are outdated", EREMOTEIO}, // FhgfsOpsErr_INUSE
|
|
{"Removed", 999}, // former FhgfsOpsErr_PARENTTOSUBDIR, not used
|
|
{"Entry is not a directory", ENOTDIR}, // FhgfsOpsErr_NOTADIR
|
|
{"Directory is not empty", ENOTEMPTY}, // FhgfsOpsErr_NOTEMPTY
|
|
{"No space left", ENOSPC}, // FhgfsOpsErr_NOSPACE
|
|
{"Unknown storage target", EREMOTEIO}, // FhgfsOpsErr_UNKNOWNTARGET
|
|
{"Operation would block", EWOULDBLOCK}, // FhgfsOpsErr_WOULDBLOCK
|
|
{"Inode not inlined", EREMOTEIO}, // FhgfsOpsErr_INODENOTINLINED
|
|
{"Underlying file system error", EREMOTEIO}, // FhgfsOpsErr_SAVEERROR
|
|
{"Argument too large", EFBIG}, // FhgfsOpsErr_TOOBIG
|
|
{"Invalid argument", EINVAL}, // FhgfsOpsErr_INVAL
|
|
{"Bad memory address", EFAULT}, // FhgfsOpsErr_ADDRESSFAULT
|
|
{"Try again", EAGAIN}, // FhgfsOpsErr_AGAIN
|
|
{"Potential cache loss for open file handle. (Server crash detected.)" , EREMOTEIO}, /*
|
|
FhgfsOpsErr_STORAGE_SRV_CRASHED*/
|
|
{"Permission denied", EPERM}, // FhgfsOpsErr_PERM
|
|
{"Quota exceeded", EDQUOT}, // FhgfsOpsErr_DQUOT
|
|
{"Out of memory", ENOMEM}, // FhgfsOpsErr_OUTOFMEM
|
|
{"Numerical result out of range", ERANGE}, // FhgfsOpsErr_RANGE
|
|
{"No data available", ENODATA}, // FhgfsOpsErr_NODATA
|
|
{"Operation not supported", EOPNOTSUPP}, // FhgfsOpsErr_NOTSUPP
|
|
{"Argument list too long", E2BIG}, // FhgfsOpsErr_TOOLONG
|
|
{"Metadata version mismatch", ESTALE}, // FhgfsOpsErr_METAVERSIONMISMATCH
|
|
{"Inode is locked", EBUSY}, // FhgfsOpsErr_INODELOCKED
|
|
{"File access denied by state restrictions", EWOULDBLOCK}, // FhgfsOpsErr_FILEACCESS_DENIED
|
|
{NULL, 0}
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
* @return static human-readable error string
|
|
*/
|
|
const char* FhgfsOpsErr_toErrString(FhgfsOpsErr errCode)
|
|
{
|
|
size_t unsignedErrCode = (size_t)errCode;
|
|
|
|
if(likely(unsignedErrCode < __FHGFSOPS_ERRLIST_SIZE) )
|
|
return __FHGFSOPS_ERRLIST[unsignedErrCode].errString;
|
|
|
|
#ifdef BEEGFS_DEBUG
|
|
printk_fhgfs(KERN_WARNING, "Unknown errCode given to FhgfsOpsErr_toErrString(): %d/%u "
|
|
"(dumping stack...)\n", (int)errCode, (unsigned)errCode);
|
|
|
|
dump_stack();
|
|
#endif
|
|
|
|
return "Unknown error code";
|
|
}
|
|
|
|
/**
|
|
* @return negative linux error code
|
|
*/
|
|
int FhgfsOpsErr_toSysErr(FhgfsOpsErr errCode)
|
|
{
|
|
size_t unsignedErrCode = (size_t)errCode;
|
|
|
|
if(likely(unsignedErrCode < __FHGFSOPS_ERRLIST_SIZE) )
|
|
return -(__FHGFSOPS_ERRLIST[errCode].sysErr);
|
|
|
|
#ifdef BEEGFS_DEBUG
|
|
printk_fhgfs(KERN_WARNING, "Unknown errCode given to FhgfsOpsErr_toSysErr(): %d/%u "
|
|
"(dumping stack...)\n", (int)errCode, (unsigned)errCode);
|
|
|
|
dump_stack();
|
|
#endif
|
|
|
|
return -EPERM;
|
|
}
|