case 9: return EBADF;
case 10: return ECHILD;
// same as EWOULDBLOCK
+ // need to be careful of treating EWOULDBLOCK same way as EAGAIN
+ // in errno.h (in Windows) the EWOULDBLOCK is set to 140, while EAGAIN is 11
+ // In the cephfs client tests we changed assertions that expected EWOULDBLOCK to EAGAIN,
+ // since MDS returns EAGAIN for all cases. EWOULBLOCK originally was used with socket context,
+ // so semantically it makes sense to use EAGAIN for operations that indicate some possible waiting/retry
case 11: return EAGAIN;
case 12: return ENOMEM;
case 13: return EACCES;
{
DWORD err = ::GetLastError();
return win32_strerror(err);
-}
-
-static const ceph::unordered_map<int,NTSTATUS> cephfs_errno_to_ntstatus = {
- {CEPHFS_EBLOCKLISTED, STATUS_SYSTEM_SHUTDOWN},
- {CEPHFS_EPERM, STATUS_ACCESS_DENIED},
- {CEPHFS_ESTALE, STATUS_INVALID_HANDLE},
- {CEPHFS_ENOSPC, STATUS_DISK_FULL},
- {CEPHFS_ETIMEDOUT, STATUS_TIMEOUT},
- {CEPHFS_EIO, STATUS_DATA_ERROR},
- {CEPHFS_ENOTCONN, STATUS_CONNECTION_DISCONNECTED},
- {CEPHFS_EEXIST, STATUS_OBJECT_NAME_COLLISION},
- {CEPHFS_EINTR, STATUS_RETRY},
- {CEPHFS_EINVAL, STATUS_INVALID_PARAMETER},
- {CEPHFS_EBADF, STATUS_INVALID_HANDLE},
- {CEPHFS_EROFS, STATUS_MEDIA_WRITE_PROTECTED},
- {CEPHFS_EAGAIN, STATUS_RETRY},
- {CEPHFS_EACCES, STATUS_ACCESS_DENIED},
- {CEPHFS_ELOOP, STATUS_TOO_MANY_LINKS},
- {CEPHFS_EISDIR, STATUS_FILE_IS_A_DIRECTORY},
- {CEPHFS_ENOENT, STATUS_OBJECT_NAME_NOT_FOUND},
- {CEPHFS_ENOTDIR, STATUS_NOT_A_DIRECTORY},
- {CEPHFS_ENAMETOOLONG, STATUS_NAME_TOO_LONG},
- {CEPHFS_EBUSY, STATUS_DEVICE_BUSY},
- {CEPHFS_EDQUOT, STATUS_QUOTA_EXCEEDED},
- {CEPHFS_EFBIG, STATUS_FILE_TOO_LARGE},
- {CEPHFS_ERANGE, STATUS_INVALID_PARAMETER},
- {CEPHFS_ENXIO, STATUS_NOT_FOUND},
- {CEPHFS_ECANCELED, STATUS_REQUEST_CANCELED},
- {CEPHFS_ENODATA, STATUS_NOT_FOUND},
- {CEPHFS_EOPNOTSUPP, STATUS_NOT_SUPPORTED},
- {CEPHFS_EXDEV, STATUS_NOT_SAME_DEVICE},
- {CEPHFS_ENOMEM, STATUS_NO_MEMORY},
- {CEPHFS_ENOTRECOVERABLE, STATUS_INTERNAL_ERROR},
- {CEPHFS_ENOSYS, STATUS_NOT_IMPLEMENTED},
- {CEPHFS_ENOTEMPTY, STATUS_DIRECTORY_NOT_EMPTY},
- {CEPHFS_EDEADLK, STATUS_POSSIBLE_DEADLOCK},
- {CEPHFS_EDOM, STATUS_INVALID_PARAMETER},
- {CEPHFS_EMLINK, STATUS_TOO_MANY_LINKS},
- {CEPHFS_ETIME, STATUS_TIMEOUT},
- {CEPHFS_EOLDSNAPC, STATUS_DATA_ERROR}
-};
-
-__u32 cephfs_errno_to_ntstatus_map(int cephfs_errno)
-{
- cephfs_errno = abs(cephfs_errno);
-
- if (cephfs_errno == 0)
- return 0;
-
- auto it = cephfs_errno_to_ntstatus.find(cephfs_errno);
- if (it != cephfs_errno_to_ntstatus.end())
- return it->second;
- return STATUS_INTERNAL_ERROR;
-}
+}
\ No newline at end of file
class JSONObj;
-#define CEPHFS_EBLOCKLISTED 108
-#define CEPHFS_EPERM 1
-#define CEPHFS_ESTALE 116
-#define CEPHFS_ENOSPC 28
-#define CEPHFS_ETIMEDOUT 110
-#define CEPHFS_EIO 5
-#define CEPHFS_ENOTCONN 107
-#define CEPHFS_EEXIST 17
-#define CEPHFS_EINTR 4
-#define CEPHFS_EINVAL 22
-#define CEPHFS_EBADF 9
-#define CEPHFS_EROFS 30
-#define CEPHFS_EAGAIN 11
-#define CEPHFS_EACCES 13
-#define CEPHFS_ELOOP 40
-#define CEPHFS_EISDIR 21
-#define CEPHFS_ENOENT 2
-#define CEPHFS_ENOTDIR 20
-#define CEPHFS_ENAMETOOLONG 36
-#define CEPHFS_EBUSY 16
-#define CEPHFS_EDQUOT 122
-#define CEPHFS_EFBIG 27
-#define CEPHFS_ERANGE 34
-#define CEPHFS_ENXIO 6
-#define CEPHFS_ECANCELED 125
-#define CEPHFS_ENODATA 61
-#define CEPHFS_EOPNOTSUPP 95
-#define CEPHFS_EXDEV 18
-#define CEPHFS_ENOMEM 12
-#define CEPHFS_ENOTRECOVERABLE 131
-#define CEPHFS_ENOSYS 38
-#define CEPHFS_EWOULDBLOCK CEPHFS_EAGAIN
-#define CEPHFS_ENOTEMPTY 39
-#define CEPHFS_EDEADLK 35
-#define CEPHFS_EDEADLOCK CEPHFS_EDEADLK
-#define CEPHFS_EDOM 33
-#define CEPHFS_EMLINK 31
-#define CEPHFS_ETIME 62
-#define CEPHFS_EOLDSNAPC 85
-#define CEPHFS_EFAULT 14
-#define CEPHFS_EISCONN 106
-#define CEPHFS_EMULTIHOP 72
-#define CEPHFS_EINPROGRESS 115
-
// taken from linux kernel: include/uapi/linux/fcntl.h
#define CEPHFS_AT_FDCWD -100 /* Special value used to indicate
openat should use the current
#endif
struct errorcode32_t {
- int32_t code;
+ using code_t = __s32;
+ code_t code;
errorcode32_t() : code(0) {}
// cppcheck-suppress noExplicitConstructor
- explicit errorcode32_t(int32_t i) : code(i) {}
+ explicit errorcode32_t(code_t i) : code(i) {}
- operator int() const { return code; }
- int* operator&() { return &code; }
- errorcode32_t& operator=(int32_t i) {
+ operator code_t() const { return code; }
+ code_t* operator&() { return &code; }
+ errorcode32_t& operator=(code_t i) {
code = i;
return *this;
}
bool operator==(const errorcode32_t&) const = default;
auto operator<=>(const errorcode32_t&) const = default;
+ inline code_t get_host_to_wire() const {
+ return hostos_to_ceph_errno(code);
+ }
+
+ inline void set_wire_to_host(code_t host_code) {
+ code = ceph_to_hostos_errno(host_code);
+ }
+
void encode(ceph::buffer::list &bl) const {
using ceph::encode;
- __s32 newcode = hostos_to_ceph_errno(code);
- encode(newcode, bl);
+ auto new_code = get_host_to_wire();
+ encode(new_code, bl);
}
void decode(ceph::buffer::list::const_iterator &bl) {
using ceph::decode;
- decode(code, bl);
- code = ceph_to_hostos_errno(code);
+ code_t newcode;
+ decode(newcode, bl);
+ set_wire_to_host(newcode);
}
void dump(ceph::Formatter *f) const {
f->dump_int("code", code);