xref: /dragonfly/sbin/hammer/cmd_info.c (revision 41ae0862)
1b66b9421SAntonio Huete /*
2b66b9421SAntonio Huete  * Copyright (c) 2009 The DragonFly Project.  All rights reserved.
3b66b9421SAntonio Huete  *
4eac446c5SMatthew Dillon  * This code is derived from software contributed to The DragonFly Project
5eac446c5SMatthew Dillon  * by Antonio Huete <tuxillo@quantumachine.net>
6eac446c5SMatthew Dillon  *
7b66b9421SAntonio Huete  * Redistribution and use in source and binary forms, with or without
8b66b9421SAntonio Huete  * modification, are permitted provided that the following conditions
9b66b9421SAntonio Huete  * are met:
10b66b9421SAntonio Huete  *
11b66b9421SAntonio Huete  * 1. Redistributions of source code must retain the above copyright
12b66b9421SAntonio Huete  *    notice, this list of conditions and the following disclaimer.
13b66b9421SAntonio Huete  * 2. Redistributions in binary form must reproduce the above copyright
14b66b9421SAntonio Huete  *    notice, this list of conditions and the following disclaimer in
15b66b9421SAntonio Huete  *    the documentation and/or other materials provided with the
16b66b9421SAntonio Huete  *    distribution.
17b66b9421SAntonio Huete  * 3. Neither the name of The DragonFly Project nor the names of its
18b66b9421SAntonio Huete  *    contributors may be used to endorse or promote products derived
19b66b9421SAntonio Huete  *    from this software without specific, prior written permission.
20b66b9421SAntonio Huete  *
21b66b9421SAntonio Huete  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22b66b9421SAntonio Huete  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23b66b9421SAntonio Huete  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24b66b9421SAntonio Huete  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25b66b9421SAntonio Huete  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26b66b9421SAntonio Huete  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27b66b9421SAntonio Huete  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28b66b9421SAntonio Huete  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29b66b9421SAntonio Huete  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30b66b9421SAntonio Huete  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31b66b9421SAntonio Huete  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32b66b9421SAntonio Huete  * SUCH DAMAGE.
33b66b9421SAntonio Huete  *
34b66b9421SAntonio Huete  */
3514df6a3dSTomohiro Kusumi 
36*41ae0862STomohiro Kusumi #include "hammer.h"
37*41ae0862STomohiro Kusumi 
38b66b9421SAntonio Huete #include <libutil.h>
39ea458aa6STomohiro Kusumi #include <libhammer.h>
40b66b9421SAntonio Huete 
41b66b9421SAntonio Huete void show_info(char *path);
424f09feabSAntonio Huete Jimenez static double percent(int64_t value, int64_t total);
43b66b9421SAntonio Huete 
44b66b9421SAntonio Huete void
hammer_cmd_info(char ** av,int ac)4561630cfcSAntonio Huete Jimenez hammer_cmd_info(char **av, int ac)
46b66b9421SAntonio Huete {
47eac446c5SMatthew Dillon 	struct statfs *stfsbuf;
48095ad2ebSThomas Nikolajsen 	int mntsize, i, first = 1;
49eac446c5SMatthew Dillon 	char *fstype, *path;
50b66b9421SAntonio Huete 
51b66b9421SAntonio Huete 	tzset();
5261630cfcSAntonio Huete Jimenez 
5361630cfcSAntonio Huete Jimenez 	if (ac > 0) {
5461630cfcSAntonio Huete Jimenez                 while (ac) {
5561630cfcSAntonio Huete Jimenez                         show_info(*av);
5661630cfcSAntonio Huete Jimenez                         --ac;
5761630cfcSAntonio Huete Jimenez                         ++av;
58e6fca9a0STomohiro Kusumi 			if (ac)
59e6fca9a0STomohiro Kusumi 				printf("\n");
6061630cfcSAntonio Huete Jimenez                 }
6161630cfcSAntonio Huete Jimenez 	} else {
62eac446c5SMatthew Dillon 		mntsize = getmntinfo(&stfsbuf, MNT_NOWAIT);
63eac446c5SMatthew Dillon 		if (mntsize > 0) {
64eac446c5SMatthew Dillon 			for (i = 0; i < mntsize; i++) {
65eac446c5SMatthew Dillon 				fstype = stfsbuf[i].f_fstypename;
66eac446c5SMatthew Dillon 				path = stfsbuf[i].f_mntonname;
67095ad2ebSThomas Nikolajsen 				if ((strcmp(fstype, "hammer")) == 0) {
68095ad2ebSThomas Nikolajsen 					if (first)
69095ad2ebSThomas Nikolajsen 						first = 0;
70095ad2ebSThomas Nikolajsen 					else
710ba55d9aSTomohiro Kusumi 						printf("\n");
72b66b9421SAntonio Huete 					show_info(path);
73b66b9421SAntonio Huete 				}
74095ad2ebSThomas Nikolajsen 			}
75c1ac632aSTomohiro Kusumi 			if (first)
760ba55d9aSTomohiro Kusumi 				printf("No mounted HAMMER filesystems found\n");
777bb56fa9SMatthew Dillon 		} else {
780ba55d9aSTomohiro Kusumi 			printf("No mounted filesystems found\n");
797bb56fa9SMatthew Dillon 		}
8061630cfcSAntonio Huete Jimenez 	}
81b66b9421SAntonio Huete }
82b66b9421SAntonio Huete 
83babddd74STomohiro Kusumi /*
84babddd74STomohiro Kusumi  * This is an adhoc function which exists only because libhammer can't
85babddd74STomohiro Kusumi  * properly handle variety of errors.
86babddd74STomohiro Kusumi  */
87005a4da7STomohiro Kusumi static
88005a4da7STomohiro Kusumi void
__test_if_hammer_or_abort(const char * path)89babddd74STomohiro Kusumi __test_if_hammer_or_abort(const char *path)
90babddd74STomohiro Kusumi {
91babddd74STomohiro Kusumi 	struct hammer_ioc_info info;
92babddd74STomohiro Kusumi 	int fd;
93babddd74STomohiro Kusumi 
94babddd74STomohiro Kusumi 	fd = open(path, O_RDONLY);
95052fd72bSTomohiro Kusumi 	if (fd < 0) {
96babddd74STomohiro Kusumi 		err(1, "Failed to open %s", path);
97052fd72bSTomohiro Kusumi 		/* not reached */
98052fd72bSTomohiro Kusumi 	}
99babddd74STomohiro Kusumi 
100babddd74STomohiro Kusumi 	/*
101babddd74STomohiro Kusumi 	 * This ioctl never fails as long as fd is for HAMMER filesystem,
102babddd74STomohiro Kusumi 	 * thus we can assume path isn't in HAMMER if this fails.
103babddd74STomohiro Kusumi 	 */
104052fd72bSTomohiro Kusumi 	if (ioctl(fd, HAMMERIOC_GET_INFO, &info) < 0) {
105babddd74STomohiro Kusumi 		err(1, "%s is probably not a HAMMER filesystem", path);
106052fd72bSTomohiro Kusumi 		/* not reached */
107052fd72bSTomohiro Kusumi 	}
108babddd74STomohiro Kusumi 
109babddd74STomohiro Kusumi 	close(fd);
110babddd74STomohiro Kusumi }
111babddd74STomohiro Kusumi 
1127bb56fa9SMatthew Dillon void
show_info(char * path)1137bb56fa9SMatthew Dillon show_info(char *path)
1147bb56fa9SMatthew Dillon {
115a77d0377SAntonio Huete Jimenez 	libhammer_fsinfo_t fip;
1164f09feabSAntonio Huete Jimenez 	libhammer_pfsinfo_t pi, pi_first;
11799df3406STomohiro Kusumi 	struct hammer_ioc_volume_list ioc;
118933b2263SAntonio Huete Jimenez 	int64_t	    usedbigblocks;
119933b2263SAntonio Huete Jimenez 	int64_t	    usedbytes, rsvbytes;
120933b2263SAntonio Huete Jimenez 	int64_t	    totalbytes, freebytes;
121095ad2ebSThomas Nikolajsen 	char	    *fsid;
1227bb56fa9SMatthew Dillon 	char	    buf[6];
12356c2f4d6STomohiro Kusumi 	char	    rootvol[MAXPATHLEN];
12499df3406STomohiro Kusumi 	int i;
125b66b9421SAntonio Huete 
1264f09feabSAntonio Huete Jimenez 	fsid = NULL;
127eac446c5SMatthew Dillon 	usedbigblocks = 0;
1284f09feabSAntonio Huete Jimenez 
129933b2263SAntonio Huete Jimenez 	usedbytes = totalbytes = rsvbytes = freebytes = 0;
130b66b9421SAntonio Huete 
131babddd74STomohiro Kusumi 	/* Need to do this before libhammer gets involved */
132babddd74STomohiro Kusumi 	__test_if_hammer_or_abort(path);
133babddd74STomohiro Kusumi 
134a77d0377SAntonio Huete Jimenez 	fip = libhammer_get_fsinfo(path);
135052fd72bSTomohiro Kusumi 	if (fip == NULL) {
136f91ad52aSTomohiro Kusumi 		errx(1, "Failed to get filesystem info");
137052fd72bSTomohiro Kusumi 		/* not reached */
138052fd72bSTomohiro Kusumi 	}
139b66b9421SAntonio Huete 
140b66b9421SAntonio Huete 	/* Find out the UUID strings */
1413cd578edSTomohiro Kusumi 	hammer_uuid_to_string(&fip->vol_fsid, &fsid);
142b66b9421SAntonio Huete 
14399df3406STomohiro Kusumi 	/* Get the volume paths */
144052fd72bSTomohiro Kusumi 	if (hammer_fs_to_vol(path, &ioc) == -1) {
14502318f07STomohiro Kusumi 		errx(1, "Failed to get volume paths");
146052fd72bSTomohiro Kusumi 		/* not reached */
147052fd72bSTomohiro Kusumi 	}
14899df3406STomohiro Kusumi 
14956c2f4d6STomohiro Kusumi 	/* Get the root volume path */
150052fd72bSTomohiro Kusumi 	if (hammer_fs_to_rootvol(path, rootvol, sizeof(rootvol)) == -1) {
15102318f07STomohiro Kusumi 		errx(1, "Failed to get root volume path");
152052fd72bSTomohiro Kusumi 		/* not reached */
153052fd72bSTomohiro Kusumi 	}
15456c2f4d6STomohiro Kusumi 
155b66b9421SAntonio Huete 	/* Volume information */
1560ba55d9aSTomohiro Kusumi 	printf("Volume identification\n");
1570ba55d9aSTomohiro Kusumi 	printf("\tLabel               %s\n", fip->vol_name);
1580ba55d9aSTomohiro Kusumi 	printf("\tNo. Volumes         %d\n", fip->nvolumes);
1590ba55d9aSTomohiro Kusumi 	printf("\tHAMMER Volumes      ");
16099df3406STomohiro Kusumi 	for (i = 0; i < ioc.nvols; i++) {
16199df3406STomohiro Kusumi 		printf("%s", ioc.vols[i].device_name);
16299df3406STomohiro Kusumi 		if (i != ioc.nvols - 1)
16399df3406STomohiro Kusumi 			printf(":");
16499df3406STomohiro Kusumi 	}
16599df3406STomohiro Kusumi 	printf("\n");
1660ba55d9aSTomohiro Kusumi 	printf("\tRoot Volume         %s\n", rootvol);
1670ba55d9aSTomohiro Kusumi 	printf("\tFSID                %s\n", fsid);
1680ba55d9aSTomohiro Kusumi 	printf("\tHAMMER Version      %d\n", fip->version);
169b66b9421SAntonio Huete 
170d165c90aSTomohiro Kusumi 	/* Big-blocks information */
171a77d0377SAntonio Huete Jimenez 	usedbigblocks = fip->bigblocks - fip->freebigblocks;
172b66b9421SAntonio Huete 
1730ba55d9aSTomohiro Kusumi 	printf("Big-block information\n");
1740ba55d9aSTomohiro Kusumi 	printf("\tTotal      %10jd\n", (intmax_t)fip->bigblocks);
1750ba55d9aSTomohiro Kusumi 	printf("\tUsed       %10jd (%.2lf%%)\n"
176095ad2ebSThomas Nikolajsen 	       "\tReserved   %10jd (%.2lf%%)\n"
177095ad2ebSThomas Nikolajsen 	       "\tFree       %10jd (%.2lf%%)\n",
178a276dc6bSMatthew Dillon 		(intmax_t)usedbigblocks,
179a77d0377SAntonio Huete Jimenez 		percent(usedbigblocks, fip->bigblocks),
180a77d0377SAntonio Huete Jimenez 		(intmax_t)fip->rsvbigblocks,
181a77d0377SAntonio Huete Jimenez 		percent(fip->rsvbigblocks, fip->bigblocks),
182a77d0377SAntonio Huete Jimenez 		(intmax_t)(fip->freebigblocks - fip->rsvbigblocks),
1830ba55d9aSTomohiro Kusumi 		percent(fip->freebigblocks - fip->rsvbigblocks, fip->bigblocks));
1840ba55d9aSTomohiro Kusumi 	printf("Space information\n");
185b66b9421SAntonio Huete 
186b66b9421SAntonio Huete 	/* Space information */
187a77d0377SAntonio Huete Jimenez 	totalbytes = (fip->bigblocks << HAMMER_BIGBLOCK_BITS);
188e04ee2deSTomohiro Kusumi 	usedbytes = (usedbigblocks << HAMMER_BIGBLOCK_BITS);
189a77d0377SAntonio Huete Jimenez 	rsvbytes = (fip->rsvbigblocks << HAMMER_BIGBLOCK_BITS);
190a77d0377SAntonio Huete Jimenez 	freebytes = ((fip->freebigblocks - fip->rsvbigblocks)
191e04ee2deSTomohiro Kusumi 	    << HAMMER_BIGBLOCK_BITS);
192933b2263SAntonio Huete Jimenez 
1930ba55d9aSTomohiro Kusumi 	printf("\tNo. Inodes %10jd\n", (intmax_t)fip->inodes);
194933b2263SAntonio Huete Jimenez 	humanize_number(buf, sizeof(buf)  - (totalbytes < 0 ? 0 : 1),
195933b2263SAntonio Huete Jimenez 	    totalbytes, "", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE | HN_B);
1960ba55d9aSTomohiro Kusumi 	printf("\tTotal size     %6s (%jd bytes)\n",
197933b2263SAntonio Huete Jimenez 	    buf, (intmax_t)totalbytes);
198b66b9421SAntonio Huete 
199933b2263SAntonio Huete Jimenez 	humanize_number(buf, sizeof(buf)  - (usedbytes < 0 ? 0 : 1),
200933b2263SAntonio Huete Jimenez 	    usedbytes, "", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE | HN_B);
2010ba55d9aSTomohiro Kusumi 	printf("\tUsed           %6s (%.2lf%%)\n", buf,
202933b2263SAntonio Huete Jimenez 	    percent(usedbytes, totalbytes));
203b66b9421SAntonio Huete 
204933b2263SAntonio Huete Jimenez 	humanize_number(buf, sizeof(buf)  - (rsvbytes < 0 ? 0 : 1),
205933b2263SAntonio Huete Jimenez 	    rsvbytes, "", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE | HN_B);
2060ba55d9aSTomohiro Kusumi 	printf("\tReserved       %6s (%.2lf%%)\n", buf,
207933b2263SAntonio Huete Jimenez 	    percent(rsvbytes, totalbytes));
208b66b9421SAntonio Huete 
209933b2263SAntonio Huete Jimenez 	humanize_number(buf, sizeof(buf)  - (freebytes < 0 ? 0 : 1),
210933b2263SAntonio Huete Jimenez 	    freebytes, "", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE | HN_B);
2110ba55d9aSTomohiro Kusumi 	printf("\tFree           %6s (%.2lf%%)\n", buf,
212933b2263SAntonio Huete Jimenez 	    percent(freebytes, totalbytes));
2137bb56fa9SMatthew Dillon 
2147bb56fa9SMatthew Dillon 	/* Pseudo-filesystem information */
2150ba55d9aSTomohiro Kusumi 	printf("PFS information\n");
216a5ff7917STomohiro Kusumi 	printf("\t  PFS#  Mode    Snaps\n");
2177bb56fa9SMatthew Dillon 
2184f09feabSAntonio Huete Jimenez 	/* Iterate all the PFSs found */
219a77d0377SAntonio Huete Jimenez 	pi_first = libhammer_get_first_pfs(fip);
2204f09feabSAntonio Huete Jimenez 	for (pi = pi_first; pi != NULL; pi = libhammer_get_next_pfs(pi)) {
2210ba55d9aSTomohiro Kusumi 		printf("\t%6d  %-6s",
2224f09feabSAntonio Huete Jimenez 		    pi->pfs_id, (pi->ismaster ? "MASTER" : "SLAVE"));
223181b7084SAntonio Huete Jimenez 
2244f09feabSAntonio Huete Jimenez 		snprintf(buf, 6, "%d", pi->snapcount);
225a5ff7917STomohiro Kusumi 		printf(" %6s", (pi->head.error && pi->snapcount == 0) ? "-" : buf);
226a5ff7917STomohiro Kusumi 		if (pi->pfs_id == HAMMER_ROOT_PFSID)
227a5ff7917STomohiro Kusumi 			printf(" (root PFS)");
228a5ff7917STomohiro Kusumi 		printf("\n");
2297bb56fa9SMatthew Dillon 	}
230b66b9421SAntonio Huete 
2317bb56fa9SMatthew Dillon 	free(fsid);
2324f09feabSAntonio Huete Jimenez 
233a77d0377SAntonio Huete Jimenez 	libhammer_free_fsinfo(fip);
2344f09feabSAntonio Huete Jimenez 
2357bb56fa9SMatthew Dillon }
2367bb56fa9SMatthew Dillon 
237005a4da7STomohiro Kusumi static
238005a4da7STomohiro Kusumi double
percent(int64_t value,int64_t total)2397bb56fa9SMatthew Dillon percent(int64_t value, int64_t total)
2407bb56fa9SMatthew Dillon {
241b66b9421SAntonio Huete 	/* Avoid divide-by-zero */
242095ad2ebSThomas Nikolajsen 	if (total == 0)
243095ad2ebSThomas Nikolajsen 		return 100.0;
244b66b9421SAntonio Huete 
245eac446c5SMatthew Dillon 	return ((value * 100.0) / (double)total);
246b66b9421SAntonio Huete }
247