// 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 kPageCacheMask = (kPageSize - 1);
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_
