17f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee/** 27f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * main.c 37f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * 47f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * Copyright (c) 2013 Samsung Electronics Co., Ltd. 57f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * http://www.samsung.com/ 62c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim * Copyright (c) 2015 Jaegeuk Kim <jaegeuk@kernel.org> 72c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim * : implement defrag.f2fs 8603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim * Copyright (C) 2015 Huawei Ltd. 9603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim * Hou Pengyang <houpengyang@huawei.com> 10603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim * Liu Shuoran <liushuoran@huawei.com> 11603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim * Jaegeuk Kim <jaegeuk@kernel.org> 12603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim * : add sload.f2fs 137f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * 147f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * This program is free software; you can redistribute it and/or modify 157f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * it under the terms of the GNU General Public License version 2 as 167f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee * published by the Free Software Foundation. 177f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee */ 187f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee#include "fsck.h" 197f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee#include <libgen.h> 20ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim#include <ctype.h> 217f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 226f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kimstruct f2fs_fsck gfsck; 237f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 247f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leevoid fsck_usage() 257f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee{ 267f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, "\nUsage: fsck.f2fs [options] device\n"); 277f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, "[options]:\n"); 28cfeb015e887db6edbd13ad41597d82f1e565fc33Jaegeuk Kim MSG(0, " -a check/fix potential corruption, reported by f2fs\n"); 297f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, " -d debug level [default:0]\n"); 30cfeb015e887db6edbd13ad41597d82f1e565fc33Jaegeuk Kim MSG(0, " -f check/fix entire partition\n"); 316e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong MSG(0, " -p preen mode [default:0 the same as -a [0|1]]\n"); 32f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim MSG(0, " -t show directory tree\n"); 337f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee exit(1); 347f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee} 357f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 367f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leevoid dump_usage() 377f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee{ 387f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, "\nUsage: dump.f2fs [options] device\n"); 397f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, "[options]:\n"); 407f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, " -d debug level [default:0]\n"); 417f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, " -i inode no (hex)\n"); 424f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He MSG(0, " -n [NAT dump segno from #1~#2 (decimal), for all 0~-1]\n"); 437f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, " -s [SIT dump segno from #1~#2 (decimal), for all 0~-1]\n"); 447f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee MSG(0, " -a [SSA dump segno from #1~#2 (decimal), for all 0~-1]\n"); 458843554c8c43e713e2ce4e36ac3c06f9eca94b09Changman Lee MSG(0, " -b blk_addr (in 4KB)\n"); 467f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 477f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee exit(1); 487f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee} 497f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 502c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kimvoid defrag_usage() 512c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim{ 522c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, "\nUsage: defrag.f2fs [options] device\n"); 532c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, "[options]:\n"); 542c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, " -d debug level [default:0]\n"); 552c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, " -s start block address [default: main_blkaddr]\n"); 562c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, " -l length [default:512 (2MB)]\n"); 572c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, " -t target block address [default: main_blkaddr + 2MB]\n"); 582c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, " -i set direction as shrink [default: expand]\n"); 592c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim exit(1); 602c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim} 612c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 62d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kimvoid resize_usage() 63d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim{ 64d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim MSG(0, "\nUsage: resize.f2fs [options] device\n"); 65d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim MSG(0, "[options]:\n"); 66d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim MSG(0, " -d debug level [default:0]\n"); 67d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim MSG(0, " -t target sectors [default: device size]\n"); 68d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim exit(1); 69d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim} 70d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim 71603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kimvoid sload_usage() 72603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim{ 73603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim MSG(0, "\nUsage: sload.f2fs [options] device\n"); 74603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim MSG(0, "[options]:\n"); 75603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim MSG(0, " -f source directory [path of the source directory]\n"); 76603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim MSG(0, " -t mount point [prefix of target fs path, default:/]\n"); 77603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim MSG(0, " -d debug level [default:0]\n"); 78603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim exit(1); 79603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim} 80603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim 81ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kimstatic int is_digits(char *optarg) 82ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim{ 83f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim unsigned int i; 84ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim 85ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim for (i = 0; i < strlen(optarg); i++) 86ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim if (!isdigit(optarg[i])) 87ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim break; 88ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim return i == strlen(optarg); 89ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim} 90ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim 91f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kimstatic void error_out(char *prog) 9288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim{ 93f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim if (!strcmp("fsck.f2fs", prog)) 9488753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim fsck_usage(); 95f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim else if (!strcmp("dump.f2fs", prog)) 9688753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim dump_usage(); 97f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim else if (!strcmp("defrag.f2fs", prog)) 9888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim defrag_usage(); 99f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim else if (!strcmp("resize.f2fs", prog)) 10088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim resize_usage(); 101f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim else if (!strcmp("sload.f2fs", prog)) 10288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim sload_usage(); 103f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim else 104f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim MSG(0, "\nWrong progam.\n"); 10588753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim} 10688753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim 1077f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leevoid f2fs_parse_options(int argc, char *argv[]) 1087f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee{ 1097f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee int option = 0; 1107f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee char *prog = basename(argv[0]); 11188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim int err = NOERROR; 112ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim 113ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim if (argc < 2) { 114ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim MSG(0, "\tError: Device not specified\n"); 115f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim error_out(prog); 116ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim } 1177f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 1187f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee if (!strcmp("fsck.f2fs", prog)) { 119ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim const char *option_string = ":ad:fp:t"; 1207f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 1213ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.func = FSCK; 1227f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee while ((option = getopt(argc, argv, option_string)) != EOF) { 1237f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee switch (option) { 1247eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim case 'a': 1253ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.auto_fix = 1; 1267eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim MSG(0, "Info: Fix the reported corruption.\n"); 1277eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim break; 1286e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong case 'p': 1296e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong /* preen mode has different levels: 1306e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong * 0: default level, the same as -a 1316e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong * 1: check meta 1326e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong */ 133ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim if (optarg[0] == '-') { 134ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim c.preen_mode = PREEN_MODE_0; 135ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim optind--; 136ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim break; 137ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim } else if (!is_digits(optarg)) { 13888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EWRONG_OPT; 139ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim break; 140ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim } 1413ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.preen_mode = atoi(optarg); 1423ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.preen_mode < 0) 1433ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.preen_mode = PREEN_MODE_0; 1443ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim else if (c.preen_mode >= PREEN_MODE_MAX) 1453ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.preen_mode = PREEN_MODE_MAX - 1; 1463ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.preen_mode == PREEN_MODE_0) 1473ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.auto_fix = 1; 1486e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong MSG(0, "Info: Fix the reported corruption in " 1493ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim "preen mode %d\n", c.preen_mode); 1506e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong break; 1516f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case 'd': 152ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim if (optarg[0] == '-') { 15388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = ENEED_ARG; 154ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim break; 155ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim } else if (!is_digits(optarg)) { 15688753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EWRONG_OPT; 157ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim break; 158ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim } 1593ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv = atoi(optarg); 160ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim MSG(0, "Info: Debug level = %d\n", c.dbg_lv); 1616f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 1626f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case 'f': 1633ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.fix_on = 1; 1646f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim MSG(0, "Info: Force to fix corruption\n"); 1656f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 1667eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim case 't': 167f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim c.show_dentry = 1; 1687eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim break; 16988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim 17088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim 171ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim case ':': 17288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (optopt == 'p') { 17388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim MSG(0, "Info: Use default preen mode\n"); 17488753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim c.preen_mode = PREEN_MODE_0; 17588753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim c.auto_fix = 1; 17688753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } else { 17788753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim option = optopt; 17888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = ENEED_ARG; 17988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 18088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } 181ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim break; 182ed031d6b24edf78908a9ccd42f45cc33ec935028Jaegeuk Kim case '?': 18388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim option = optopt; 1846f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim default: 18588753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EUNKNOWN_OPT; 1866f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 1877f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee } 18888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (err != NOERROR) 18988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 1907f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee } 1917f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee } else if (!strcmp("dump.f2fs", prog)) { 1924f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He const char *option_string = "d:i:n:s:a:b:"; 1937f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee static struct dump_option dump_opt = { 1944f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He .nid = 0, /* default root ino */ 1954f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He .start_nat = -1, 1964f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He .end_nat = -1, 1977f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee .start_sit = -1, 1987f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee .end_sit = -1, 1997f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee .start_ssa = -1, 2007f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee .end_ssa = -1, 2018843554c8c43e713e2ce4e36ac3c06f9eca94b09Changman Lee .blk_addr = -1, 2027f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee }; 2037f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 2043ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.func = DUMP; 2057f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee while ((option = getopt(argc, argv, option_string)) != EOF) { 2066f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim int ret = 0; 2076f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim 2087f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee switch (option) { 2096f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case 'd': 21088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (!is_digits(optarg)) { 21188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EWRONG_OPT; 21288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 21388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } 2143ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv = atoi(optarg); 2156f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim MSG(0, "Info: Debug level = %d\n", 2163ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv); 2176f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 2186f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case 'i': 2196f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim if (strncmp(optarg, "0x", 2)) 2206f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ret = sscanf(optarg, "%d", 2216f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.nid); 2226f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim else 2236f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ret = sscanf(optarg, "%x", 2246f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.nid); 2256f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 2264f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He case 'n': 2274f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He ret = sscanf(optarg, "%d~%d", 2284f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He &dump_opt.start_nat, 2294f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He &dump_opt.end_nat); 2304f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He break; 2316f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case 's': 2326f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ret = sscanf(optarg, "%d~%d", 2336f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.start_sit, 2346f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.end_sit); 2356f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 2366f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case 'a': 2376f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ret = sscanf(optarg, "%d~%d", 2386f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.start_ssa, 2396f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.end_ssa); 2406f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 2416f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case 'b': 2426f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim if (strncmp(optarg, "0x", 2)) 2436f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ret = sscanf(optarg, "%d", 2446f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.blk_addr); 2456f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim else 2466f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ret = sscanf(optarg, "%x", 2476f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim &dump_opt.blk_addr); 2486f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 2496f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim default: 25088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EUNKNOWN_OPT; 2516f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 2527f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee } 2536f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ASSERT(ret >= 0); 25488753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (err != NOERROR) 25588753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 2567f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee } 2577f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 2583ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.private = &dump_opt; 2592c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim } else if (!strcmp("defrag.f2fs", prog)) { 2602c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim const char *option_string = "d:s:l:t:i"; 2612c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 2623ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.func = DEFRAG; 2632c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim while ((option = getopt(argc, argv, option_string)) != EOF) { 2642c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim int ret = 0; 2652c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 2662c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim switch (option) { 2672c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim case 'd': 26888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (!is_digits(optarg)) { 26988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EWRONG_OPT; 27088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 27188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } 2723ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv = atoi(optarg); 2732c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, "Info: Debug level = %d\n", 2743ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv); 2752c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim break; 2762c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim case 's': 2772c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim if (strncmp(optarg, "0x", 2)) 2782c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ret = sscanf(optarg, "%"PRIu64"", 2793ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.defrag_start); 2802c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim else 2812c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ret = sscanf(optarg, "%"PRIx64"", 2823ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.defrag_start); 2832c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim break; 2842c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim case 'l': 2852c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim if (strncmp(optarg, "0x", 2)) 2862c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ret = sscanf(optarg, "%"PRIu64"", 2873ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.defrag_len); 2882c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim else 2892c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ret = sscanf(optarg, "%"PRIx64"", 2903ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.defrag_len); 2912c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim break; 2922c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim case 't': 2932c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim if (strncmp(optarg, "0x", 2)) 2942c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ret = sscanf(optarg, "%"PRIu64"", 2953ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.defrag_target); 2962c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim else 2972c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ret = sscanf(optarg, "%"PRIx64"", 2983ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.defrag_target); 2992c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim break; 3002c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim case 'i': 3013ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_shrink = 1; 3022c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim break; 3032c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim default: 30488753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EUNKNOWN_OPT; 3052c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim break; 3062c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim } 3072c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ASSERT(ret >= 0); 30888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (err != NOERROR) 30988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 3102c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim } 311d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim } else if (!strcmp("resize.f2fs", prog)) { 312d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim const char *option_string = "d:t:"; 313d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim 3143ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.func = RESIZE; 315d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim while ((option = getopt(argc, argv, option_string)) != EOF) { 316d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim int ret = 0; 317d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim 318d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim switch (option) { 319d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim case 'd': 32088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (!is_digits(optarg)) { 32188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EWRONG_OPT; 32288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 32388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } 3243ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv = atoi(optarg); 325d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim MSG(0, "Info: Debug level = %d\n", 3263ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv); 327d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim break; 328d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim case 't': 329d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim if (strncmp(optarg, "0x", 2)) 330d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim ret = sscanf(optarg, "%"PRIu64"", 3313ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.target_sectors); 332d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim else 333d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim ret = sscanf(optarg, "%"PRIx64"", 3343ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim &c.target_sectors); 335d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim break; 336d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim default: 33788753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EUNKNOWN_OPT; 338d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim break; 339d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim } 340d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim ASSERT(ret >= 0); 34188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (err != NOERROR) 34288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 343d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim } 344603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim } else if (!strcmp("sload.f2fs", prog)) { 345603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim const char *option_string = "d:f:t:"; 346603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim 3473ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.func = SLOAD; 348603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim while ((option = getopt(argc, argv, option_string)) != EOF) { 349603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim switch (option) { 350603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim case 'd': 35188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (!is_digits(optarg)) { 35288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EWRONG_OPT; 35388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 35488753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } 3553ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv = atoi(optarg); 356603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim MSG(0, "Info: Debug level = %d\n", 3573ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.dbg_lv); 358603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim break; 359603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim case 'f': 3603ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.from_dir = (char *)optarg; 361603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim break; 362603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim case 't': 3633ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.mount_point = (char *)optarg; 364603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim break; 365603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim default: 36688753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EUNKNOWN_OPT; 367603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim break; 368603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim } 36988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (err != NOERROR) 37088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 371603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim } 3727f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee } 373f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim 374f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim if (optind >= argc) { 375f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim MSG(0, "\tError: Device not specified\n"); 376f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim error_out(prog); 377f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim } 378f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim 379f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim c.devices[0].path = strdup(argv[optind]); 380f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim if (argc > (optind + 1)) { 38188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim c.dbg_lv = 0; 38288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim err = EUNKNOWN_ARG; 38388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } 38488753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim if (err == NOERROR) 38588753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim return; 38688753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim 38788753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim /* print out error */ 38888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim switch (err) { 38988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim case EWRONG_OPT: 39088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim MSG(0, "\tError: Wrong option -%c %s\n", option, optarg); 39188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 39288753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim case ENEED_ARG: 39388753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim MSG(0, "\tError: Need argument for -%c\n", option); 39488753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 39588753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim case EUNKNOWN_OPT: 39688753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim MSG(0, "\tError: Unknown option %c\n", option); 39788753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 39888753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim case EUNKNOWN_ARG: 39988753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim MSG(0, "\tError: Unknown argument %s\n", argv[optind]); 40088753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim break; 40188753dbcf385c8f3c0a4a1c43159bfb2e5144b18Jaegeuk Kim } 402f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim error_out(prog); 4037f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee} 4047f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 4055cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kimstatic void do_fsck(struct f2fs_sb_info *sbi) 4067f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee{ 4077ba9eec293b70f7e7204512a59e58205bbb1ceccJaegeuk Kim struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); 4087ba9eec293b70f7e7204512a59e58205bbb1ceccJaegeuk Kim u32 flag = le32_to_cpu(ckpt->ckpt_flags); 4097f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee u32 blk_cnt; 4107f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 4115cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim fsck_init(sbi); 4127f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 4137ba9eec293b70f7e7204512a59e58205bbb1ceccJaegeuk Kim print_cp_state(flag); 4147ba9eec293b70f7e7204512a59e58205bbb1ceccJaegeuk Kim 4153ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.fix_on && !c.bug_on) { 4163ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim switch (c.preen_mode) { 4176e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong case PREEN_MODE_1: 4186e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong if (fsck_chk_meta(sbi)) { 4196e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong MSG(0, "[FSCK] F2FS metadata [Fail]"); 4206e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong MSG(0, "\tError: meta does not match, " 4216e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong "force check all\n"); 4226e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong } else { 4236e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong MSG(0, "[FSCK] F2FS metadata [Ok..]"); 4246e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong fsck_free(sbi); 4256e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong return; 4266e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong } 4276e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong 4283ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.ro) 4293ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.fix_on = 1; 4306e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong break; 4316e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong } 432bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong } else { 433bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong /* 434bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * we can hit this in 3 situations: 435bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * 1. fsck -f, fix_on has already been set to 1 when 436bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * parsing options; 437bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * 2. fsck -a && CP_FSCK_FLAG is set, fix_on has already 438bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * been set to 1 when checking CP_FSCK_FLAG; 439bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * 3. fsck -p 1 && error is detected, then bug_on is set, 440bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * we set fix_on = 1 here, so that fsck can fix errors 441bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong * automatically 442bea9d60888e01552e3c3357b0338ca0836b018cdSheng Yong */ 4433ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.fix_on = 1; 4446e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong } 4456e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong 4467f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee fsck_chk_orphan_node(sbi); 4477f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 4486f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim /* Traverse all block recursively from root inode */ 4497f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee blk_cnt = 1; 450f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim fsck_chk_node_blk(sbi, NULL, sbi->root_ino_num, 4512a802319c3c45a527dc706173e9831ace5410ee7Chao Yu F2FS_FT_DIR, TYPE_INODE, &blk_cnt, NULL); 4525cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim fsck_verify(sbi); 4537f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee fsck_free(sbi); 4547f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee} 4557f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 4565cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kimstatic void do_dump(struct f2fs_sb_info *sbi) 4577f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee{ 4583ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim struct dump_option *opt = (struct dump_option *)c.private; 459b57708aecf07a7caa8fcce02f65735a11e987154Jaegeuk Kim struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); 460b57708aecf07a7caa8fcce02f65735a11e987154Jaegeuk Kim u32 flag = le32_to_cpu(ckpt->ckpt_flags); 4618843554c8c43e713e2ce4e36ac3c06f9eca94b09Changman Lee 4624f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He if (opt->end_nat == -1) 4634f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He opt->end_nat = NM_I(sbi)->max_nid; 4647f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee if (opt->end_sit == -1) 4657f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee opt->end_sit = SM_I(sbi)->main_segments; 4667f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee if (opt->end_ssa == -1) 4677f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee opt->end_ssa = SM_I(sbi)->main_segments; 4684f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He if (opt->start_nat != -1) 469bdc1a0ac8bd99298f56c5506c244148db7b64876Jaegeuk Kim nat_dump(sbi); 4707f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee if (opt->start_sit != -1) 4717f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee sit_dump(sbi, opt->start_sit, opt->end_sit); 4727f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee if (opt->start_ssa != -1) 4737f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee ssa_dump(sbi, opt->start_ssa, opt->end_ssa); 4744f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He if (opt->blk_addr != -1) 4759c6617d06dbdf8266838569b8169b0f9471704f4Jaegeuk Kim dump_info_from_blkaddr(sbi, opt->blk_addr); 4764f105bbaba07a90f2bed1e87dbe961c4252366e4Yunlei He if (opt->nid) 477390fe587b1b843270bbf7f1e35ac08c8a48d03a1Jaegeuk Kim dump_node(sbi, opt->nid, 0); 478b57708aecf07a7caa8fcce02f65735a11e987154Jaegeuk Kim 4797ba9eec293b70f7e7204512a59e58205bbb1ceccJaegeuk Kim print_cp_state(flag); 480b57708aecf07a7caa8fcce02f65735a11e987154Jaegeuk Kim 4817f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee} 4827f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 4832c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kimstatic int do_defrag(struct f2fs_sb_info *sbi) 4842c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim{ 4852c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi); 4862c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 4873ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_start > get_sb(block_count)) 4882c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim goto out_range; 4893ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_start < SM_I(sbi)->main_blkaddr) 4903ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_start = SM_I(sbi)->main_blkaddr; 4912c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 4923ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_len == 0) 4933ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_len = sbi->blocks_per_seg; 4942c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 4953ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_start + c.defrag_len > get_sb(block_count)) 4963ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_len = get_sb(block_count) - c.defrag_start; 4972c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 4983ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_target == 0) { 4993ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target = c.defrag_start - 1; 5003ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.defrag_shrink) 5013ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target += c.defrag_len + 1; 5022c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim } 5032c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 5043ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_target < SM_I(sbi)->main_blkaddr || 5053ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target > get_sb(block_count)) 5062c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim goto out_range; 5073ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_target >= c.defrag_start && 5083ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target < c.defrag_start + c.defrag_len) 5092c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim goto out_range; 5102c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 5113ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.defrag_start > c.defrag_target) 5122c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, "Info: Move 0x%"PRIx64" <- [0x%"PRIx64"-0x%"PRIx64"]\n", 5133ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target, 5143ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_start, 5153ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_start + c.defrag_len - 1); 5162c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim else 5172c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim MSG(0, "Info: Move [0x%"PRIx64"-0x%"PRIx64"] -> 0x%"PRIx64"\n", 5183ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_start, 5193ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_start + c.defrag_len - 1, 5203ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target); 5212c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 5223ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim return f2fs_defragment(sbi, c.defrag_start, c.defrag_len, 5233ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target, c.defrag_shrink); 5242c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kimout_range: 5252c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim ASSERT_MSG("Out-of-range [0x%"PRIx64" ~ 0x%"PRIx64"] to 0x%"PRIx64"", 5263ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_start, 5273ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_start + c.defrag_len - 1, 5283ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.defrag_target); 5292c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim return -1; 5302c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim} 5312c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 532d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kimstatic int do_resize(struct f2fs_sb_info *sbi) 533d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim{ 534d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi); 535d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim 5363ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.target_sectors) 5373ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.target_sectors = c.total_sectors; 538d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim 5393ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.target_sectors > c.total_sectors) { 540d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim ASSERT_MSG("Out-of-range Target=0x%"PRIx64" / 0x%"PRIx64"", 5413ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.target_sectors, c.total_sectors); 542d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim return -1; 543d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim } 544d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim 545f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim /* may different sector size */ 546f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim if ((c.target_sectors * c.sector_size >> 547f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim get_sb(log_blocksize)) <= get_sb(block_count)) { 5485e056bef1798844e640e3ae118c06949c70dd8e6Yunlei He ASSERT_MSG("Nothing to resize, now only support resize to expand\n"); 549d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim return -1; 550d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim } 551d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim return f2fs_resize(sbi); 552d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim} 553d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim 554603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kimstatic int do_sload(struct f2fs_sb_info *sbi) 555603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim{ 5563ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.from_dir) { 557603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim MSG(0, "\tError: Need source directory\n"); 558603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim sload_usage(); 559603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim return -1; 560603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim } 5613ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.mount_point) 5623ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.mount_point = "/"; 563603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim 5643ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim return f2fs_sload(sbi, c.from_dir, c.mount_point, NULL, NULL); 565603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim} 566603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim 5675cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kimint main(int argc, char **argv) 5687f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee{ 5696f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim struct f2fs_sb_info *sbi; 5707f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee int ret = 0; 5717f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 5723ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim f2fs_init_configuration(); 5737f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 5747f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee f2fs_parse_options(argc, argv); 5757f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 576de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim if (f2fs_devs_are_umounted() < 0) { 577f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim if (errno == EBUSY) 578f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim return -1; 5793ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.ro || c.func == DEFRAG) { 58067de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim MSG(0, "\tError: Not available on mounted device!\n"); 58167de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim return -1; 58267de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim } 58367de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim 58467de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim /* allow ro-mounted partition */ 58567de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim MSG(0, "Info: Check FS only due to RO\n"); 5863ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.fix_on = 0; 5873ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.auto_fix = 0; 58867de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim } 5897f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 5907f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee /* Get device */ 5913ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (f2fs_get_device_info() < 0) 5927f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee return -1; 5936f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kimfsck_again: 5946f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim memset(&gfsck, 0, sizeof(gfsck)); 5956f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim gfsck.sbi.fsck = &gfsck; 5966f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim sbi = &gfsck.sbi; 5977f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 5987eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim ret = f2fs_do_mount(sbi); 599bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim if (ret != 0) { 600bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim if (ret == 1) { 601bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim MSG(0, "Info: No error was reported\n"); 602bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim ret = 0; 603bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim } 6042c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim goto out_err; 605bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim } 6067f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 6073ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim switch (c.func) { 6086f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case FSCK: 6095cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim do_fsck(sbi); 6106f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 6116f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim case DUMP: 6125cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim do_dump(sbi); 6136f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim break; 614c499346871b95583d36d164f0689a43f88245965Jaegeuk Kim#ifndef WITH_ANDROID 6152c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim case DEFRAG: 616bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim ret = do_defrag(sbi); 617bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim if (ret) 6182c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim goto out_err; 6192c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim break; 620d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim case RESIZE: 621d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim if (do_resize(sbi)) 622d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim goto out_err; 623d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim break; 624603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim case SLOAD: 625603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim do_sload(sbi); 626603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim break; 627c499346871b95583d36d164f0689a43f88245965Jaegeuk Kim#endif 6287f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee } 6297f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 6308843554c8c43e713e2ce4e36ac3c06f9eca94b09Changman Lee f2fs_do_umount(sbi); 6312c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 6323ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.func == FSCK && c.bug_on) { 6333ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (!c.ro && c.fix_on == 0 && c.auto_fix == 0) { 6346f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim char ans[255] = {0}; 6356f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kimretry: 6366f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim printf("Do you want to fix this partition? [Y/N] "); 6376f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ret = scanf("%s", ans); 6386f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim ASSERT(ret >= 0); 6396f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim if (!strcasecmp(ans, "y")) 6403ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.fix_on = 1; 6416f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim else if (!strcasecmp(ans, "n")) 6423ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.fix_on = 0; 6436f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim else 6446f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim goto retry; 645cfeb015e887db6edbd13ad41597d82f1e565fc33Jaegeuk Kim 6463ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.fix_on) 647cfeb015e887db6edbd13ad41597d82f1e565fc33Jaegeuk Kim goto fsck_again; 6486f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim } 6496f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim } 6503ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim f2fs_finalize_device(); 6510575dd1c56ef731662687fa5b7817335b14c69eeJaegeuk Kim 6527f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee printf("\nDone.\n"); 6535cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim return 0; 6542c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 6552c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kimout_err: 6562c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim if (sbi->ckpt) 6572c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim free(sbi->ckpt); 6582c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim if (sbi->raw_super) 6592c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim free(sbi->raw_super); 660bbc4176aa7fbf5889156cf4117213c680fade87aJaegeuk Kim return ret; 6617f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee} 662