// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_F2FS_F2FS_TYPES_H_
#define THIRD_PARTY_F2FS_F2FS_TYPES_H_

#include <stdatomic.h>
#include <sys/types.h>
#include <threads.h>
#include <zircon/listnode.h>
#include <zircon/types.h>

namespace f2fs {

using sector_t = uint64_t;
using block_t = uint32_t;
using f2fs_hash_t = uint32_t;
using gfp_t = uint32_t;
using nid_t = uint32_t;
using ino_t = uint32_t;
using pgoff_t = unsigned long;
using atomic_t = atomic_int;
using umode_t = uint16_t;
using spinlock_t = mtx_t;
using rwlock_t = mtx_t;
// Radix Tree
struct RadixTreeRoot {};

// dentry
struct dentry {};

#if BYTE_ORDER == BIG_ENDIAN
inline uint16_t LeToCpu(uint16_t x) { return SWAP_16(x); }
inline uint32_t LeToCpu(uint32_t x) { return SWAP_32(x); }
inline uint64_t LeToCpu(uint64_t x) { return SWAP_64(x); }
inline uint16_t CpuToLe(uint16_t x) { return SWAP_16(x); }
inline uint32_t CpuToLe(uint32_t x) { return SWAP_32(x); }
inline uint64_t CpuToLe(uint64_t x) { return SWAP_64(x); }
#else
inline uint16_t LeToCpu(uint16_t x) { return x; }
inline uint32_t LeToCpu(uint32_t x) { return x; }
inline uint64_t LeToCpu(uint64_t x) { return x; }
inline uint16_t CpuToLe(uint16_t x) { return x; }
inline uint32_t CpuToLe(uint32_t x) { return x; }
inline uint64_t CpuToLe(uint64_t x) { return x; }
#endif

constexpr size_t kPageSize = 4096;
constexpr size_t kPageCacheSize = 4096;
constexpr size_t kBitsPerByte = 8;
constexpr size_t kPageCacheShift = 12;
constexpr size_t kF2fsSuperMagic = 0xF2F52010;
constexpr size_t kCrcPolyLe = 0xedb88320;
constexpr size_t kAopWritepageActivate = 0x80000;

constexpr size_t kRead = 0x0;
constexpr size_t kWrite = 0x1;
constexpr size_t kFlush = 0x2;
constexpr size_t kFua = 0x4;
constexpr size_t kDiscard = 0x08;
constexpr size_t kSync = 0x10;
constexpr size_t kReadSync = (kRead | kSync);
constexpr size_t kWriteSync = (kWrite | kSync);
constexpr size_t kWriteFlushFua = (kWrite | kSync | kFlush | kFua);

//#define MS_POSIXACL (1 << 16) /* VFS does not apply the umask */
//#define BUG_ON(a)
/*#define I_DIRTY_SYNC          (1 << 0)
#define I_DIRTY_DATASYNC        (1 << 1)
#define I_DIRTY_PAGES           (1 << 2)
#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)*/

struct Page {
  uint8_t data[kPageSize];
  uint32_t index = -1;     // meta = lba, node = node id, file = fileofs;
  void *host = nullptr;    // meta = null, node = null, file = vnodef2fs
  uint32_t host_nid = -1;  // meta = F2FS_META_INO(sbi), node = F2FS_NODE_INO, file = host->nid_
};

}  // namespace f2fs

#endif  // THIRD_PARTY_F2FS_F2FS_TYPES_H_
