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