f2fstat.c revision c15df2285d1e6b7cee8bd9fd23007ab23db16d82
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include <stdio.h>
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include <unistd.h>
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include <stdlib.h>
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include <string.h>
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include <fcntl.h>
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include <libgen.h>
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#ifdef DEBUG
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#define dbg(fmt, args...)	printf(fmt, __VA_ARGS__);
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#else
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#define dbg(fmt, args...)
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#endif
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * f2fs status
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
17a5902524d4403885eb4c50360bf3465c6be796efJoe Onorato#define F2FS_STATUS	"/sys/kernel/debug/f2fs/status"
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
198f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn#define KEY_NODE	0x00000001
20629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy#define KEY_META	0x00000010
21629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy
2231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long util;
2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long used_node_blks;
2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long used_data_blks;
255c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy//unsigned long inline_inode;
2631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratounsigned long free_segs;
2831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long valid_segs;
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long dirty_segs;
30f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Projectunsigned long prefree_segs;
315c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy
32080d9b614e609826dce2606f9e474af674ead933Joe Onoratounsigned long gc, bg_gc;
33080d9b614e609826dce2606f9e474af674ead933Joe Onoratounsigned long cp;
3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long gc_data_blks;
3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long gc_node_blks;
3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project//unsigned long extent_hit_ratio;
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long dirty_node, node_kb;
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long dirty_dents;
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long dirty_meta, meta_kb;
42f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Projectunsigned long nat_caches;
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long dirty_sit;
4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long free_nids;
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long ssr_blks;
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long lfs_blks;
4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectunsigned long memory_kb;
5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5185a02a8d13eced310aee4c2a795e9c9c5435038fJoe Onoratostruct options {
52e47f55c30b9c24f01f2be861247c92f17fbe4a61Romain Guy	int delay;
533a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato	int interval;
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	char partname[32];
5570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey};
5631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectstruct mm_table {
5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const char *name;
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	unsigned long *val;
6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	int flag;
618f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn};
628f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn
6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectstatic int compare_mm_table(const void *a, const void *b)
6431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
6531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	dbg("[COMPARE] %s, %s\n", ((struct mm_table *)a)->name, ((struct mm_table *)b)->name);
6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	return strcmp(((struct mm_table *)a)->name, ((struct mm_table *)b)->name);
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectstatic inline void remove_newline(char **head)
7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectagain:
7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	if (**head == '\n') {
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		*head = *head + 1;
7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		goto again;
7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	}
7670864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey}
7770864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey
7870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkeyvoid f2fstat(struct options *opt)
7970864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey{
8070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey	int fd;
8131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	int ret;
8231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	char keyname[32];
8331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	char buf[4096];
84f8bbd34d7d4705b49db202be92b920196bc7ea38Mike Cleron	struct mm_table key = { keyname, NULL };
8531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	struct mm_table *found;
8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	int f2fstat_table_cnt;
8731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	char *head, *tail;
8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	int found_cnt = 0;
8931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
9031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	static struct mm_table f2fstat_table[] = {
9131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		{ "  - Data",		&used_data_blks,	0 },
9231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		{ "  - Dirty",		&dirty_segs,		0 },
930589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato		{ "  - Free",		&free_segs,		0 },
9400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato		{ "  - NATs",		&nat_caches,		0 },
9570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey		{ "  - Node",		&used_node_blks,	0 },
9670864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey		{ "  - Prefree",	&prefree_segs,		0 },
9770864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey		{ "  - SITs",		&dirty_sit,		0 },
9870864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey		{ "  - Valid",		&valid_segs,		0 },
9970864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey		{ "  - dents",		&dirty_dents,		0 },
10070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey		{ "  - free_nids",	&free_nids,		0 },
10131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		{ "  - meta",		&dirty_meta,		KEY_META },
10270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey		{ "  - nodes",		&dirty_node,		KEY_NODE },
10331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		{ "CP calls",		&cp,			0 },
104a9c28f6f97a4b34d9527c786e3aa8f02d92d9e07Joe Onorato		{ "GC calls",		&gc,			0 },
10531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		{ "LFS",		&lfs_blks,		0 },
10631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		{ "Memory",		&memory_kb,		0 },
107a206daaed1318005d1534cca2e4eeec56144d104Romain Guy		{ "SSR",		&ssr_blks,		0 },
10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		{ "Utilization",	&util,			0 },
1098a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy	};
1108a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy
1118a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy	f2fstat_table_cnt = sizeof(f2fstat_table)/sizeof(struct mm_table);
11231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	fd = open(F2FS_STATUS, O_RDONLY);
11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	if (fd < 0) {
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		perror("open " F2FS_STATUS);
11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		exit(EXIT_FAILURE);
11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	}
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	ret = read(fd, buf, 4096);
12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	if (ret < 0) {
12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		perror("read " F2FS_STATUS);
12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		exit(EXIT_FAILURE);
12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	}
12431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	buf[ret] = '\0';
12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
12631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	head = buf;
12731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	if (opt->partname[0] != '\0') {
12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		head = strstr(buf, opt->partname);
13031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		if (head == NULL)
13131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			exit(EXIT_FAILURE);
1328f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn	}
1338f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn
13431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	for (;;) {
13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		remove_newline(&head);
13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		tail = strchr(head, ':');
13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		if (!tail)
1380d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato			break;
13931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		*tail = '\0';
14031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		if (strlen(head) >= sizeof(keyname)) {
14131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			dbg("[OVER] %s\n", head);
14231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			*tail = ':';
14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			tail = strchr(head, '\n');
14431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			head = tail + 1;
14531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			continue;
1460589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato		}
1470589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
14831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		strcpy(keyname, head);
14931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1500589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato		found = bsearch(&key, f2fstat_table, f2fstat_table_cnt, sizeof(struct mm_table), compare_mm_table);
1510589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato		dbg("[RESULT] %s (%s)\n", head, (found) ? "O" : "X");
15231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		head = tail + 1;
153a206daaed1318005d1534cca2e4eeec56144d104Romain Guy		if (!found)
154a206daaed1318005d1534cca2e4eeec56144d104Romain Guy			goto nextline;
155a206daaed1318005d1534cca2e4eeec56144d104Romain Guy
15631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		*(found->val) = strtoul(head, &tail, 10);
15731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		if (found->flag) {
15831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			int npages;
15931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			tail = strstr(head, "in");
16031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			head = tail + 2;
16131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			npages = strtoul(head, &tail, 10);
16231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			switch (found->flag & (KEY_NODE | KEY_META)) {
16331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			case KEY_NODE:
16431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project				node_kb = npages * 4;
16531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project				break;
16631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			case KEY_META:
16731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project				meta_kb = npages * 4;
16831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project				break;
16931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			}
17031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		}
17131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		if (++found_cnt == f2fstat_table_cnt)
17231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			break;
17331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectnextline:
17431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		tail = strchr(head, '\n');
17531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		if (!tail)
17631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			break;
17731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		head =  tail + 1;
17831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	}
17931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
18031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	close(fd);
18131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
18231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
18331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectvoid usage(void)
18431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
18531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	printf("Usage: f2fstat [option]\n"
18631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			"    -d    delay (secs)\n"
18731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			"    -i    interval of head info\n"
18831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			"    -p    partition name (e.g. /dev/sda3)\n");
18931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	exit(EXIT_FAILURE);
19031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
19131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
19231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectvoid parse_option(int argc, char *argv[], struct options *opt)
19331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
19431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	char option;
19531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const char *option_string = "d:i:p:h";
19631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
19731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	while ((option = getopt(argc, argv, option_string)) != EOF) {
19831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		switch (option) {
19931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		case 'd':
20031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			opt->delay = atoi(optarg);
20131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			break;
20231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		case 'i':
20331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			opt->interval = atoi(optarg);
20431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			break;
20531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		case 'p':
20631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			strcpy(opt->partname, basename(optarg));
20731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			break;
20831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		default:
20931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			usage();
21031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			break;
21131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		}
21231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	}
21331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
21431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
21531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectvoid print_head(void)
21631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
21731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	fprintf(stderr, "---utilization--- -----------main area-------- ---------balancing async------- ---gc--- ---alloc--- -----memory-----\n");
21831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	fprintf(stderr, "util  node   data   free  valid  dirty prefree node  dent meta  sit   nat fnid  cp   gc    ssr    lfs  total  node  meta\n");
21931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
22031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
22131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectint main(int argc, char *argv[])
22231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
22331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	char format[] = "%3ld %6ld %6ld %6ld %6ld %6ld %6ld %5ld %5ld %3ld %5ld %5ld %3ld %3ld %3ld %6ld %6ld %6ld %6ld %6ld\n";
22431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	int head_interval;
22531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	struct options opt = {
22631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		.delay = 1,
22731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		.interval = 20,
22831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		.partname = { 0, },
22931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	};
23031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
23131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	parse_option(argc, argv, &opt);
23231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	head_interval = opt.interval;
23331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
23431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	print_head();
23531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	while (1) {
23631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		if (head_interval-- == 0) {
23731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			print_head();
23831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			head_interval = opt.interval;
23931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		}
24031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
24131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		f2fstat(&opt);
24231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
24331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		fprintf(stderr, format, util, used_node_blks, used_data_blks,
24431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			free_segs, valid_segs, dirty_segs, prefree_segs,
24531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			dirty_node, dirty_dents, dirty_meta, dirty_sit, nat_caches, free_nids,
24631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			cp, gc, ssr_blks, lfs_blks, memory_kb, node_kb, meta_kb);
24731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
24831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		sleep(opt.delay);
24931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	}
25031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
25131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	return 0;
25231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
253c45b16862918a0c6c253bba12032165b030565afJoe Onorato