1af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall/** 2af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall * f2fs_format.c 3af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall * 4af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall * http://www.samsung.com/ 6af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall * 70fbdf6cbd4dfc633454eba2f841c123789e297adJaegeuk Kim * Dual licensed under the GPL or LGPL version 2 licenses. 8af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall */ 9af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#define _LARGEFILE64_SOURCE 10af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 11af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <stdio.h> 12af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <stdlib.h> 13af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <fcntl.h> 14af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <string.h> 15af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <unistd.h> 16af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <sys/stat.h> 17af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <sys/mount.h> 18af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <time.h> 193c85e737308ef95629b232745d6a8d141d87cc9aJP Abgrall//#include <linux/fs.h> 20af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include <uuid/uuid.h> 21af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 22af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include "f2fs_fs.h" 23af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall#include "f2fs_format_utils.h" 24af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 25af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrallextern struct f2fs_configuration config; 26af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 27af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrallstatic void mkfs_usage() 28af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall{ 2994f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall MSG(0, "\nUsage: mkfs.f2fs [options] device [sectors]\n"); 30af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "[options]:\n"); 31af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -a heap-based allocation [default:1]\n"); 32af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -d debug level [default:0]\n"); 33af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -e [extension list] e.g. \"mp3,gif,mov\"\n"); 34af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -l label\n"); 35af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -o overprovision ratio [default:5]\n"); 36af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -s # of segments per section [default:1]\n"); 37af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -z # of sections per zone [default:1]\n"); 38af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, " -t 0: nodiscard, 1: discard [default:1]\n"); 3994f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall MSG(0, "sectors: number of sectors. [default: determined by device size]\n"); 40af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall exit(1); 41af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall} 42af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 43af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrallstatic void f2fs_parse_options(int argc, char *argv[]) 44af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall{ 45af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall static const char *option_string = "a:d:e:l:o:s:z:t:"; 46af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall int32_t option=0; 47af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 48af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall while ((option = getopt(argc,argv,option_string)) != EOF) { 49af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall switch (option) { 50af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 'a': 51af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.heap = atoi(optarg); 52af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall if (config.heap == 0) 53af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Disable heap-based policy\n"); 54af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 55af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 'd': 56af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.dbg_lv = atoi(optarg); 57af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Debug level = %d\n", config.dbg_lv); 58af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 59af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 'e': 60af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.extension_list = strdup(optarg); 61af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Add new extension list\n"); 62af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 63af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 'l': /*v: volume label */ 64af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall if (strlen(optarg) > 512) { 65af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Error: Volume Label should be less than\ 66af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 512 characters\n"); 67af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall mkfs_usage(); 68af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall } 69af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.vol_label = optarg; 70af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Label = %s\n", config.vol_label); 71af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 72af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 'o': 73af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.overprovision = atoi(optarg); 74af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Overprovision ratio = %u%%\n", 75af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall atoi(optarg)); 76af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 77af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 's': 78af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.segs_per_sec = atoi(optarg); 79af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Segments per section = %d\n", 80af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall atoi(optarg)); 81af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 82af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 'z': 83af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.secs_per_zone = atoi(optarg); 84af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Sections per zone = %d\n", atoi(optarg)); 85af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 86af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall case 't': 87af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.trim = atoi(optarg); 88af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: Trim is %s\n", config.trim ? "enabled": "disabled"); 89af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 90af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall default: 91af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "\tError: Unknown option %c\n",option); 92af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall mkfs_usage(); 93af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall break; 94af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall } 95af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall } 96af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 9794f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall if (optind >= argc) { 98af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "\tError: Device not specified\n"); 99af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall mkfs_usage(); 100af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall } 10194f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall config.device_name = argv[optind]; 10294f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall 10394f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall if ((optind + 1) < argc) { 10494f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall /* We have a sector count. */ 10594f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall config.total_sectors = atoll(argv[optind+1]); 1060b72253b7e46d3c0d98769a0afcbf71efc0153ecJaegeuk Kim MSG(0, "\ttotal_sectors=%08"PRIx64" (%s bytes)\n", 1070b72253b7e46d3c0d98769a0afcbf71efc0153ecJaegeuk Kim config.total_sectors, argv[optind+1]); 10894f92855ceae3de54cbbfef146b14fdedac49654JP Abgrall } 109af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 110af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall config.reserved_segments = 111af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall (2 * (100 / config.overprovision + 1) + 6) 112af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall * config.segs_per_sec; 113af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall} 114af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 115af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrallint main(int argc, char *argv[]) 116af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall{ 117af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "\n\tF2FS-tools: mkfs.f2fs Ver: %s (%s)\n\n", 118af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall F2FS_TOOLS_VERSION, 119af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall F2FS_TOOLS_DATE); 120af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall f2fs_init_configuration(&config); 121af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 122af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall f2fs_parse_options(argc, argv); 123af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 124af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall if (f2fs_dev_is_umounted(&config) < 0) 125af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall return -1; 126af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 127af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall if (f2fs_get_device_info(&config) < 0) 128af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall return -1; 129af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 130af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall if (f2fs_format_device() < 0) 131af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall return -1; 132af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 133c5786963aef93bb7747cb04454e1041738b3255fJaegeuk Kim f2fs_finalize_device(&config); 134c5786963aef93bb7747cb04454e1041738b3255fJaegeuk Kim 135af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall MSG(0, "Info: format successful\n"); 136af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall 137af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall return 0; 138af3c6803bd3db784531ff5675c539eef4bae1a15JP Abgrall} 139