// 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 "f2fs.h"

#include <fcntl.h>
#include <inttypes.h>
#include <lib/syslog/cpp/macros.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

#include "src/lib/uuid/uuid.h"
#include "zircon/errors.h"
#include "zircon/types.h"

#include <memory>

#include <lib/zx/event.h>
#include <zircon/assert.h>

#include <lib/trace-provider/provider.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
  f2fs_params.extension_list = extension_list;

  InitGlobalParameters();

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

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

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

  return ZX_OK;
}

void F2fsMkfs::AsciiToUnicode(uint8_t *in_buf, uint16_t *out_buf) {
  uint8_t *pchTempPtr = in_buf;
  uint16_t *pwTempPtr = out_buf;

  while (*pchTempPtr != '\0') {
    /* Copy the string elements character by character
     * to the output string with typecasting the source.
     */
    *pwTempPtr = static_cast<uint16_t>(*pchTempPtr);
    pchTempPtr++;
    pwTempPtr++;
  }
  *pwTempPtr = '\0';
}

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

  f2fs_params.sector_size = DEFAULT_SECTOR_SIZE;
  f2fs_params.sectors_per_blk = DEFAULT_SECTORS_PER_BLOCK;
  f2fs_params.blks_per_seg = DEFAULT_BLOCKS_PER_SEGMENT;
  f2fs_params.reserved_segments = 20; /* calculated by overprovision ratio */
  f2fs_params.overprovision = 5;
  f2fs_params.segs_per_sec = 1;
  f2fs_params.secs_per_zone = 1;
  f2fs_params.heap = 1;
  memset(f2fs_params.vol_label, 0, sizeof(f2fs_params.vol_label));

  f2fs_params.vol_label[0] = 'F';
  f2fs_params.vol_label[1] = '2';
  f2fs_params.vol_label[2] = 'F';
  f2fs_params.vol_label[3] = 'S';
  f2fs_params.vol_label[4] = '\0';
  f2fs_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 == DEFAULT_SECTOR_SIZE);

  f2fs_params.sector_size = DEFAULT_SECTOR_SIZE;
  f2fs_params.sectors_per_blk = kF2fsBlockSize / DEFAULT_SECTOR_SIZE;
  f2fs_params.total_sectors = info.block_count;
  f2fs_params.start_sector = kSuperblockStart;

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

  return ZX_OK;
}

void F2fsMkfs::ConfigureExtensionList() {
  char *ext_str = f2fs_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 > F2FS_MAX_EXTENSION)
      break;
  }

  super_block.extension_count = i - 1;
#if 0  // porting needed
  // TODO: strdup in f2fs_parse_options
  // free(f2fs_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 % kF2fsBlockSize) {
    std::cout << std::hex << "block is not aligned: offset =  " << offset << " length = " << length
              << std::endl;
    return ZX_ERR_INVALID_ARGS;
  }

  if (length % kF2fsBlockSize) {
    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 / kF2fsBlockSize; i++) {
    if ((status = bc_->Writeblk((offset / kF2fsBlockSize) + i, buf)) != ZX_OK) {
      std::cout << "mkfs: Failed to write root directory: " << status << std::endl;
    }

    curr_offset += kF2fsBlockSize;
  }

  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(uint16_t{F2FS_MAJOR_VERSION});
  super_block.minor_ver = CpuToLe(uint16_t{F2FS_MINOR_VERSION});

  log_sectorsize = LogBase2(f2fs_params.sector_size);
  log_sectors_per_block = LogBase2(f2fs_params.sectors_per_blk);
  log_blocksize = log_sectorsize + log_sectors_per_block;
  log_blks_per_seg = LogBase2(f2fs_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", f2fs_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", f2fs_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", f2fs_params.blks_per_seg);
    return ZX_ERR_INVALID_ARGS;
  }

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

  super_block.checksum_offset = 0;

  super_block.block_count =
      CpuToLe((f2fs_params.total_sectors * DEFAULT_SECTOR_SIZE) / blk_size_bytes);

  zone_align_start_offset =
      (f2fs_params.start_sector * DEFAULT_SECTOR_SIZE + 2 * F2FS_BLKSIZE + zone_size_bytes - 1) /
          zone_size_bytes * zone_size_bytes -
      f2fs_params.start_sector * DEFAULT_SECTOR_SIZE;

  if (f2fs_params.start_sector % DEFAULT_SECTORS_PER_BLOCK) {
    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", f2fs_params.start_sector,
           f2fs_params.start_sector % DEFAULT_SECTORS_PER_BLOCK, DEFAULT_SECTORS_PER_BLOCK);
  }

  super_block.segment_count =
      CpuToLe(((f2fs_params.total_sectors * DEFAULT_SECTOR_SIZE) - 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(uint32_t{F2FS_NUMBER_OF_CHECKPOINT_PACK});

  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) + SIT_ENTRY_PER_BLOCK - 1) / SIT_ENTRY_PER_BLOCK;

  sit_segments = (blocks_for_sit + f2fs_params.blks_per_seg - 1) / f2fs_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) * f2fs_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))) *
      f2fs_params.blks_per_seg;

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

  super_block.segment_count_nat =
      CpuToLe((blocks_for_nat + f2fs_params.blks_per_seg - 1) / f2fs_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(f2fs_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) * f2fs_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))) *
      f2fs_params.blks_per_seg;

  blocks_for_ssa = total_valid_blks_available / f2fs_params.blks_per_seg + 1;

  super_block.segment_count_ssa =
      CpuToLe((blocks_for_ssa + f2fs_params.blks_per_seg - 1) / f2fs_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 % (f2fs_params.segs_per_sec * f2fs_params.secs_per_zone);
  if (diff)
    super_block.segment_count_ssa =
        CpuToLe(LeToCpu(super_block.segment_count_ssa) +
                    (f2fs_params.segs_per_sec * f2fs_params.secs_per_zone - diff));

  super_block.main_blkaddr =
      CpuToLe(LeToCpu(super_block.ssa_blkaddr) +
                  (LeToCpu(super_block.segment_count_ssa) * f2fs_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) / f2fs_params.segs_per_sec);

  super_block.segment_count_main =
      CpuToLe(LeToCpu(super_block.section_count) * f2fs_params.segs_per_sec);

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

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

  AsciiToUnicode(f2fs_params.vol_label, super_block.volume_name);

  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) / f2fs_params.segs_per_sec) /
                f2fs_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 (f2fs_params.heap) {
    f2fs_params.cur_seg[CURSEG_HOT_NODE] =
        (total_zones - 1) * f2fs_params.segs_per_sec * f2fs_params.secs_per_zone +
        ((f2fs_params.secs_per_zone - 1) * f2fs_params.segs_per_sec);
    f2fs_params.cur_seg[CURSEG_WARM_NODE] =
        f2fs_params.cur_seg[CURSEG_HOT_NODE] - f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
    f2fs_params.cur_seg[CURSEG_COLD_NODE] = f2fs_params.cur_seg[CURSEG_WARM_NODE] -
                                            f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
    f2fs_params.cur_seg[CURSEG_HOT_DATA] = f2fs_params.cur_seg[CURSEG_COLD_NODE] -
                                           f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
    f2fs_params.cur_seg[CURSEG_COLD_DATA] = 0;
    f2fs_params.cur_seg[CURSEG_WARM_DATA] = f2fs_params.cur_seg[CURSEG_COLD_DATA] +
                                            f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
  } else {
    f2fs_params.cur_seg[CURSEG_HOT_NODE] = 0;
    f2fs_params.cur_seg[CURSEG_WARM_NODE] =
        f2fs_params.cur_seg[CURSEG_HOT_NODE] + f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
    f2fs_params.cur_seg[CURSEG_COLD_NODE] = f2fs_params.cur_seg[CURSEG_WARM_NODE] +
                                            f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
    f2fs_params.cur_seg[CURSEG_HOT_DATA] = f2fs_params.cur_seg[CURSEG_COLD_NODE] +
                                           f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
    f2fs_params.cur_seg[CURSEG_COLD_DATA] =
        f2fs_params.cur_seg[CURSEG_HOT_DATA] + f2fs_params.segs_per_sec * f2fs_params.secs_per_zone;
    f2fs_params.cur_seg[CURSEG_WARM_DATA] = f2fs_params.cur_seg[CURSEG_COLD_DATA] +
                                            f2fs_params.segs_per_sec * f2fs_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() {
  f2fs_checkpoint *ckp = nullptr;
  f2fs_summary_block *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<f2fs_checkpoint *>(calloc(F2FS_BLKSIZE, 1));
  if (ckp == nullptr) {
    printf("\n\tError: Calloc Failed for f2fs_checkpoint!!!\n");
    return ZX_ERR_NO_MEMORY;
  }

  sum = static_cast<f2fs_summary_block *>(calloc(F2FS_BLKSIZE, 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(f2fs_params.cur_seg[CURSEG_HOT_NODE]);
  ckp->cur_node_segno[1] = CpuToLe(f2fs_params.cur_seg[CURSEG_WARM_NODE]);
  ckp->cur_node_segno[2] = CpuToLe(f2fs_params.cur_seg[CURSEG_COLD_NODE]);
  ckp->cur_data_segno[0] = CpuToLe(f2fs_params.cur_seg[CURSEG_HOT_DATA]);
  ckp->cur_data_segno[1] = CpuToLe(f2fs_params.cur_seg[CURSEG_WARM_DATA]);
  ckp->cur_data_segno[2] = CpuToLe(f2fs_params.cur_seg[CURSEG_COLD_DATA]);
  for (i = 3; i < MAX_ACTIVE_NODE_LOGS; 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(f2fs_params.reserved_segments);
  ckp->overprov_segment_count = CpuToLe(
      (LeToCpu(super_block.segment_count_main) - LeToCpu(ckp->rsvd_segment_count)) *
      f2fs_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)) *
       f2fs_params.blks_per_seg));

  ckp->cp_pack_total_block_count = CpuToLe(uint32_t{8});
  ckp->ckpt_flags |= CP_UMOUNT_FLAG;
  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, F2FS_BLKSIZE);
  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(f2fs_summary_block));
  SET_SUM_TYPE((&sum->footer), SUM_TYPE_DATA);

  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, F2FS_BLKSIZE);
  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(f2fs_summary_block));
  SET_SUM_TYPE((&sum->footer), SUM_TYPE_DATA);

  cp_seg_blk_offset += blk_size_bytes;
   ret = WriteToDisk(sum, cp_seg_blk_offset, F2FS_BLKSIZE);
  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(f2fs_summary_block));
  SET_SUM_TYPE((&sum->footer), SUM_TYPE_DATA);

  /* 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{(CURSEG_HOT_NODE << 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{(CURSEG_WARM_NODE << 10)});
  sum->sit_j.entries[2].segno = ckp->cur_node_segno[2];
  sum->sit_j.entries[2].se.vblocks = CpuToLe(uint16_t{(CURSEG_COLD_NODE << 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{(CURSEG_HOT_DATA << 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{(CURSEG_WARM_DATA << 10)});
  sum->sit_j.entries[5].segno = ckp->cur_data_segno[2];
  sum->sit_j.entries[5].se.vblocks = CpuToLe(uint16_t{(CURSEG_COLD_DATA << 10)});

  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, F2FS_BLKSIZE);
  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(f2fs_summary_block));
  SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);

  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, F2FS_BLKSIZE);
  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(f2fs_summary_block));
  SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);

  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, F2FS_BLKSIZE);
  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(f2fs_summary_block));
  SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);
  cp_seg_blk_offset += blk_size_bytes;
  ret = WriteToDisk(sum, cp_seg_blk_offset, F2FS_BLKSIZE);
  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, F2FS_BLKSIZE);
  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) + f2fs_params.blks_per_seg) * blk_size_bytes;
  ret = WriteToDisk(ckp, cp_seg_blk_offset, F2FS_BLKSIZE);
  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(F2FS_BLKSIZE, 1));

  memcpy(zero_buff + F2FS_SUPER_OFFSET, &super_block, sizeof(super_block));

  for (index = 0; index < 2; index++) {
    ret = WriteToDisk(zero_buff, index * F2FS_BLKSIZE, F2FS_BLKSIZE);
    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() {
  f2fs_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<f2fs_node *>(calloc(F2FS_BLKSIZE, 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) +
                  f2fs_params.cur_seg[CURSEG_HOT_NODE] * f2fs_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});

  raw_node->i.i_atime = CpuToLe(static_cast<uint64_t>(time(nullptr)));
  raw_node->i.i_atime_nsec = 0;
  raw_node->i.i_ctime = CpuToLe(static_cast<uint64_t>(time(nullptr)));
  raw_node->i.i_ctime_nsec = 0;
  raw_node->i.i_mtime = CpuToLe(static_cast<uint64_t>(time(nullptr)));
  raw_node->i.i_mtime_nsec = 0;
  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) +
                 f2fs_params.cur_seg[CURSEG_HOT_DATA] * f2fs_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 += f2fs_params.cur_seg[CURSEG_HOT_NODE] * f2fs_params.blks_per_seg;
  main_area_node_seg_blk_offset *= blk_size_bytes;

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

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

  ret = WriteToDisk(raw_node, main_area_node_seg_blk_offset + 4096, F2FS_BLKSIZE);
  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() {
  f2fs_nat_block *nat_blk = nullptr;
  uint32_t blk_size_bytes;
  uint64_t nat_seg_blk_offset = 0;
  zx_status_t ret;

  nat_blk = static_cast<f2fs_nat_block *>(calloc(F2FS_BLKSIZE, 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) +
                  f2fs_params.cur_seg[CURSEG_HOT_NODE] * f2fs_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, F2FS_BLKSIZE);
  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() {
  f2fs_dentry_block *dent_blk = nullptr;
  uint32_t blk_size_bytes;
  uint64_t data_blk_offset = 0;
  zx_status_t ret;

  dent_blk = static_cast<f2fs_dentry_block *>(calloc(F2FS_BLKSIZE, 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 = F2FS_FT_DIR;
  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 = F2FS_FT_DIR;
  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) +
                     f2fs_params.cur_seg[CURSEG_HOT_DATA] * f2fs_params.blks_per_seg) *
                    blk_size_bytes;

  ret = WriteToDisk(dent_blk, data_blk_offset, F2FS_BLKSIZE);
  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] = f2fs_params.total_sectors * DEFAULT_SECTOR_SIZE;

//         if (fstat(f2fs_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(f2fs_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
