Home | History | Annotate | Download | only in mkfs
      1 /**
      2  * f2fs_format.c
      3  *
      4  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
      5  *             http://www.samsung.com/
      6  *
      7  * Dual licensed under the GPL or LGPL version 2 licenses.
      8  */
      9 #define _LARGEFILE64_SOURCE
     10 
     11 #include <stdio.h>
     12 #include <stdlib.h>
     13 #include <fcntl.h>
     14 #include <string.h>
     15 #include <unistd.h>
     16 #include <sys/stat.h>
     17 #include <sys/mount.h>
     18 #include <time.h>
     19 #include <uuid/uuid.h>
     20 
     21 #include "f2fs_fs.h"
     22 #include "f2fs_format_utils.h"
     23 
     24 extern struct f2fs_configuration c;
     25 struct f2fs_super_block raw_sb;
     26 struct f2fs_super_block *sb = &raw_sb;
     27 struct f2fs_checkpoint *cp;
     28 
     29 /* Return first segment number of each area */
     30 #define prev_zone(cur)		(c.cur_seg[cur] - c.segs_per_zone)
     31 #define next_zone(cur)		(c.cur_seg[cur] + c.segs_per_zone)
     32 #define last_zone(cur)		((cur - 1) * c.segs_per_zone)
     33 #define last_section(cur)	(cur + (c.secs_per_zone - 1) * c.segs_per_sec)
     34 
     35 const char *media_ext_lists[] = {
     36 	"jpg",
     37 	"gif",
     38 	"png",
     39 	"avi",
     40 	"divx",
     41 	"mp4",
     42 	"mp3",
     43 	"3gp",
     44 	"wmv",
     45 	"wma",
     46 	"mpeg",
     47 	"mkv",
     48 	"mov",
     49 	"asx",
     50 	"asf",
     51 	"wmx",
     52 	"svi",
     53 	"wvx",
     54 	"wm",
     55 	"mpg",
     56 	"mpe",
     57 	"rm",
     58 	"ogg",
     59 	"jpeg",
     60 	"video",
     61 	"apk",	/* for android system */
     62 	NULL
     63 };
     64 
     65 static bool is_extension_exist(const char *name)
     66 {
     67 	int i;
     68 
     69 	for (i = 0; i < F2FS_MAX_EXTENSION; i++) {
     70 		char *ext = (char *)sb->extension_list[i];
     71 		if (!strcmp(ext, name))
     72 			return 1;
     73 	}
     74 
     75 	return 0;
     76 }
     77 
     78 static void cure_extension_list(void)
     79 {
     80 	const char **extlist = media_ext_lists;
     81 	char *ext_str = c.extension_list;
     82 	char *ue;
     83 	int name_len;
     84 	int i = 0;
     85 
     86 	set_sb(extension_count, 0);
     87 	memset(sb->extension_list, 0, sizeof(sb->extension_list));
     88 
     89 	while (*extlist) {
     90 		name_len = strlen(*extlist);
     91 		memcpy(sb->extension_list[i++], *extlist, name_len);
     92 		extlist++;
     93 	}
     94 	set_sb(extension_count, i);
     95 
     96 	if (!ext_str)
     97 		return;
     98 
     99 	/* add user ext list */
    100 	ue = strtok(ext_str, ", ");
    101 	while (ue != NULL) {
    102 		name_len = strlen(ue);
    103 		if (name_len >= 8) {
    104 			MSG(0, "\tWarn: Extension name (%s) is too long\n", ue);
    105 			goto next;
    106 		}
    107 		if (!is_extension_exist(ue))
    108 			memcpy(sb->extension_list[i++], ue, name_len);
    109 next:
    110 		ue = strtok(NULL, ", ");
    111 		if (i >= F2FS_MAX_EXTENSION)
    112 			break;
    113 	}
    114 
    115 	set_sb(extension_count, i);
    116 
    117 	free(c.extension_list);
    118 }
    119 
    120 static void verify_cur_segs(void)
    121 {
    122 	int i, j;
    123 
    124 	for (i = 0; i < NR_CURSEG_TYPE; i++) {
    125 		for (j = 0; j < NR_CURSEG_TYPE; j++)
    126 			if (c.cur_seg[i] == c.cur_seg[j])
    127 				break;
    128 	}
    129 
    130 	if (i == NR_CURSEG_TYPE && j == NR_CURSEG_TYPE)
    131 		return;
    132 
    133 	c.cur_seg[0] = 0;
    134 	for (i = 1; i < NR_CURSEG_TYPE; i++)
    135 		c.cur_seg[i] = next_zone(i - 1);
    136 }
    137 
    138 static int f2fs_prepare_super_block(void)
    139 {
    140 	u_int32_t blk_size_bytes;
    141 	u_int32_t log_sectorsize, log_sectors_per_block;
    142 	u_int32_t log_blocksize, log_blks_per_seg;
    143 	u_int32_t segment_size_bytes, zone_size_bytes;
    144 	u_int32_t sit_segments;
    145 	u_int32_t blocks_for_sit, blocks_for_nat, blocks_for_ssa;
    146 	u_int32_t total_valid_blks_available;
    147 	u_int64_t zone_align_start_offset, diff;
    148 	u_int64_t total_meta_zones, total_meta_segments;
    149 	u_int32_t sit_bitmap_size, max_sit_bitmap_size;
    150 	u_int32_t max_nat_bitmap_size, max_nat_segments;
    151 	u_int32_t total_zones;
    152 	int i;
    153 
    154 	set_sb(magic, F2FS_SUPER_MAGIC);
    155 	set_sb(major_ver, F2FS_MAJOR_VERSION);
    156 	set_sb(minor_ver, F2FS_MINOR_VERSION);
    157 
    158 	log_sectorsize = log_base_2(c.sector_size);
    159 	log_sectors_per_block = log_base_2(c.sectors_per_blk);
    160 	log_blocksize = log_sectorsize + log_sectors_per_block;
    161 	log_blks_per_seg = log_base_2(c.blks_per_seg);
    162 
    163 	set_sb(log_sectorsize, log_sectorsize);
    164 	set_sb(log_sectors_per_block, log_sectors_per_block);
    165 
    166 	set_sb(log_blocksize, log_blocksize);
    167 	set_sb(log_blocks_per_seg, log_blks_per_seg);
    168 
    169 	set_sb(segs_per_sec, c.segs_per_sec);
    170 	set_sb(secs_per_zone, c.secs_per_zone);
    171 
    172 	blk_size_bytes = 1 << log_blocksize;
    173 	segment_size_bytes = blk_size_bytes * c.blks_per_seg;
    174 	zone_size_bytes =
    175 		blk_size_bytes * c.secs_per_zone *
    176 		c.segs_per_sec * c.blks_per_seg;
    177 
    178 	set_sb(checksum_offset, 0);
    179 
    180 	set_sb(block_count, c.total_sectors >> log_sectors_per_block);
    181 
    182 	zone_align_start_offset =
    183 		(c.start_sector * c.sector_size +
    184 		2 * F2FS_BLKSIZE + zone_size_bytes - 1) /
    185 		zone_size_bytes * zone_size_bytes -
    186 		c.start_sector * c.sector_size;
    187 
    188 	if (c.start_sector % c.sectors_per_blk) {
    189 		MSG(1, "\t%s: Align start sector number to the page unit\n",
    190 				c.zoned_mode ? "FAIL" : "WARN");
    191 		MSG(1, "\ti.e., start sector: %d, ofs:%d (sects/page: %d)\n",
    192 				c.start_sector,
    193 				c.start_sector % c.sectors_per_blk,
    194 				c.sectors_per_blk);
    195 		if (c.zoned_mode)
    196 			return -1;
    197 	}
    198 
    199 	set_sb(segment0_blkaddr, zone_align_start_offset / blk_size_bytes);
    200 	sb->cp_blkaddr = sb->segment0_blkaddr;
    201 
    202 	MSG(0, "Info: zone aligned segment0 blkaddr: %u\n",
    203 					get_sb(segment0_blkaddr));
    204 
    205 	if (c.zoned_mode && (get_sb(segment0_blkaddr) + c.start_sector /
    206 					c.sectors_per_blk) % c.zone_blocks) {
    207 		MSG(1, "\tError: Unaligned segment0 block address %u\n",
    208 				get_sb(segment0_blkaddr));
    209 		return -1;
    210 	}
    211 
    212 	for (i = 0; i < c.ndevs; i++) {
    213 		if (i == 0) {
    214 			c.devices[i].total_segments =
    215 				(c.devices[i].total_sectors *
    216 				c.sector_size - zone_align_start_offset) /
    217 				segment_size_bytes;
    218 			c.devices[i].start_blkaddr = 0;
    219 			c.devices[i].end_blkaddr = c.devices[i].total_segments *
    220 						c.blks_per_seg - 1 +
    221 						sb->segment0_blkaddr;
    222 		} else {
    223 			c.devices[i].total_segments =
    224 				c.devices[i].total_sectors /
    225 				(c.sectors_per_blk * c.blks_per_seg);
    226 			c.devices[i].start_blkaddr =
    227 					c.devices[i - 1].end_blkaddr + 1;
    228 			c.devices[i].end_blkaddr = c.devices[i].start_blkaddr +
    229 					c.devices[i].total_segments *
    230 					c.blks_per_seg - 1;
    231 		}
    232 		if (c.ndevs > 1) {
    233 			memcpy(sb->devs[i].path, c.devices[i].path, MAX_PATH_LEN);
    234 			sb->devs[i].total_segments =
    235 					cpu_to_le32(c.devices[i].total_segments);
    236 		}
    237 
    238 		c.total_segments += c.devices[i].total_segments;
    239 	}
    240 	set_sb(segment_count, (c.total_segments / c.segs_per_zone *
    241 						c.segs_per_zone));
    242 	set_sb(segment_count_ckpt, F2FS_NUMBER_OF_CHECKPOINT_PACK);
    243 
    244 	set_sb(sit_blkaddr, get_sb(segment0_blkaddr) +
    245 			get_sb(segment_count_ckpt) * c.blks_per_seg);
    246 
    247 	blocks_for_sit = ALIGN(get_sb(segment_count), SIT_ENTRY_PER_BLOCK);
    248 
    249 	sit_segments = SEG_ALIGN(blocks_for_sit);
    250 
    251 	set_sb(segment_count_sit, sit_segments * 2);
    252 
    253 	set_sb(nat_blkaddr, get_sb(sit_blkaddr) + get_sb(segment_count_sit) *
    254 			c.blks_per_seg);
    255 
    256 	total_valid_blks_available = (get_sb(segment_count) -
    257 			(get_sb(segment_count_ckpt) +
    258 			get_sb(segment_count_sit))) * c.blks_per_seg;
    259 
    260 	blocks_for_nat = ALIGN(total_valid_blks_available,
    261 			NAT_ENTRY_PER_BLOCK);
    262 
    263 	set_sb(segment_count_nat, SEG_ALIGN(blocks_for_nat));
    264 	/*
    265 	 * The number of node segments should not be exceeded a "Threshold".
    266 	 * This number resizes NAT bitmap area in a CP page.
    267 	 * So the threshold is determined not to overflow one CP page
    268 	 */
    269 	sit_bitmap_size = ((get_sb(segment_count_sit) / 2) <<
    270 				log_blks_per_seg) / 8;
    271 
    272 	if (sit_bitmap_size > MAX_SIT_BITMAP_SIZE)
    273 		max_sit_bitmap_size = MAX_SIT_BITMAP_SIZE;
    274 	else
    275 		max_sit_bitmap_size = sit_bitmap_size;
    276 
    277 	/*
    278 	 * It should be reserved minimum 1 segment for nat.
    279 	 * When sit is too large, we should expand cp area. It requires more
    280 	 * pages for cp.
    281 	 */
    282 	if (max_sit_bitmap_size >
    283 			(CHECKSUM_OFFSET -
    284 				sizeof(struct f2fs_checkpoint) + 1 - 64)) {
    285 		max_nat_bitmap_size = CHECKSUM_OFFSET -
    286 				sizeof(struct f2fs_checkpoint) + 1;
    287 		set_sb(cp_payload, F2FS_BLK_ALIGN(max_sit_bitmap_size));
    288 	} else {
    289 		max_nat_bitmap_size =
    290 			CHECKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1
    291 			- max_sit_bitmap_size;
    292 		set_sb(cp_payload, 0);
    293 	}
    294 
    295 	max_nat_segments = (max_nat_bitmap_size * 8) >> log_blks_per_seg;
    296 
    297 	if (get_sb(segment_count_nat) > max_nat_segments)
    298 		set_sb(segment_count_nat, max_nat_segments);
    299 
    300 	set_sb(segment_count_nat, get_sb(segment_count_nat) * 2);
    301 
    302 	set_sb(ssa_blkaddr, get_sb(nat_blkaddr) + get_sb(segment_count_nat) *
    303 			c.blks_per_seg);
    304 
    305 	total_valid_blks_available = (get_sb(segment_count) -
    306 			(get_sb(segment_count_ckpt) +
    307 			get_sb(segment_count_sit) +
    308 			get_sb(segment_count_nat))) *
    309 			c.blks_per_seg;
    310 
    311 	blocks_for_ssa = total_valid_blks_available /
    312 				c.blks_per_seg + 1;
    313 
    314 	set_sb(segment_count_ssa, SEG_ALIGN(blocks_for_ssa));
    315 
    316 	total_meta_segments = get_sb(segment_count_ckpt) +
    317 		get_sb(segment_count_sit) +
    318 		get_sb(segment_count_nat) +
    319 		get_sb(segment_count_ssa);
    320 	diff = total_meta_segments % (c.segs_per_zone);
    321 	if (diff)
    322 		set_sb(segment_count_ssa, get_sb(segment_count_ssa) +
    323 			(c.segs_per_zone - diff));
    324 
    325 	total_meta_zones = ZONE_ALIGN(total_meta_segments *
    326 						c.blks_per_seg);
    327 
    328 	set_sb(main_blkaddr, get_sb(segment0_blkaddr) + total_meta_zones *
    329 				c.segs_per_zone * c.blks_per_seg);
    330 
    331 	if (c.zoned_mode) {
    332 		/*
    333 		 * Make sure there is enough randomly writeable
    334 		 * space at the beginning of the disk.
    335 		 */
    336 		unsigned long main_blkzone = get_sb(main_blkaddr) / c.zone_blocks;
    337 
    338 		if (c.devices[0].zoned_model == F2FS_ZONED_HM &&
    339 				c.devices[0].nr_rnd_zones < main_blkzone) {
    340 			MSG(0, "\tError: Device does not have enough random "
    341 					"write zones for F2FS volume (%lu needed)\n",
    342 					main_blkzone);
    343 			return -1;
    344 		}
    345 	}
    346 
    347 	total_zones = get_sb(segment_count) / (c.segs_per_zone) -
    348 							total_meta_zones;
    349 
    350 	set_sb(section_count, total_zones * c.secs_per_zone);
    351 
    352 	set_sb(segment_count_main, get_sb(section_count) * c.segs_per_sec);
    353 
    354 	/* Let's determine the best reserved and overprovisioned space */
    355 	if (c.overprovision == 0)
    356 		c.overprovision = get_best_overprovision(sb);
    357 
    358 	if (c.overprovision == 0 || c.total_segments < F2FS_MIN_SEGMENTS ||
    359 		(c.devices[0].total_sectors *
    360 			c.sector_size < zone_align_start_offset) ||
    361 		(get_sb(segment_count_main) - 2) < c.reserved_segments) {
    362 		MSG(0, "\tError: Device size is not sufficient for F2FS volume\n");
    363 		return -1;
    364 	}
    365 
    366 	c.reserved_segments =
    367 			(2 * (100 / c.overprovision + 1) + 6)
    368 			* c.segs_per_sec;
    369 
    370 	uuid_generate(sb->uuid);
    371 
    372 	utf8_to_utf16(sb->volume_name, (const char *)c.vol_label,
    373 				MAX_VOLUME_NAME, strlen(c.vol_label));
    374 	set_sb(node_ino, 1);
    375 	set_sb(meta_ino, 2);
    376 	set_sb(root_ino, 3);
    377 
    378 	if (total_zones <= 6) {
    379 		MSG(1, "\tError: %d zones: Need more zones "
    380 			"by shrinking zone size\n", total_zones);
    381 		return -1;
    382 	}
    383 
    384 	if (c.heap) {
    385 		c.cur_seg[CURSEG_HOT_NODE] =
    386 				last_section(last_zone(total_zones));
    387 		c.cur_seg[CURSEG_WARM_NODE] = prev_zone(CURSEG_HOT_NODE);
    388 		c.cur_seg[CURSEG_COLD_NODE] = prev_zone(CURSEG_WARM_NODE);
    389 		c.cur_seg[CURSEG_HOT_DATA] = prev_zone(CURSEG_COLD_NODE);
    390 		c.cur_seg[CURSEG_COLD_DATA] = 0;
    391 		c.cur_seg[CURSEG_WARM_DATA] = next_zone(CURSEG_COLD_DATA);
    392 	} else {
    393 		c.cur_seg[CURSEG_HOT_NODE] = 0;
    394 		c.cur_seg[CURSEG_WARM_NODE] = next_zone(CURSEG_HOT_NODE);
    395 		c.cur_seg[CURSEG_COLD_NODE] = next_zone(CURSEG_WARM_NODE);
    396 		c.cur_seg[CURSEG_HOT_DATA] = next_zone(CURSEG_COLD_NODE);
    397 		c.cur_seg[CURSEG_COLD_DATA] =
    398 				max(last_zone((total_zones >> 2)),
    399 					next_zone(CURSEG_COLD_NODE));
    400 		c.cur_seg[CURSEG_WARM_DATA] =
    401 				max(last_zone((total_zones >> 1)),
    402 					next_zone(CURSEG_COLD_DATA));
    403 	}
    404 
    405 	/* if there is redundancy, reassign it */
    406 	verify_cur_segs();
    407 
    408 	cure_extension_list();
    409 
    410 	/* get kernel version */
    411 	if (c.kd >= 0) {
    412 		dev_read_version(c.version, 0, VERSION_LEN);
    413 		get_kernel_version(c.version);
    414 		MSG(0, "Info: format version with\n  \"%s\"\n", c.version);
    415 	} else {
    416 		memset(c.version, 0, VERSION_LEN);
    417 	}
    418 
    419 	memcpy(sb->version, c.version, VERSION_LEN);
    420 	memcpy(sb->init_version, c.version, VERSION_LEN);
    421 
    422 	sb->feature = c.feature;
    423 
    424 	return 0;
    425 }
    426 
    427 static int f2fs_init_sit_area(void)
    428 {
    429 	u_int32_t blk_size, seg_size;
    430 	u_int32_t index = 0;
    431 	u_int64_t sit_seg_addr = 0;
    432 	u_int8_t *zero_buf = NULL;
    433 
    434 	blk_size = 1 << get_sb(log_blocksize);
    435 	seg_size = (1 << get_sb(log_blocks_per_seg)) * blk_size;
    436 
    437 	zero_buf = calloc(sizeof(u_int8_t), seg_size);
    438 	if(zero_buf == NULL) {
    439 		MSG(1, "\tError: Calloc Failed for sit_zero_buf!!!\n");
    440 		return -1;
    441 	}
    442 
    443 	sit_seg_addr = get_sb(sit_blkaddr);
    444 	sit_seg_addr *= blk_size;
    445 
    446 	DBG(1, "\tFilling sit area at offset 0x%08"PRIx64"\n", sit_seg_addr);
    447 	for (index = 0; index < (get_sb(segment_count_sit) / 2); index++) {
    448 		if (dev_fill(zero_buf, sit_seg_addr, seg_size)) {
    449 			MSG(1, "\tError: While zeroing out the sit area "
    450 					"on disk!!!\n");
    451 			free(zero_buf);
    452 			return -1;
    453 		}
    454 		sit_seg_addr += seg_size;
    455 	}
    456 
    457 	free(zero_buf);
    458 	return 0 ;
    459 }
    460 
    461 static int f2fs_init_nat_area(void)
    462 {
    463 	u_int32_t blk_size, seg_size;
    464 	u_int32_t index = 0;
    465 	u_int64_t nat_seg_addr = 0;
    466 	u_int8_t *nat_buf = NULL;
    467 
    468 	blk_size = 1 << get_sb(log_blocksize);
    469 	seg_size = (1 << get_sb(log_blocks_per_seg)) * blk_size;
    470 
    471 	nat_buf = calloc(sizeof(u_int8_t), seg_size);
    472 	if (nat_buf == NULL) {
    473 		MSG(1, "\tError: Calloc Failed for nat_zero_blk!!!\n");
    474 		return -1;
    475 	}
    476 
    477 	nat_seg_addr = get_sb(nat_blkaddr);
    478 	nat_seg_addr *= blk_size;
    479 
    480 	DBG(1, "\tFilling nat area at offset 0x%08"PRIx64"\n", nat_seg_addr);
    481 	for (index = 0; index < get_sb(segment_count_nat) / 2; index++) {
    482 		if (dev_fill(nat_buf, nat_seg_addr, seg_size)) {
    483 			MSG(1, "\tError: While zeroing out the nat area "
    484 					"on disk!!!\n");
    485 			free(nat_buf);
    486 			return -1;
    487 		}
    488 		nat_seg_addr = nat_seg_addr + (2 * seg_size);
    489 	}
    490 
    491 	free(nat_buf);
    492 	return 0 ;
    493 }
    494 
    495 static int f2fs_write_check_point_pack(void)
    496 {
    497 	struct f2fs_summary_block *sum = NULL;
    498 	struct f2fs_journal *journal;
    499 	u_int32_t blk_size_bytes;
    500 	u_int32_t nat_bits_bytes, nat_bits_blocks;
    501 	unsigned char *nat_bits = NULL, *empty_nat_bits;
    502 	u_int64_t cp_seg_blk = 0;
    503 	u_int32_t crc = 0, flags;
    504 	unsigned int i;
    505 	char *cp_payload = NULL;
    506 	char *sum_compact, *sum_compact_p;
    507 	struct f2fs_summary *sum_entry;
    508 	int ret = -1;
    509 
    510 	cp = calloc(F2FS_BLKSIZE, 1);
    511 	if (cp == NULL) {
    512 		MSG(1, "\tError: Calloc Failed for f2fs_checkpoint!!!\n");
    513 		return ret;
    514 	}
    515 
    516 	sum = calloc(F2FS_BLKSIZE, 1);
    517 	if (sum == NULL) {
    518 		MSG(1, "\tError: Calloc Failed for summay_node!!!\n");
    519 		goto free_cp;
    520 	}
    521 
    522 	sum_compact = calloc(F2FS_BLKSIZE, 1);
    523 	if (sum_compact == NULL) {
    524 		MSG(1, "\tError: Calloc Failed for summay buffer!!!\n");
    525 		goto free_sum;
    526 	}
    527 	sum_compact_p = sum_compact;
    528 
    529 	nat_bits_bytes = get_sb(segment_count_nat) << 5;
    530 	nat_bits_blocks = F2FS_BYTES_TO_BLK((nat_bits_bytes << 1) + 8 +
    531 						F2FS_BLKSIZE - 1);
    532 	nat_bits = calloc(F2FS_BLKSIZE, nat_bits_blocks);
    533 	if (nat_bits == NULL) {
    534 		MSG(1, "\tError: Calloc Failed for nat bits buffer!!!\n");
    535 		goto free_sum_compact;
    536 	}
    537 
    538 	cp_payload = calloc(F2FS_BLKSIZE, 1);
    539 	if (cp_payload == NULL) {
    540 		MSG(1, "\tError: Calloc Failed for cp_payload!!!\n");
    541 		goto free_nat_bits;
    542 	}
    543 
    544 	/* 1. cp page 1 of checkpoint pack 1 */
    545 	cp->checkpoint_ver = rand() | 0x1;
    546 	set_cp(cur_node_segno[0], c.cur_seg[CURSEG_HOT_NODE]);
    547 	set_cp(cur_node_segno[1], c.cur_seg[CURSEG_WARM_NODE]);
    548 	set_cp(cur_node_segno[2], c.cur_seg[CURSEG_COLD_NODE]);
    549 	set_cp(cur_data_segno[0], c.cur_seg[CURSEG_HOT_DATA]);
    550 	set_cp(cur_data_segno[1], c.cur_seg[CURSEG_WARM_DATA]);
    551 	set_cp(cur_data_segno[2], c.cur_seg[CURSEG_COLD_DATA]);
    552 	for (i = 3; i < MAX_ACTIVE_NODE_LOGS; i++) {
    553 		set_cp(cur_node_segno[i], 0xffffffff);
    554 		set_cp(cur_data_segno[i], 0xffffffff);
    555 	}
    556 
    557 	set_cp(cur_node_blkoff[0], 1);
    558 	set_cp(cur_data_blkoff[0], 1);
    559 	set_cp(valid_block_count, 2);
    560 	set_cp(rsvd_segment_count, c.reserved_segments);
    561 	set_cp(overprov_segment_count, (get_sb(segment_count_main) -
    562 			get_cp(rsvd_segment_count)) *
    563 			c.overprovision / 100);
    564 	set_cp(overprov_segment_count, get_cp(overprov_segment_count) +
    565 			get_cp(rsvd_segment_count));
    566 
    567 	MSG(0, "Info: Overprovision ratio = %.3lf%%\n", c.overprovision);
    568 	MSG(0, "Info: Overprovision segments = %u (GC reserved = %u)\n",
    569 					get_cp(overprov_segment_count),
    570 					c.reserved_segments);
    571 
    572 	/* main segments - reserved segments - (node + data segments) */
    573 	set_cp(free_segment_count, get_sb(segment_count_main) - 6);
    574 	set_cp(user_block_count, ((get_cp(free_segment_count) + 6 -
    575 			get_cp(overprov_segment_count)) * c.blks_per_seg));
    576 	/* cp page (2), data summaries (1), node summaries (3) */
    577 	set_cp(cp_pack_total_block_count, 6 + get_sb(cp_payload));
    578 	flags = CP_UMOUNT_FLAG | CP_COMPACT_SUM_FLAG;
    579 	if (get_cp(cp_pack_total_block_count) <=
    580 			(1 << get_sb(log_blocks_per_seg)) - nat_bits_blocks)
    581 		flags |= CP_NAT_BITS_FLAG;
    582 
    583 	if (c.trimmed)
    584 		flags |= CP_TRIMMED_FLAG;
    585 
    586 	set_cp(ckpt_flags, flags);
    587 	set_cp(cp_pack_start_sum, 1 + get_sb(cp_payload));
    588 	set_cp(valid_node_count, 1);
    589 	set_cp(valid_inode_count, 1);
    590 	set_cp(next_free_nid, get_sb(root_ino) + 1);
    591 	set_cp(sit_ver_bitmap_bytesize, ((get_sb(segment_count_sit) / 2) <<
    592 			get_sb(log_blocks_per_seg)) / 8);
    593 
    594 	set_cp(nat_ver_bitmap_bytesize, ((get_sb(segment_count_nat) / 2) <<
    595 			 get_sb(log_blocks_per_seg)) / 8);
    596 
    597 	set_cp(checksum_offset, CHECKSUM_OFFSET);
    598 
    599 	crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CHECKSUM_OFFSET);
    600 	*((__le32 *)((unsigned char *)cp + CHECKSUM_OFFSET)) =
    601 							cpu_to_le32(crc);
    602 
    603 	blk_size_bytes = 1 << get_sb(log_blocksize);
    604 
    605 	if (blk_size_bytes != F2FS_BLKSIZE) {
    606 		MSG(1, "\tError: Wrong block size %d / %d!!!\n",
    607 					blk_size_bytes, F2FS_BLKSIZE);
    608 		goto free_cp_payload;
    609 	}
    610 
    611 	cp_seg_blk = get_sb(segment0_blkaddr);
    612 
    613 	DBG(1, "\tWriting main segments, cp at offset 0x%08"PRIx64"\n",
    614 						cp_seg_blk);
    615 	if (dev_write_block(cp, cp_seg_blk)) {
    616 		MSG(1, "\tError: While writing the cp to disk!!!\n");
    617 		goto free_cp_payload;
    618 	}
    619 
    620 	for (i = 0; i < get_sb(cp_payload); i++) {
    621 		cp_seg_blk++;
    622 		if (dev_fill_block(cp_payload, cp_seg_blk)) {
    623 			MSG(1, "\tError: While zeroing out the sit bitmap area "
    624 					"on disk!!!\n");
    625 			goto free_cp_payload;
    626 		}
    627 	}
    628 
    629 	/* Prepare and write Segment summary for HOT/WARM/COLD DATA
    630 	 *
    631 	 * The structure of compact summary
    632 	 * +-------------------+
    633 	 * | nat_journal       |
    634 	 * +-------------------+
    635 	 * | sit_journal       |
    636 	 * +-------------------+
    637 	 * | hot data summary  |
    638 	 * +-------------------+
    639 	 * | warm data summary |
    640 	 * +-------------------+
    641 	 * | cold data summary |
    642 	 * +-------------------+
    643 	*/
    644 	memset(sum, 0, sizeof(struct f2fs_summary_block));
    645 	SET_SUM_TYPE((&sum->footer), SUM_TYPE_DATA);
    646 
    647 	journal = &sum->journal;
    648 	journal->n_nats = cpu_to_le16(1);
    649 	journal->nat_j.entries[0].nid = sb->root_ino;
    650 	journal->nat_j.entries[0].ne.version = 0;
    651 	journal->nat_j.entries[0].ne.ino = sb->root_ino;
    652 	journal->nat_j.entries[0].ne.block_addr = cpu_to_le32(
    653 			get_sb(main_blkaddr) +
    654 			get_cp(cur_node_segno[0]) * c.blks_per_seg);
    655 
    656 	memcpy(sum_compact_p, &journal->n_nats, SUM_JOURNAL_SIZE);
    657 	sum_compact_p += SUM_JOURNAL_SIZE;
    658 
    659 	memset(sum, 0, sizeof(struct f2fs_summary_block));
    660 	/* inode sit for root */
    661 	journal->n_sits = cpu_to_le16(6);
    662 	journal->sit_j.entries[0].segno = cp->cur_node_segno[0];
    663 	journal->sit_j.entries[0].se.vblocks =
    664 				cpu_to_le16((CURSEG_HOT_NODE << 10) | 1);
    665 	f2fs_set_bit(0, (char *)journal->sit_j.entries[0].se.valid_map);
    666 	journal->sit_j.entries[1].segno = cp->cur_node_segno[1];
    667 	journal->sit_j.entries[1].se.vblocks =
    668 				cpu_to_le16((CURSEG_WARM_NODE << 10));
    669 	journal->sit_j.entries[2].segno = cp->cur_node_segno[2];
    670 	journal->sit_j.entries[2].se.vblocks =
    671 				cpu_to_le16((CURSEG_COLD_NODE << 10));
    672 
    673 	/* data sit for root */
    674 	journal->sit_j.entries[3].segno = cp->cur_data_segno[0];
    675 	journal->sit_j.entries[3].se.vblocks =
    676 				cpu_to_le16((CURSEG_HOT_DATA << 10) | 1);
    677 	f2fs_set_bit(0, (char *)journal->sit_j.entries[3].se.valid_map);
    678 	journal->sit_j.entries[4].segno = cp->cur_data_segno[1];
    679 	journal->sit_j.entries[4].se.vblocks =
    680 				cpu_to_le16((CURSEG_WARM_DATA << 10));
    681 	journal->sit_j.entries[5].segno = cp->cur_data_segno[2];
    682 	journal->sit_j.entries[5].se.vblocks =
    683 				cpu_to_le16((CURSEG_COLD_DATA << 10));
    684 
    685 	memcpy(sum_compact_p, &journal->n_sits, SUM_JOURNAL_SIZE);
    686 	sum_compact_p += SUM_JOURNAL_SIZE;
    687 
    688 	/* hot data summary */
    689 	sum_entry = (struct f2fs_summary *)sum_compact_p;
    690 	sum_entry->nid = sb->root_ino;
    691 	sum_entry->ofs_in_node = 0;
    692 	/* warm data summary, nothing to do */
    693 	/* cold data summary, nothing to do */
    694 
    695 	cp_seg_blk++;
    696 	DBG(1, "\tWriting Segment summary for HOT/WARM/COLD_DATA, at offset 0x%08"PRIx64"\n",
    697 			cp_seg_blk);
    698 	if (dev_write_block(sum_compact, cp_seg_blk)) {
    699 		MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
    700 		goto free_cp_payload;
    701 	}
    702 
    703 	/* Prepare and write Segment summary for HOT_NODE */
    704 	memset(sum, 0, sizeof(struct f2fs_summary_block));
    705 	SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);
    706 
    707 	sum->entries[0].nid = sb->root_ino;
    708 	sum->entries[0].ofs_in_node = 0;
    709 
    710 	cp_seg_blk++;
    711 	DBG(1, "\tWriting Segment summary for HOT_NODE, at offset 0x%08"PRIx64"\n",
    712 			cp_seg_blk);
    713 	if (dev_write_block(sum, cp_seg_blk)) {
    714 		MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
    715 		goto free_cp_payload;
    716 	}
    717 
    718 	/* Fill segment summary for WARM_NODE to zero. */
    719 	memset(sum, 0, sizeof(struct f2fs_summary_block));
    720 	SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);
    721 
    722 	cp_seg_blk++;
    723 	DBG(1, "\tWriting Segment summary for WARM_NODE, at offset 0x%08"PRIx64"\n",
    724 			cp_seg_blk);
    725 	if (dev_write_block(sum, cp_seg_blk)) {
    726 		MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
    727 		goto free_cp_payload;
    728 	}
    729 
    730 	/* Fill segment summary for COLD_NODE to zero. */
    731 	memset(sum, 0, sizeof(struct f2fs_summary_block));
    732 	SET_SUM_TYPE((&sum->footer), SUM_TYPE_NODE);
    733 	cp_seg_blk++;
    734 	DBG(1, "\tWriting Segment summary for COLD_NODE, at offset 0x%08"PRIx64"\n",
    735 			cp_seg_blk);
    736 	if (dev_write_block(sum, cp_seg_blk)) {
    737 		MSG(1, "\tError: While writing the sum_blk to disk!!!\n");
    738 		goto free_cp_payload;
    739 	}
    740 
    741 	/* cp page2 */
    742 	cp_seg_blk++;
    743 	DBG(1, "\tWriting cp page2, at offset 0x%08"PRIx64"\n", cp_seg_blk);
    744 	if (dev_write_block(cp, cp_seg_blk)) {
    745 		MSG(1, "\tError: While writing the cp to disk!!!\n");
    746 		goto free_cp_payload;
    747 	}
    748 
    749 	/* write NAT bits, if possible */
    750 	if (flags & CP_NAT_BITS_FLAG) {
    751 		uint32_t i;
    752 
    753 		*(__le64 *)nat_bits = get_cp_crc(cp);
    754 		empty_nat_bits = nat_bits + 8 + nat_bits_bytes;
    755 		memset(empty_nat_bits, 0xff, nat_bits_bytes);
    756 		test_and_clear_bit_le(0, empty_nat_bits);
    757 
    758 		/* write the last blocks in cp pack */
    759 		cp_seg_blk = get_sb(segment0_blkaddr) + (1 <<
    760 				get_sb(log_blocks_per_seg)) - nat_bits_blocks;
    761 
    762 		DBG(1, "\tWriting NAT bits pages, at offset 0x%08"PRIx64"\n",
    763 					cp_seg_blk);
    764 
    765 		for (i = 0; i < nat_bits_blocks; i++) {
    766 			if (dev_write_block(nat_bits + i *
    767 						F2FS_BLKSIZE, cp_seg_blk + i)) {
    768 				MSG(1, "\tError: write NAT bits to disk!!!\n");
    769 				goto free_cp_payload;
    770 			}
    771 		}
    772 	}
    773 
    774 	/* cp page 1 of check point pack 2
    775 	 * Initiatialize other checkpoint pack with version zero
    776 	 */
    777 	cp->checkpoint_ver = 0;
    778 
    779 	crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CHECKSUM_OFFSET);
    780 	*((__le32 *)((unsigned char *)cp + CHECKSUM_OFFSET)) =
    781 							cpu_to_le32(crc);
    782 	cp_seg_blk = get_sb(segment0_blkaddr) + c.blks_per_seg;
    783 	DBG(1, "\tWriting cp page 1 of checkpoint pack 2, at offset 0x%08"PRIx64"\n",
    784 				cp_seg_blk);
    785 	if (dev_write_block(cp, cp_seg_blk)) {
    786 		MSG(1, "\tError: While writing the cp to disk!!!\n");
    787 		goto free_cp_payload;
    788 	}
    789 
    790 	for (i = 0; i < get_sb(cp_payload); i++) {
    791 		cp_seg_blk++;
    792 		if (dev_fill_block(cp_payload, cp_seg_blk)) {
    793 			MSG(1, "\tError: While zeroing out the sit bitmap area "
    794 					"on disk!!!\n");
    795 			goto free_cp_payload;
    796 		}
    797 	}
    798 
    799 	/* cp page 2 of check point pack 2 */
    800 	cp_seg_blk += (le32_to_cpu(cp->cp_pack_total_block_count) -
    801 					get_sb(cp_payload) - 1);
    802 	DBG(1, "\tWriting cp page 2 of checkpoint pack 2, at offset 0x%08"PRIx64"\n",
    803 				cp_seg_blk);
    804 	if (dev_write_block(cp, cp_seg_blk)) {
    805 		MSG(1, "\tError: While writing the cp to disk!!!\n");
    806 		goto free_cp_payload;
    807 	}
    808 
    809 	ret = 0;
    810 
    811 free_cp_payload:
    812 	free(cp_payload);
    813 free_nat_bits:
    814 	free(nat_bits);
    815 free_sum_compact:
    816 	free(sum_compact);
    817 free_sum:
    818 	free(sum);
    819 free_cp:
    820 	free(cp);
    821 	return ret;
    822 }
    823 
    824 static int f2fs_write_super_block(void)
    825 {
    826 	int index;
    827 	u_int8_t *zero_buff;
    828 
    829 	zero_buff = calloc(F2FS_BLKSIZE, 1);
    830 
    831 	memcpy(zero_buff + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
    832 	DBG(1, "\tWriting super block, at offset 0x%08x\n", 0);
    833 	for (index = 0; index < 2; index++) {
    834 		if (dev_write_block(zero_buff, index)) {
    835 			MSG(1, "\tError: While while writing supe_blk "
    836 					"on disk!!! index : %d\n", index);
    837 			free(zero_buff);
    838 			return -1;
    839 		}
    840 	}
    841 
    842 	free(zero_buff);
    843 	return 0;
    844 }
    845 
    846 #ifndef WITH_ANDROID
    847 static int discard_obsolete_dnode(struct f2fs_node *raw_node, u_int64_t offset)
    848 {
    849 	u_int64_t next_blkaddr = 0;
    850 	u_int64_t root_inode_pos = get_sb(main_blkaddr);
    851 
    852 	/* only root inode was written before truncating dnodes */
    853 	root_inode_pos += c.cur_seg[CURSEG_HOT_NODE] * c.blks_per_seg;
    854 
    855 	if (c.zoned_mode)
    856 		return 0;
    857 	do {
    858 		if (offset < get_sb(main_blkaddr) ||
    859 			offset >= get_sb(main_blkaddr) + get_sb(block_count))
    860 			break;
    861 
    862 		if (dev_read_block(raw_node, offset)) {
    863 			MSG(1, "\tError: While traversing direct node!!!\n");
    864 			return -1;
    865 		}
    866 
    867 		next_blkaddr = le32_to_cpu(raw_node->footer.next_blkaddr);
    868 		memset(raw_node, 0, F2FS_BLKSIZE);
    869 
    870 		DBG(1, "\tDiscard dnode, at offset 0x%08"PRIx64"\n", offset);
    871 		if (dev_write_block(raw_node, offset)) {
    872 			MSG(1, "\tError: While discarding direct node!!!\n");
    873 			return -1;
    874 		}
    875 		offset = next_blkaddr;
    876 		/* should avoid recursive chain due to stale data */
    877 		if (offset == root_inode_pos)
    878 			break;
    879 	} while (1);
    880 
    881 	return 0;
    882 }
    883 #endif
    884 
    885 static int f2fs_write_root_inode(void)
    886 {
    887 	struct f2fs_node *raw_node = NULL;
    888 	u_int64_t blk_size_bytes, data_blk_nor;
    889 	u_int64_t main_area_node_seg_blk_offset = 0;
    890 
    891 	raw_node = calloc(F2FS_BLKSIZE, 1);
    892 	if (raw_node == NULL) {
    893 		MSG(1, "\tError: Calloc Failed for raw_node!!!\n");
    894 		return -1;
    895 	}
    896 
    897 	raw_node->footer.nid = sb->root_ino;
    898 	raw_node->footer.ino = sb->root_ino;
    899 	raw_node->footer.cp_ver = cpu_to_le64(1);
    900 	raw_node->footer.next_blkaddr = cpu_to_le32(
    901 			get_sb(main_blkaddr) +
    902 			c.cur_seg[CURSEG_HOT_NODE] *
    903 			c.blks_per_seg + 1);
    904 
    905 	raw_node->i.i_mode = cpu_to_le16(0x41ed);
    906 	raw_node->i.i_links = cpu_to_le32(2);
    907 	raw_node->i.i_uid = cpu_to_le32(getuid());
    908 	raw_node->i.i_gid = cpu_to_le32(getgid());
    909 
    910 	blk_size_bytes = 1 << get_sb(log_blocksize);
    911 	raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes); /* dentry */
    912 	raw_node->i.i_blocks = cpu_to_le64(2);
    913 
    914 	raw_node->i.i_atime = cpu_to_le32(time(NULL));
    915 	raw_node->i.i_atime_nsec = 0;
    916 	raw_node->i.i_ctime = cpu_to_le32(time(NULL));
    917 	raw_node->i.i_ctime_nsec = 0;
    918 	raw_node->i.i_mtime = cpu_to_le32(time(NULL));
    919 	raw_node->i.i_mtime_nsec = 0;
    920 	raw_node->i.i_generation = 0;
    921 	raw_node->i.i_xattr_nid = 0;
    922 	raw_node->i.i_flags = 0;
    923 	raw_node->i.i_current_depth = cpu_to_le32(1);
    924 	raw_node->i.i_dir_level = DEF_DIR_LEVEL;
    925 
    926 	data_blk_nor = get_sb(main_blkaddr) +
    927 		c.cur_seg[CURSEG_HOT_DATA] * c.blks_per_seg;
    928 	raw_node->i.i_addr[0] = cpu_to_le32(data_blk_nor);
    929 
    930 	raw_node->i.i_ext.fofs = 0;
    931 	raw_node->i.i_ext.blk_addr = 0;
    932 	raw_node->i.i_ext.len = 0;
    933 
    934 	main_area_node_seg_blk_offset = get_sb(main_blkaddr);
    935 	main_area_node_seg_blk_offset += c.cur_seg[CURSEG_HOT_NODE] *
    936 					c.blks_per_seg;
    937 
    938 	DBG(1, "\tWriting root inode (hot node), %x %x %x at offset 0x%08"PRIu64"\n",
    939 			get_sb(main_blkaddr),
    940 			c.cur_seg[CURSEG_HOT_NODE],
    941 			c.blks_per_seg, main_area_node_seg_blk_offset);
    942 	if (dev_write_block(raw_node, main_area_node_seg_blk_offset)) {
    943 		MSG(1, "\tError: While writing the raw_node to disk!!!\n");
    944 		free(raw_node);
    945 		return -1;
    946 	}
    947 
    948 	/* avoid power-off-recovery based on roll-forward policy */
    949 	main_area_node_seg_blk_offset = get_sb(main_blkaddr);
    950 	main_area_node_seg_blk_offset += c.cur_seg[CURSEG_WARM_NODE] *
    951 					c.blks_per_seg;
    952 
    953 #ifndef WITH_ANDROID
    954 	if (discard_obsolete_dnode(raw_node, main_area_node_seg_blk_offset)) {
    955 		free(raw_node);
    956 		return -1;
    957 	}
    958 #endif
    959 
    960 	free(raw_node);
    961 	return 0;
    962 }
    963 
    964 static int f2fs_update_nat_root(void)
    965 {
    966 	struct f2fs_nat_block *nat_blk = NULL;
    967 	u_int64_t nat_seg_blk_offset = 0;
    968 
    969 	nat_blk = calloc(F2FS_BLKSIZE, 1);
    970 	if(nat_blk == NULL) {
    971 		MSG(1, "\tError: Calloc Failed for nat_blk!!!\n");
    972 		return -1;
    973 	}
    974 
    975 	/* update root */
    976 	nat_blk->entries[get_sb(root_ino)].block_addr = cpu_to_le32(
    977 		get_sb(main_blkaddr) +
    978 		c.cur_seg[CURSEG_HOT_NODE] * c.blks_per_seg);
    979 	nat_blk->entries[get_sb(root_ino)].ino = sb->root_ino;
    980 
    981 	/* update node nat */
    982 	nat_blk->entries[get_sb(node_ino)].block_addr = cpu_to_le32(1);
    983 	nat_blk->entries[get_sb(node_ino)].ino = sb->node_ino;
    984 
    985 	/* update meta nat */
    986 	nat_blk->entries[get_sb(meta_ino)].block_addr = cpu_to_le32(1);
    987 	nat_blk->entries[get_sb(meta_ino)].ino = sb->meta_ino;
    988 
    989 	nat_seg_blk_offset = get_sb(nat_blkaddr);
    990 
    991 	DBG(1, "\tWriting nat root, at offset 0x%08"PRIx64"\n",
    992 					nat_seg_blk_offset);
    993 	if (dev_write_block(nat_blk, nat_seg_blk_offset)) {
    994 		MSG(1, "\tError: While writing the nat_blk set0 to disk!\n");
    995 		free(nat_blk);
    996 		return -1;
    997 	}
    998 
    999 	free(nat_blk);
   1000 	return 0;
   1001 }
   1002 
   1003 static int f2fs_add_default_dentry_root(void)
   1004 {
   1005 	struct f2fs_dentry_block *dent_blk = NULL;
   1006 	u_int64_t data_blk_offset = 0;
   1007 
   1008 	dent_blk = calloc(F2FS_BLKSIZE, 1);
   1009 	if(dent_blk == NULL) {
   1010 		MSG(1, "\tError: Calloc Failed for dent_blk!!!\n");
   1011 		return -1;
   1012 	}
   1013 
   1014 	dent_blk->dentry[0].hash_code = 0;
   1015 	dent_blk->dentry[0].ino = sb->root_ino;
   1016 	dent_blk->dentry[0].name_len = cpu_to_le16(1);
   1017 	dent_blk->dentry[0].file_type = F2FS_FT_DIR;
   1018 	memcpy(dent_blk->filename[0], ".", 1);
   1019 
   1020 	dent_blk->dentry[1].hash_code = 0;
   1021 	dent_blk->dentry[1].ino = sb->root_ino;
   1022 	dent_blk->dentry[1].name_len = cpu_to_le16(2);
   1023 	dent_blk->dentry[1].file_type = F2FS_FT_DIR;
   1024 	memcpy(dent_blk->filename[1], "..", 2);
   1025 
   1026 	/* bitmap for . and .. */
   1027 	test_and_set_bit_le(0, dent_blk->dentry_bitmap);
   1028 	test_and_set_bit_le(1, dent_blk->dentry_bitmap);
   1029 	data_blk_offset = get_sb(main_blkaddr);
   1030 	data_blk_offset += c.cur_seg[CURSEG_HOT_DATA] *
   1031 				c.blks_per_seg;
   1032 
   1033 	DBG(1, "\tWriting default dentry root, at offset 0x%08"PRIx64"\n",
   1034 				data_blk_offset);
   1035 	if (dev_write_block(dent_blk, data_blk_offset)) {
   1036 		MSG(1, "\tError: While writing the dentry_blk to disk!!!\n");
   1037 		free(dent_blk);
   1038 		return -1;
   1039 	}
   1040 
   1041 	free(dent_blk);
   1042 	return 0;
   1043 }
   1044 
   1045 static int f2fs_create_root_dir(void)
   1046 {
   1047 	int err = 0;
   1048 
   1049 	err = f2fs_write_root_inode();
   1050 	if (err < 0) {
   1051 		MSG(1, "\tError: Failed to write root inode!!!\n");
   1052 		goto exit;
   1053 	}
   1054 
   1055 	err = f2fs_update_nat_root();
   1056 	if (err < 0) {
   1057 		MSG(1, "\tError: Failed to update NAT for root!!!\n");
   1058 		goto exit;
   1059 	}
   1060 
   1061 	err = f2fs_add_default_dentry_root();
   1062 	if (err < 0) {
   1063 		MSG(1, "\tError: Failed to add default dentries for root!!!\n");
   1064 		goto exit;
   1065 	}
   1066 exit:
   1067 	if (err)
   1068 		MSG(1, "\tError: Could not create the root directory!!!\n");
   1069 
   1070 	return err;
   1071 }
   1072 
   1073 int f2fs_format_device(void)
   1074 {
   1075 	int err = 0;
   1076 
   1077 	err= f2fs_prepare_super_block();
   1078 	if (err < 0) {
   1079 		MSG(0, "\tError: Failed to prepare a super block!!!\n");
   1080 		goto exit;
   1081 	}
   1082 
   1083 	if (c.trim) {
   1084 		err = f2fs_trim_devices();
   1085 		if (err < 0) {
   1086 			MSG(0, "\tError: Failed to trim whole device!!!\n");
   1087 			goto exit;
   1088 		}
   1089 	}
   1090 
   1091 	err = f2fs_init_sit_area();
   1092 	if (err < 0) {
   1093 		MSG(0, "\tError: Failed to Initialise the SIT AREA!!!\n");
   1094 		goto exit;
   1095 	}
   1096 
   1097 	err = f2fs_init_nat_area();
   1098 	if (err < 0) {
   1099 		MSG(0, "\tError: Failed to Initialise the NAT AREA!!!\n");
   1100 		goto exit;
   1101 	}
   1102 
   1103 	err = f2fs_create_root_dir();
   1104 	if (err < 0) {
   1105 		MSG(0, "\tError: Failed to create the root directory!!!\n");
   1106 		goto exit;
   1107 	}
   1108 
   1109 	err = f2fs_write_check_point_pack();
   1110 	if (err < 0) {
   1111 		MSG(0, "\tError: Failed to write the check point pack!!!\n");
   1112 		goto exit;
   1113 	}
   1114 
   1115 	err = f2fs_write_super_block();
   1116 	if (err < 0) {
   1117 		MSG(0, "\tError: Failed to write the Super Block!!!\n");
   1118 		goto exit;
   1119 	}
   1120 exit:
   1121 	if (err)
   1122 		MSG(0, "\tError: Could not format the device!!!\n");
   1123 
   1124 	return err;
   1125 }
   1126