// 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.

#include <codecvt>

#include "f2fs.h"
#include "src/lib/uuid/uuid.h"

namespace f2fs {

const char *kMediaExtList[] = {"jpg", "gif", "png",  "avi", "divx", "mp4", "mp3", "3gp",
                               "wmv", "wma", "mpeg", "mkv", "mov",  "asx", "asf", "wmx",
                               "svi", "wvx", "wm",   "mpg", "mpe",  "rm",  "ogg"};

F2fsMkfs::F2fsMkfs(std::unique_ptr<f2fs::Bcache> bc, const MkfsOptions &mkfs_options)
    : bc_(std::move(bc)), mkfs_options_(mkfs_options) {}

zx_status_t F2fsMkfs::Mkfs() {
  char extension_list[] = "";

#ifdef F2FS_BU_DEBUG
  // TODO: lable, extention list
  std::cout << "f2fs mkfs heap-based allocation = " << mkfs_options_.heap_based_allocation
            << std::endl;
  std::cout << "f2fs mkfs overprovision ratio = " << mkfs_options_.overprovision_ratio << std::endl;
  std::cout << "f2fs mkfs # of segments per section = " << mkfs_options_.num_of_seg_per_sec
            << std::endl;
  std::cout << "f2fs mkfs overprovision ratio = " << mkfs_options_.num_of_sec_per_zone << std::endl;
#endif

  // TODO: parse mkfs options
  params_.extension_list = extension_list;

  InitGlobalParameters();

  if (GetDeviceInfo() < 0)
    return -1;

  if (FormatDevice() < 0)
    return -1;

  printf("Info: format successful\n");

  return ZX_OK;
}

/*
 * String must be less than 16 characters.
 */
void F2fsMkfs::AsciiToUnicode(const std::string &in_string, std::u16string *out_string) {
  std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> cvt16;

  out_string->assign(cvt16.from_bytes(in_string));
}

void F2fsMkfs::InitGlobalParameters() {
  static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__);

  params_.sector_size = kDefaultSectorSize;
  params_.sectors_per_blk = kDefaultSectorsPerBlock;
  params_.blks_per_seg = kDefaultBlocksPerSegment;
  params_.reserved_segments = 20; /* calculated by overprovision ratio */
  params_.overprovision = 5;
  params_.segs_per_sec = 1;
  params_.secs_per_zone = 1;
  params_.heap = 1;
  memset(params_.vol_label, 0, sizeof(params_.vol_label));

  params_.vol_label[0] = 'F';
  params_.vol_label[1] = '2';
  params_.vol_label[2] = 'F';
  params_.vol_label[3] = 'S';
  params_.vol_label[4] = '\0';
  params_.device_name = nullptr;
}

inline int F2fsMkfs::F2fsSetBit(uint32_t nr, uint8_t *addr) {
  int mask;
  int ret;

  addr += (nr >> 3);
  mask = 1 << (7 - (nr & 0x07));
  ret = mask & *addr;
  *addr |= mask;
  return ret;
}

int8_t F2fsMkfs::LogBase2(uint32_t num) {
  int8_t ret = 0;

  if (num <= 0 || (num & (num - 1)) != 0) {
    return -1;
  }

  while (num >>= 1) {
    ret++;
  }

  return ret;
}

#if 0  // porting needed
void F2fsMkfs::f2fs_usage(void)
{
        fprintf(stderr, "Usage: f2fs_format [options] device\n");
        fprintf(stderr, "[options]\n");
        fprintf(stderr, "-l label\n");
        fprintf(stderr, "-a heap-based allocation [default:1]\n");
        fprintf(stderr, "-o overprovision ratio [default:5]\n");
        fprintf(stderr, "-s # of segments per section [default:1]\n");
        fprintf(stderr, "-z # of sections per zone [default:1]\n");
        fprintf(stderr, "-e [extension list] e.g. \"mp3,gif,mov\"\n");
        exit(1);
}
#endif

zx_status_t F2fsMkfs::GetDeviceInfo() {
  fuchsia_hardware_block_BlockInfo info;

  bc_->device()->BlockGetInfo(&info);

  ZX_ASSERT(info.block_size == kDefaultSectorSize);

  params_.sector_size = kDefaultSectorSize;
  params_.sectors_per_blk = kBlockSize / kDefaultSectorSize;
  params_.total_sectors = info.block_count;
  params_.start_sector = kSuperblockStart;

  if (params_.total_sectors < (kMinVolumeSize / kDefaultSectorSize)) {
    printf("Error: Min volume size supported is %d\n", kMinVolumeSize);
    return ZX_ERR_NO_RESOURCES;
  }

  return ZX_OK;
}

void F2fsMkfs::ConfigureExtensionList() {
  char *ext_str = params_.extension_list;
  char *ue;
  int name_len;
  int i = 0;

  super_block_.extension_count = 0;
  memset(super_block_.extension_list, 0, sizeof(super_block_.extension_list));

  for (const char *ext : kMediaExtList) {
    name_len = static_cast<int>(strlen(ext));
    memcpy(super_block_.extension_list[i++], ext, name_len);
  }
  super_block_.extension_count = i - 1;

  if (!ext_str)
    return;

  /* add user ext list */
  ue = strtok(ext_str, ",");
  while (ue != nullptr) {
    name_len = static_cast<int>(strlen(ue));
    memcpy(super_block_.extension_list[i++], ue, name_len);
    ue = strtok(nullptr, ",");
    if (i > kMaxExtension)
      break;
  }

  super_block_.extension_count = i - 1;
#if 0  // porting needed
  // TODO: strdup in f2fs_parse_options
  // free(params_.extension_list);
#endif
}

zx_status_t F2fsMkfs::WriteToDisk(void *buf, uint64_t offset, size_t length) {
  zx_status_t status = 0;
  uint64_t curr_offset = offset;

#ifdef F2FS_BU_DEBUG
  std::cout << std::hex << "writetodeisk: offset= 0x" << offset << " length= 0x" << length
            << std::endl;
#endif

  if (offset % kBlockSize) {
    std::cout << std::hex << "block is not aligned: offset =  " << offset << " length = " << length
              << std::endl;
    return ZX_ERR_INVALID_ARGS;
  }

  if (length % kBlockSize) {
    std::cout << std::hex << "block size is not aligned: offset =  " << offset
              << " length = " << length << std::endl;
    return ZX_ERR_INVALID_ARGS;
  }

  for (uint64_t i = 0; i < length / kBlockSize; i++) {
    if ((status = bc_->Writeblk((offset / kBlockSize) + i, buf)) != ZX_OK) {
      std::cout << "mkfs: Failed to write root directory: " << status << std::endl;
    }

    curr_offset += kBlockSize;
  }

  ZX_ASSERT(curr_offset == offset + length);

  return status;
}

zx_status_t F2fsMkfs::PrepareSuperBlock() {
  uint32_t blk_size_bytes;
  uint32_t log_sectorsize, log_sectors_per_block;
  uint32_t log_blocksize, log_blks_per_seg;
  uint32_t segment_size_bytes, zone_size_bytes;
  uint32_t sit_segments;
  uint32_t blocks_for_sit, blocks_for_nat, blocks_for_ssa;
  uint32_t total_valid_blks_available;
  uint64_t zone_align_start_offset, diff, total_meta_segments;
  uint32_t sit_bitmap_size, max_nat_bitmap_size, max_nat_segments;
  uint32_t total_zones;

  super_block_.magic = CpuToLe(uint32_t{kF2fsSuperMagic});
  super_block_.major_ver = CpuToLe(kMajorVersion);
  super_block_.minor_ver = CpuToLe(kMinorVersion);

  log_sectorsize = LogBase2(params_.sector_size);
  log_sectors_per_block = LogBase2(params_.sectors_per_blk);
  log_blocksize = log_sectorsize + log_sectors_per_block;
  log_blks_per_seg = LogBase2(params_.blks_per_seg);

  super_block_.log_sectorsize = CpuToLe(log_sectorsize);

  if (log_sectorsize < 0) {
    printf("\n\tError: Failed to get the sector size: %u!\n", params_.sector_size);
    return ZX_ERR_INVALID_ARGS;
  }

  super_block_.log_sectors_per_block = CpuToLe(log_sectors_per_block);

  if (log_sectors_per_block < 0) {
    printf("\n\tError: Failed to get sectors per block: %u!\n", params_.sectors_per_blk);
    return ZX_ERR_INVALID_ARGS;
  }

  super_block_.log_blocksize = CpuToLe(log_blocksize);
  super_block_.log_blocks_per_seg = CpuToLe(log_blks_per_seg);

  if (log_blks_per_seg < 0) {
    printf("\n\tError: Failed to get block per segment: %u!\n", params_.blks_per_seg);
    return ZX_ERR_INVALID_ARGS;
  }

  super_block_.segs_per_sec = CpuToLe(params_.segs_per_sec);
  super_block_.secs_per_zone = CpuToLe(params_.secs_per_zone);
  blk_size_bytes = 1 << log_blocksize;
  segment_size_bytes = blk_size_bytes * params_.blks_per_seg;
  zone_size_bytes =
      blk_size_bytes * params_.secs_per_zone * params_.segs_per_sec * params_.blks_per_seg;

  super_block_.checksum_offset = 0;

  super_block_.block_count = CpuToLe((params_.total_sectors * kDefaultSectorSize) / blk_size_bytes);

  zone_align_start_offset =
      (params_.start_sector * kDefaultSectorSize + 2 * kBlkSize + zone_size_bytes - 1) /
          zone_size_bytes * zone_size_bytes -
      params_.start_sector * kDefaultSectorSize;

  if (params_.start_sector % kDefaultSectorsPerBlock) {
    printf("WARN: Align start sector number in a unit of pages\n");
    printf("\ti.e., start sector: %d, ofs:%d (sectors per page: %d)\n", params_.start_sector,
           params_.start_sector % kDefaultSectorsPerBlock, kDefaultSectorsPerBlock);
  }

  super_block_.segment_count =
      CpuToLe(((params_.total_sectors * kDefaultSectorSize) - zone_align_start_offset) /
              segment_size_bytes);

  super_block_.segment0_blkaddr = CpuToLe(zone_align_start_offset / blk_size_bytes);
  super_block_.cp_blkaddr = super_block_.segment0_blkaddr;

  super_block_.segment_count_ckpt = CpuToLe(kNumberOfCheckpointPack);

  super_block_.sit_blkaddr =
      CpuToLe(LeToCpu(super_block_.segment0_blkaddr) +
              (LeToCpu(super_block_.segment_count_ckpt) * (1 << log_blks_per_seg)));

  blocks_for_sit =
      (LeToCpu(super_block_.segment_count) + kSitEntryPerBlock - 1) / kSitEntryPerBlock;

  sit_segments = (blocks_for_sit + params_.blks_per_seg - 1) / params_.blks_per_seg;

  super_block_.segment_count_sit = CpuToLe(sit_segments * 2);

  super_block_.nat_blkaddr =
      CpuToLe(LeToCpu(super_block_.sit_blkaddr) +
              (LeToCpu(super_block_.segment_count_sit) * params_.blks_per_seg));

  total_valid_blks_available =
      (LeToCpu(super_block_.segment_count) -
       (LeToCpu(super_block_.segment_count_ckpt) + LeToCpu(super_block_.segment_count_sit))) *
      params_.blks_per_seg;

  blocks_for_nat = (total_valid_blks_available + kNatEntryPerBlock - 1) / kNatEntryPerBlock;

  super_block_.segment_count_nat =
      CpuToLe((blocks_for_nat + params_.blks_per_seg - 1) / params_.blks_per_seg);
  /*
   * The number of node segments should not be exceeded a "Threshold".
   * This number resizes NAT bitmap area in a CP page.
   * So the threshold is determined not to overflow one CP page
   */
  sit_bitmap_size = ((LeToCpu(super_block_.segment_count_sit) / 2) << log_blks_per_seg) / 8;
  max_nat_bitmap_size = 4096 - sizeof(Checkpoint) + 1 - sit_bitmap_size;
  max_nat_segments = (max_nat_bitmap_size * 8) >> log_blks_per_seg;

  if (LeToCpu(super_block_.segment_count_nat) > max_nat_segments)
    super_block_.segment_count_nat = CpuToLe(max_nat_segments);

  super_block_.segment_count_nat = CpuToLe(LeToCpu(super_block_.segment_count_nat) * 2);

  super_block_.ssa_blkaddr =
      CpuToLe(LeToCpu(super_block_.nat_blkaddr) +
              LeToCpu(super_block_.segment_count_nat) * params_.blks_per_seg);

  total_valid_blks_available =
      (LeToCpu(super_block_.segment_count) -
       (LeToCpu(super_block_.segment_count_ckpt) + LeToCpu(super_block_.segment_count_sit) +
        LeToCpu(super_block_.segment_count_nat))) *
      params_.blks_per_seg;

  blocks_for_ssa = total_valid_blks_available / params_.blks_per_seg + 1;

  super_block_.segment_count_ssa =
      CpuToLe((blocks_for_ssa + params_.blks_per_seg - 1) / params_.blks_per_seg);

  total_meta_segments =
      LeToCpu(super_block_.segment_count_ckpt) + LeToCpu(super_block_.segment_count_sit) +
      LeToCpu(super_block_.segment_count_nat) + LeToCpu(super_block_.segment_count_ssa);
  diff = total_meta_segments % (params_.segs_per_sec * params_.secs_per_zone);
  if (diff)
    super_block_.segment_count_ssa = CpuToLe(LeToCpu(super_block_.segment_count_ssa) +
                                             (params_.segs_per_sec * params_.secs_per_zone - diff));

  super_block_.main_blkaddr =
      CpuToLe(LeToCpu(super_block_.ssa_blkaddr) +
              (LeToCpu(super_block_.segment_count_ssa) * params_.blks_per_seg));

  super_block_.segment_count_main =
      CpuToLe(LeToCpu(super_block_.segment_count) -
              (LeToCpu(super_block_.segment_count_ckpt) + LeToCpu(super_block_.segment_count_sit) +
               LeToCpu(super_block_.segment_count_nat) + LeToCpu(super_block_.segment_count_ssa)));

  super_block_.section_count =
      CpuToLe(LeToCpu(super_block_.segment_count_main) / params_.segs_per_sec);

  super_block_.segment_count_main =
      CpuToLe(LeToCpu(super_block_.section_count) * params_.segs_per_sec);

  if ((LeToCpu(super_block_.segment_count_main) - 2) < params_.reserved_segments) {
    printf("Error: Device size is not sufficient for F2FS volume, more segment needed =%u",
           params_.reserved_segments - (LeToCpu(super_block_.segment_count_main) - 2));
    return ZX_ERR_NO_SPACE;
  }

  memcpy(super_block_.uuid, uuid::Uuid::Generate().bytes(), 16);

  std::string vol_label(reinterpret_cast<char const *>(params_.vol_label));
  std::u16string volume_name;

  AsciiToUnicode(vol_label, &volume_name);

  volume_name.copy(reinterpret_cast<char16_t *>(super_block_.volume_name), vol_label.size());
  super_block_.volume_name[vol_label.size()] = '\0';

  super_block_.node_ino = CpuToLe(uint32_t{1});
  super_block_.meta_ino = CpuToLe(uint32_t{2});
  super_block_.root_ino = CpuToLe(uint32_t{3});

  total_zones = ((LeToCpu(super_block_.segment_count_main) - 1) / params_.segs_per_sec) /
                params_.secs_per_zone;
  if (total_zones <= 6) {
    printf("\n\tError: %d zones: Need more zones	by shrinking zone size\n", total_zones);
    return ZX_ERR_NO_SPACE;
  }

  if (params_.heap) {
    params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)] =
        (total_zones - 1) * params_.segs_per_sec * params_.secs_per_zone +
        ((params_.secs_per_zone - 1) * params_.segs_per_sec);
    params_.cur_seg[static_cast<int>(CursegType::kCursegWarmNode)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)] -
        params_.segs_per_sec * params_.secs_per_zone;
    params_.cur_seg[static_cast<int>(CursegType::kCursegColdNode)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegWarmNode)] -
        params_.segs_per_sec * params_.secs_per_zone;
    params_.cur_seg[static_cast<int>(CursegType::kCursegHotData)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegColdNode)] -
        params_.segs_per_sec * params_.secs_per_zone;
    params_.cur_seg[static_cast<int>(CursegType::kCursegColdData)] = 0;
    params_.cur_seg[static_cast<int>(CursegType::kCursegWarmData)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegColdData)] +
        params_.segs_per_sec * params_.secs_per_zone;
  } else {
    params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)] = 0;
    params_.cur_seg[static_cast<int>(CursegType::kCursegWarmNode)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)] +
        params_.segs_per_sec * params_.secs_per_zone;
    params_.cur_seg[static_cast<int>(CursegType::kCursegColdNode)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegWarmNode)] +
        params_.segs_per_sec * params_.secs_per_zone;
    params_.cur_seg[static_cast<int>(CursegType::kCursegHotData)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegColdNode)] +
        params_.segs_per_sec * params_.secs_per_zone;
    params_.cur_seg[static_cast<int>(CursegType::kCursegColdData)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegHotData)] +
        params_.segs_per_sec * params_.secs_per_zone;
    params_.cur_seg[static_cast<int>(CursegType::kCursegWarmData)] =
        params_.cur_seg[static_cast<int>(CursegType::kCursegColdData)] +
        params_.segs_per_sec * params_.secs_per_zone;
  }

  ConfigureExtensionList();

  return 0;
}

zx_status_t F2fsMkfs::InitSitArea() {
  uint32_t blk_size_bytes;
  uint32_t seg_size_bytes;
  uint32_t index = 0;
  uint64_t sit_seg_blk_offset = 0;
  uint8_t *zero_buf = nullptr;
  zx_status_t ret;

  blk_size_bytes = 1 << LeToCpu(super_block_.log_blocksize);
  seg_size_bytes = (1 << LeToCpu(super_block_.log_blocks_per_seg)) * blk_size_bytes;

  zero_buf = static_cast<uint8_t *>(calloc(sizeof(uint8_t), seg_size_bytes));
  if (zero_buf == nullptr) {
    printf("\n\tError: Calloc Failed for sit_zero_buf!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  sit_seg_blk_offset = LeToCpu(super_block_.sit_blkaddr) * blk_size_bytes;

  for (index = 0; index < (LeToCpu(super_block_.segment_count_sit) / 2); index++) {
    ret = WriteToDisk(zero_buf, sit_seg_blk_offset, seg_size_bytes);
    if (ret < 0) {
      printf("\n\tError: While zeroing out the sit area on disk!!!\n");
      return ret;
    }
    sit_seg_blk_offset = sit_seg_blk_offset + seg_size_bytes;
  }

  free(zero_buf);
  return ZX_OK;
}

zx_status_t F2fsMkfs::InitNatArea() {
  uint32_t blk_size_bytes;
  uint32_t seg_size_bytes;
  uint32_t index = 0;
  uint64_t nat_seg_blk_offset = 0;
  uint8_t *nat_buf = nullptr;
  zx_status_t ret;

  blk_size_bytes = 1 << LeToCpu(super_block_.log_blocksize);
  seg_size_bytes = (1 << LeToCpu(super_block_.log_blocks_per_seg)) * blk_size_bytes;

  nat_buf = static_cast<uint8_t *>(calloc(sizeof(uint8_t), seg_size_bytes));
  if (nat_buf == nullptr) {
    printf("\n\tError: Calloc Failed for nat_zero_blk!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  nat_seg_blk_offset = LeToCpu(super_block_.nat_blkaddr) * blk_size_bytes;

  for (index = 0; index < (LeToCpu(super_block_.segment_count_nat) / 2); index++) {
    ret = WriteToDisk(nat_buf, nat_seg_blk_offset, seg_size_bytes);
    if (ret < 0) {
      printf("\n\tError: While zeroing out the nat area on disk!!!\n");
      return ret;
    }
    nat_seg_blk_offset = nat_seg_blk_offset + (2 * seg_size_bytes);
  }

  free(nat_buf);
  return ZX_OK;
}

zx_status_t F2fsMkfs::WriteCheckPointPack() {
  Checkpoint *ckp = nullptr;
  SummaryBlock *sum = nullptr;
  uint32_t blk_size_bytes;
  uint64_t cp_seg_blk_offset = 0;
  uint32_t crc = 0;
  zx_status_t ret;
  int i;

  ckp = static_cast<Checkpoint *>(calloc(kBlkSize, 1));
  if (ckp == nullptr) {
    printf("\n\tError: Calloc Failed for Checkpoint!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  sum = static_cast<SummaryBlock *>(calloc(kBlkSize, 1));
  if (sum == nullptr) {
    printf("\n\tError: Calloc Failed for summay_node!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  /* 1. cp page 1 of checkpoint pack 1 */
  ckp->checkpoint_ver = 1;
  ckp->cur_node_segno[0] = CpuToLe(params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)]);
  ckp->cur_node_segno[1] = CpuToLe(params_.cur_seg[static_cast<int>(CursegType::kCursegWarmNode)]);
  ckp->cur_node_segno[2] = CpuToLe(params_.cur_seg[static_cast<int>(CursegType::kCursegColdNode)]);
  ckp->cur_data_segno[0] = CpuToLe(params_.cur_seg[static_cast<int>(CursegType::kCursegHotData)]);
  ckp->cur_data_segno[1] = CpuToLe(params_.cur_seg[static_cast<int>(CursegType::kCursegWarmData)]);
  ckp->cur_data_segno[2] = CpuToLe(params_.cur_seg[static_cast<int>(CursegType::kCursegColdData)]);
  for (i = 3; i < kMaxActiveNodeLogs; i++) {
    ckp->cur_node_segno[i] = 0xffffffff;
    ckp->cur_data_segno[i] = 0xffffffff;
  }

  ckp->cur_node_blkoff[0] = CpuToLe(uint16_t{1});
  ckp->cur_data_blkoff[0] = CpuToLe(uint16_t{1});
  ckp->valid_block_count = CpuToLe(uint64_t{2});
  ckp->rsvd_segment_count = CpuToLe(params_.reserved_segments);
  ckp->overprov_segment_count =
      CpuToLe((LeToCpu(super_block_.segment_count_main) - LeToCpu(ckp->rsvd_segment_count)) *
              params_.overprovision / 100);
  ckp->overprov_segment_count =
      CpuToLe(LeToCpu(ckp->overprov_segment_count) + LeToCpu(ckp->rsvd_segment_count));

  /* main segments - reserved segments - (node + data segments) */
  ckp->free_segment_count = CpuToLe(LeToCpu(super_block_.segment_count_main) - 6);

  ckp->user_block_count =
      CpuToLe(((LeToCpu(ckp->free_segment_count) + 6 - LeToCpu(ckp->overprov_segment_count)) *
               params_.blks_per_seg));

  ckp->cp_pack_total_block_count = CpuToLe(uint32_t{8});
  ckp->ckpt_flags |= kCpUmountFlag;
  ckp->cp_pack_start_sum = CpuToLe(uint32_t{1});
  ckp->valid_node_count = CpuToLe(uint32_t{1});
  ckp->valid_inode_count = CpuToLe(uint32_t{1});
  ckp->next_free_nid = CpuToLe(LeToCpu(super_block_.root_ino) + 1);

  ckp->sit_ver_bitmap_bytesize = CpuToLe(
      ((LeToCpu(super_block_.segment_count_sit) / 2) << LeToCpu(super_block_.log_blocks_per_seg)) /
      8);

  ckp->nat_ver_bitmap_bytesize = CpuToLe(
      ((LeToCpu(super_block_.segment_count_nat) / 2) << LeToCpu(super_block_.log_blocks_per_seg)) /
      8);

  ckp->checksum_offset = CpuToLe(uint32_t{kChecksumOffset});

  crc = F2fsCalCrc32(kF2fsSuperMagic, ckp, LeToCpu(ckp->checksum_offset));
  *(reinterpret_cast<uint32_t *>(reinterpret_cast<uint8_t *>(ckp) +
                                 LeToCpu(ckp->checksum_offset))) = crc;

  blk_size_bytes = 1 << LeToCpu(super_block_.log_blocksize);
  cp_seg_blk_offset = LeToCpu(super_block_.segment0_blkaddr) * blk_size_bytes;

  ret = WriteToDisk(ckp, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the ckp to disk!!!\n");
    return ret;
  }

  /* 2. Prepare and write Segment summary for data blocks */
  memset(sum, 0, sizeof(SummaryBlock));
  SetSumType((&sum->footer), kSumTypeData);

  sum->entries[0].nid = super_block_.root_ino;
  sum->entries[0].ofs_in_node = 0;

  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the sum_blk to disk!!!\n");
    return ret;
  }

  /* 3. Fill segment summary for data block to zero. */
  memset(sum, 0, sizeof(SummaryBlock));
  SetSumType((&sum->footer), kSumTypeData);

  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the sum_blk to disk!!!\n");
    return ret;
  }

  /* 4. Fill segment summary for data block to zero. */
  memset(sum, 0, sizeof(SummaryBlock));
  SetSumType((&sum->footer), kSumTypeData);

  /* inode sit for root */
  sum->n_sits = CpuToLe(uint16_t{6});
  sum->sit_j.entries[0].segno = ckp->cur_node_segno[0];
  sum->sit_j.entries[0].se.vblocks =
      CpuToLe(uint16_t{(static_cast<int>(CursegType::kCursegHotNode) << 10) | 1});
  F2fsSetBit(0, sum->sit_j.entries[0].se.valid_map);
  sum->sit_j.entries[1].segno = ckp->cur_node_segno[1];
  sum->sit_j.entries[1].se.vblocks =
      CpuToLe(uint16_t{(static_cast<int>(CursegType::kCursegWarmNode) << 10)});
  sum->sit_j.entries[2].segno = ckp->cur_node_segno[2];
  sum->sit_j.entries[2].se.vblocks =
      CpuToLe(uint16_t{(static_cast<int>(CursegType::kCursegColdNode) << 10)});

  /* data sit for root */
  sum->sit_j.entries[3].segno = ckp->cur_data_segno[0];
  sum->sit_j.entries[3].se.vblocks =
      CpuToLe(uint16_t{(static_cast<uint16_t>(CursegType::kCursegHotData) << 10) | 1});
  F2fsSetBit(0, sum->sit_j.entries[3].se.valid_map);
  sum->sit_j.entries[4].segno = ckp->cur_data_segno[1];
  sum->sit_j.entries[4].se.vblocks =
      CpuToLe(uint16_t{(static_cast<int>(CursegType::kCursegWarmData) << 10)});
  sum->sit_j.entries[5].segno = ckp->cur_data_segno[2];
  sum->sit_j.entries[5].se.vblocks =
      CpuToLe(uint16_t{(static_cast<int>(CursegType::kCursegColdData) << 10)});

  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the sum_blk to disk!!!\n");
    return ret;
  }

  /* 5. Prepare and write Segment summary for node blocks */
  memset(sum, 0, sizeof(SummaryBlock));
  SetSumType((&sum->footer), kSumTypeNode);

  sum->entries[0].nid = super_block_.root_ino;
  sum->entries[0].ofs_in_node = 0;

  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the sum_blk to disk!!!\n");
    return ret;
  }

  /* 6. Fill segment summary for data block to zero. */
  memset(sum, 0, sizeof(SummaryBlock));
  SetSumType((&sum->footer), kSumTypeNode);

  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the sum_blk to disk!!!\n");
    return ret;
  }

  /* 7. Fill segment summary for data block to zero. */
  memset(sum, 0, sizeof(SummaryBlock));
  SetSumType((&sum->footer), kSumTypeNode);
  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the sum_blk to disk!!!\n");
    return ret;
  }

  /* 8. cp page2 */
  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(ckp, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the ckp to disk!!!\n");
    return ret;
  }

  /* 9. cp page 1 of check point pack 2
   * Initiatialize other checkpoint pack with version zero
   */
  ckp->checkpoint_ver = 0;

  crc = F2fsCalCrc32(kF2fsSuperMagic, ckp, LeToCpu(ckp->checksum_offset));
  *(reinterpret_cast<uint32_t *>(reinterpret_cast<uint8_t *>(ckp) +
                                 LeToCpu(ckp->checksum_offset))) = crc;

  cp_seg_blk_offset =
      (LeToCpu(super_block_.segment0_blkaddr) + params_.blks_per_seg) * blk_size_bytes;
  ret = WriteToDisk(ckp, cp_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the ckp to disk!!!\n");
    return ret;
  }

  free(sum);
  free(ckp);
  return ZX_OK;
}

zx_status_t F2fsMkfs::WriteSuperBlock() {
  uint32_t index = 0;
  uint8_t *zero_buff;
  zx_status_t ret;

  zero_buff = static_cast<uint8_t *>(calloc(kBlkSize, 1));

  memcpy(zero_buff + kSuperOffset, &super_block_, sizeof(super_block_));

  for (index = 0; index < 2; index++) {
    ret = WriteToDisk(zero_buff, index * kBlkSize, kBlkSize);
    if (ret < 0) {
      printf("\n\tError: While while writing supe_blk	on disk!!! index : %d\n", index);
      return ret;
    }
  }

  free(zero_buff);
  return ZX_OK;
}

zx_status_t F2fsMkfs::WriteRootInode() {
  Node *raw_node = nullptr;
  uint32_t blk_size_bytes;
  uint64_t data_blk_nor;
  uint64_t main_area_node_seg_blk_offset = 0;
  zx_status_t ret;

  raw_node = static_cast<Node *>(calloc(kBlkSize, 1));
  if (raw_node == nullptr) {
    printf("\n\tError: Calloc Failed for raw_node!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  raw_node->footer.nid = super_block_.root_ino;
  raw_node->footer.ino = super_block_.root_ino;
  raw_node->footer.cp_ver = CpuToLe(uint64_t{1});
  raw_node->footer.next_blkaddr = CpuToLe(
      LeToCpu(super_block_.main_blkaddr) +
      params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)] * params_.blks_per_seg + 1);

  raw_node->i.i_mode = CpuToLe(uint16_t{0x41ed});
  raw_node->i.i_links = CpuToLe(uint32_t{2});
  raw_node->i.i_uid = CpuToLe(getuid());
  raw_node->i.i_gid = CpuToLe(getgid());

  blk_size_bytes = 1 << LeToCpu(super_block_.log_blocksize);
  raw_node->i.i_size = CpuToLe(1 * blk_size_bytes); /* dentry */
  raw_node->i.i_blocks = CpuToLe(uint64_t{2});

  timespec cur_time;
  clock_gettime(CLOCK_REALTIME, &cur_time);
  raw_node->i.i_atime = cur_time.tv_sec;
  raw_node->i.i_atime_nsec = cur_time.tv_nsec;
  raw_node->i.i_ctime = cur_time.tv_sec;
  raw_node->i.i_ctime_nsec = cur_time.tv_nsec;
  raw_node->i.i_mtime = cur_time.tv_sec;
  raw_node->i.i_mtime_nsec = cur_time.tv_nsec;
  raw_node->i.i_generation = 0;
  raw_node->i.i_xattr_nid = 0;
  raw_node->i.i_flags = 0;
  raw_node->i.i_current_depth = CpuToLe(uint32_t{1});

  data_blk_nor =
      LeToCpu(super_block_.main_blkaddr) +
      params_.cur_seg[static_cast<int>(CursegType::kCursegHotData)] * params_.blks_per_seg;
  raw_node->i.i_addr[0] = CpuToLe(data_blk_nor);

  raw_node->i.i_ext.fofs = 0;
  raw_node->i.i_ext.blk_addr = CpuToLe(data_blk_nor);
  raw_node->i.i_ext.len = CpuToLe(uint32_t{1});

  main_area_node_seg_blk_offset = LeToCpu(super_block_.main_blkaddr);
  main_area_node_seg_blk_offset +=
      params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)] * params_.blks_per_seg;
  main_area_node_seg_blk_offset *= blk_size_bytes;

  ret = WriteToDisk(raw_node, main_area_node_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the raw_node to disk!!!, size = %lu\n", sizeof(Node));
    return ret;
  }

  memset(raw_node, 0xff, sizeof(Node));

  ret = WriteToDisk(raw_node, main_area_node_seg_blk_offset + 4096, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the raw_node to disk!!!\n");
    return ret;
  }
  free(raw_node);
  return ZX_OK;
}

zx_status_t F2fsMkfs::UpdateNatRoot() {
  NatBlock *nat_blk = nullptr;
  uint32_t blk_size_bytes;
  uint64_t nat_seg_blk_offset = 0;
  zx_status_t ret;

  nat_blk = static_cast<NatBlock *>(calloc(kBlkSize, 1));
  if (nat_blk == nullptr) {
    printf("\n\tError: Calloc Failed for nat_blk!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  /* update root */
  nat_blk->entries[super_block_.root_ino].block_addr =
      CpuToLe(LeToCpu(super_block_.main_blkaddr) +
              params_.cur_seg[static_cast<int>(CursegType::kCursegHotNode)] * params_.blks_per_seg);
  nat_blk->entries[super_block_.root_ino].ino = super_block_.root_ino;

  /* update node nat */
  nat_blk->entries[super_block_.node_ino].block_addr = CpuToLe(uint32_t{1});
  nat_blk->entries[super_block_.node_ino].ino = super_block_.node_ino;

  /* update meta nat */
  nat_blk->entries[super_block_.meta_ino].block_addr = CpuToLe(uint32_t{1});
  nat_blk->entries[super_block_.meta_ino].ino = super_block_.meta_ino;

  blk_size_bytes = 1 << LeToCpu(super_block_.log_blocksize);

  nat_seg_blk_offset = LeToCpu(super_block_.nat_blkaddr) * blk_size_bytes;

  ret = WriteToDisk(nat_blk, nat_seg_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the nat_blk set0 to disk!!!\n");
    return ret;
  }

  free(nat_blk);
  return ZX_OK;
}

zx_status_t F2fsMkfs::AddDefaultDentryRoot() {
  DentryBlock *dent_blk = nullptr;
  uint32_t blk_size_bytes;
  uint64_t data_blk_offset = 0;
  zx_status_t ret;

  dent_blk = static_cast<DentryBlock *>(calloc(kBlkSize, 1));
  if (dent_blk == nullptr) {
    printf("\n\tError: Calloc Failed for dent_blk!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  dent_blk->dentry[0].hash_code = 0;
  dent_blk->dentry[0].ino = super_block_.root_ino;
  dent_blk->dentry[0].name_len = CpuToLe(uint16_t{1});
  dent_blk->dentry[0].file_type = static_cast<uint8_t>(FileType::kFtDir);
  memcpy(dent_blk->filename[0], ".", 1);

  dent_blk->dentry[1].hash_code = 0;
  dent_blk->dentry[1].ino = super_block_.root_ino;
  dent_blk->dentry[1].name_len = CpuToLe(uint16_t{2});
  dent_blk->dentry[1].file_type = static_cast<uint8_t>(FileType::kFtDir);
  memcpy(dent_blk->filename[1], "..", 2);

  /* bitmap for . and .. */
  dent_blk->dentry_bitmap[0] = (1 << 1) | (1 << 0);
  blk_size_bytes = 1 << LeToCpu(super_block_.log_blocksize);
  data_blk_offset =
      (LeToCpu(super_block_.main_blkaddr) +
       params_.cur_seg[static_cast<int>(CursegType::kCursegHotData)] * params_.blks_per_seg) *
      blk_size_bytes;

  ret = WriteToDisk(dent_blk, data_blk_offset, kBlkSize);
  if (ret < 0) {
    printf("\n\tError: While writing the dentry_blk to disk!!!\n");
    return ret;
  }

  free(dent_blk);
  return ZX_OK;
}

zx_status_t F2fsMkfs::CreateRootDir() {
  int8_t err = 0;

  err = WriteRootInode();
  if (err < 0) {
    printf("\n\tError: Failed to write root inode!!!\n");
    goto exit;
  }

  err = UpdateNatRoot();
  if (err < 0) {
    printf("\n\tError: Failed to update NAT for root!!!\n");
    goto exit;
  }

  err = AddDefaultDentryRoot();
  if (err < 0) {
    printf("\n\tError: Failed to add default dentries for root!!!\n");
    goto exit;
  }
exit:
  if (err)
    printf("\n\tError: Could not create the root directory!!!\n");

  return err;
}

#if 0  // porting needed
// int F2fsMkfs::F2fsTrimDevice()
// {
//         uint64_t range[2];
//         stat stat_buf;

//         range[0] = 0;
//         range[1] = params_.total_sectors * kDefaultSectorSizes;

//         if (fstat(params_.fd, &stat_buf) < 0 ) {
//                 printf("\n\tError: Failed to get the device stat!!!\n");
//                 return -1;
//         }

//         if (S_ISREG(stat_buf.st_mode))
//                 return 0;
//         else if (S_ISBLK(stat_buf.st_mode)) {
// //		if (ioctl(params_.fd, BLKDISCARD, &range) < 0)
//                         printf("Info: This device doesn't support TRIM\n");
//         } else
//                 return -1;
//         return 0;
// }
#endif

zx_status_t F2fsMkfs::FormatDevice() {
  zx_status_t err = 0;

  err = PrepareSuperBlock();
  if (err < 0)
    goto exit;

#if 0  // porting needed
  // TRIM is not supported
  // err = f2fs_trim_device();
  // if (err < 0) {
  //   printf("\n\tError: Failed to trim whole device!!!\n");
  //   goto exit;
  // }
#endif
  err = InitSitArea();
  if (err < 0) {
    printf("\n\tError: Failed to Initialise the SIT AREA!!!\n");
    goto exit;
  }

  err = InitNatArea();
  if (err < 0) {
    printf("\n\tError: Failed to Initialise the NAT AREA!!!\n");
    goto exit;
  }

  err = CreateRootDir();
  if (err < 0) {
    printf("\n\tError: Failed to create the root directory!!!\n");
    goto exit;
  }

  err = WriteCheckPointPack();
  if (err < 0) {
    printf("\n\tError: Failed to write the check point pack!!!\n");
    goto exit;
  }

  err = WriteSuperBlock();
  if (err < 0) {
    printf("\n\tError: Failed to write the Super Block!!!\n");
    goto exit;
  }
exit:
  if (err)
    printf("\n\tError: Could not format the device!!!\n");

  /*
   * We should call fsync() to flush out all the dirty pages
   * in the block device page cache.
   */
  bc_->Sync();

  return err;
}

}  // namespace f2fs
