main.c revision 75557
11558Srgrimes/*
21558Srgrimes * Copyright (c) 1980, 1986, 1993
31558Srgrimes *	The Regents of the University of California.  All rights reserved.
41558Srgrimes *
51558Srgrimes * Redistribution and use in source and binary forms, with or without
61558Srgrimes * modification, are permitted provided that the following conditions
71558Srgrimes * are met:
81558Srgrimes * 1. Redistributions of source code must retain the above copyright
91558Srgrimes *    notice, this list of conditions and the following disclaimer.
101558Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
111558Srgrimes *    notice, this list of conditions and the following disclaimer in the
121558Srgrimes *    documentation and/or other materials provided with the distribution.
131558Srgrimes * 3. All advertising materials mentioning features or use of this software
141558Srgrimes *    must display the following acknowledgement:
151558Srgrimes *	This product includes software developed by the University of
161558Srgrimes *	California, Berkeley and its contributors.
171558Srgrimes * 4. Neither the name of the University nor the names of its contributors
181558Srgrimes *    may be used to endorse or promote products derived from this software
191558Srgrimes *    without specific prior written permission.
201558Srgrimes *
211558Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
221558Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
231558Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
241558Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
251558Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
261558Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
271558Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
281558Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
291558Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
301558Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
311558Srgrimes * SUCH DAMAGE.
321558Srgrimes */
331558Srgrimes
341558Srgrimes#ifndef lint
357585Sbdestatic const char copyright[] =
361558Srgrimes"@(#) Copyright (c) 1980, 1986, 1993\n\
371558Srgrimes	The Regents of the University of California.  All rights reserved.\n";
381558Srgrimes#endif /* not lint */
391558Srgrimes
401558Srgrimes#ifndef lint
4141477Sjulian#if 0
4241477Sjulianstatic char sccsid[] = "@(#)main.c	8.6 (Berkeley) 5/14/95";
4341477Sjulian#endif
4441477Sjulianstatic const char rcsid[] =
4550476Speter  "$FreeBSD: head/sbin/fsck_ffs/main.c 75557 2001-04-16 22:22:21Z mckusick $";
461558Srgrimes#endif /* not lint */
471558Srgrimes
481558Srgrimes#include <sys/param.h>
4955275Speter#include <sys/stat.h>
5075557Smckusick#include <sys/file.h>
511558Srgrimes#include <sys/time.h>
521558Srgrimes#include <sys/mount.h>
5340918Smjacob#include <sys/resource.h>
5423675Speter
551558Srgrimes#include <ufs/ufs/dinode.h>
5623675Speter#include <ufs/ufs/ufsmount.h>
571558Srgrimes#include <ufs/ffs/fs.h>
5823675Speter
5923675Speter#include <err.h>
6055725Speter#include <errno.h>
611558Srgrimes#include <fstab.h>
6255725Speter#include <paths.h>
6323675Speter
641558Srgrimes#include "fsck.h"
651558Srgrimes
6666861Sadrianint returntosingle;
6766861Sadrian
6866861Sadrianstatic void usage __P((void));
6923675Speterstatic int argtoi __P((int flag, char *req, char *str, int base));
7023675Speterstatic int docheck __P((struct fstab *fsp));
7123675Speterstatic int checkfilesys __P((char *filesys, char *mntpt, long auxdata,
7223675Speter		int child));
7355275Speterstatic struct statfs *getmntpt __P((const char *));
7423675Speterint main __P((int argc, char *argv[]));
7523675Speter
767585Sbdeint
771558Srgrimesmain(argc, argv)
781558Srgrimes	int	argc;
791558Srgrimes	char	*argv[];
801558Srgrimes{
811558Srgrimes	int ch;
8241474Sjulian	struct rlimit rlimit;
8366861Sadrian	int ret = 0;
841558Srgrimes
851558Srgrimes	sync();
8666861Sadrian	skipclean = 1;
8774556Smckusick	while ((ch = getopt(argc, argv, "b:Bc:dfm:npy")) != -1) {
881558Srgrimes		switch (ch) {
891558Srgrimes		case 'b':
9066861Sadrian			skipclean = 0;
911558Srgrimes			bflag = argtoi('b', "number", optarg, 10);
921558Srgrimes			printf("Alternate super block location: %d\n", bflag);
931558Srgrimes			break;
941558Srgrimes
9574556Smckusick		case 'B':
9674556Smckusick			bkgrdflag = 1;
9774556Smckusick			break;
9874556Smckusick
991558Srgrimes		case 'c':
10066861Sadrian			skipclean = 0;
1011558Srgrimes			cvtlevel = argtoi('c', "conversion level", optarg, 10);
1021558Srgrimes			break;
1038871Srgrimes
1041558Srgrimes		case 'd':
1051558Srgrimes			debug++;
1061558Srgrimes			break;
1071558Srgrimes
1082153Sdg		case 'f':
10966861Sadrian			skipclean = 0;
1102153Sdg			break;
1112153Sdg
1121558Srgrimes		case 'm':
1131558Srgrimes			lfmode = argtoi('m', "mode", optarg, 8);
1141558Srgrimes			if (lfmode &~ 07777)
11523675Speter				errx(EEXIT, "bad mode to -m: %o", lfmode);
1161558Srgrimes			printf("** lost+found creation mode %o\n", lfmode);
1171558Srgrimes			break;
1181558Srgrimes
1191558Srgrimes		case 'n':
1201558Srgrimes			nflag++;
1211558Srgrimes			yflag = 0;
1221558Srgrimes			break;
1231558Srgrimes
12466861Sadrian		case 'p':
12566861Sadrian			preen++;
12666861Sadrian			break;
12766861Sadrian
1281558Srgrimes		case 'y':
1291558Srgrimes			yflag++;
1301558Srgrimes			nflag = 0;
1311558Srgrimes			break;
1321558Srgrimes
1331558Srgrimes		default:
13466861Sadrian			usage();
1351558Srgrimes		}
1361558Srgrimes	}
1371558Srgrimes	argc -= optind;
1381558Srgrimes	argv += optind;
13966861Sadrian
14066861Sadrian	if (!argc)
14166861Sadrian		usage();
14266861Sadrian
1431558Srgrimes	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
1441558Srgrimes		(void)signal(SIGINT, catch);
1451558Srgrimes	if (preen)
1461558Srgrimes		(void)signal(SIGQUIT, catchquit);
14770050Siedowse	signal(SIGINFO, infohandler);
14841474Sjulian	/*
14941474Sjulian	 * Push up our allowed memory limit so we can cope
15041474Sjulian	 * with huge filesystems.
15141474Sjulian	 */
15241474Sjulian	if (getrlimit(RLIMIT_DATA, &rlimit) == 0) {
15341474Sjulian		rlimit.rlim_cur = rlimit.rlim_max;
15441474Sjulian		(void)setrlimit(RLIMIT_DATA, &rlimit);
15541474Sjulian	}
15666861Sadrian	while (argc-- > 0)
15766861Sadrian		(void)checkfilesys(blockcheck(*argv++), 0, 0L, 0);
15841474Sjulian
1591558Srgrimes	if (returntosingle)
16066861Sadrian		ret = 2;
1611558Srgrimes	exit(ret);
1621558Srgrimes}
1631558Srgrimes
16423675Speterstatic int
1651558Srgrimesargtoi(flag, req, str, base)
1661558Srgrimes	int flag;
1671558Srgrimes	char *req, *str;
1681558Srgrimes	int base;
1691558Srgrimes{
1701558Srgrimes	char *cp;
1711558Srgrimes	int ret;
1721558Srgrimes
1731558Srgrimes	ret = (int)strtol(str, &cp, base);
1741558Srgrimes	if (cp == str || *cp)
17523675Speter		errx(EEXIT, "-%c flag requires a %s", flag, req);
1761558Srgrimes	return (ret);
1771558Srgrimes}
1781558Srgrimes
1791558Srgrimes/*
1801558Srgrimes * Check the specified filesystem.
1811558Srgrimes */
1821558Srgrimes/* ARGSUSED */
18323675Speterstatic int
1841558Srgrimescheckfilesys(filesys, mntpt, auxdata, child)
1851558Srgrimes	char *filesys, *mntpt;
1861558Srgrimes	long auxdata;
1877585Sbde	int child;
1881558Srgrimes{
18923675Speter	ufs_daddr_t n_ffree, n_bfree;
19074556Smckusick	struct ufs_args args;
1911558Srgrimes	struct dups *dp;
19274556Smckusick	struct statfs *mntp;
1931558Srgrimes	struct zlncnt *zlnp;
19474556Smckusick	ufs_daddr_t blks;
19574556Smckusick	ufs_daddr_t files;
19655275Speter	int cylno;
1971558Srgrimes
1981558Srgrimes	if (preen && child)
1991558Srgrimes		(void)signal(SIGQUIT, voidquit);
2001558Srgrimes	cdevname = filesys;
2011558Srgrimes	if (debug && preen)
2021558Srgrimes		pwarn("starting\n");
20375557Smckusick	sblock_init();
20474556Smckusick
20574556Smckusick	/*
20674556Smckusick	 * If we are to do a background check:
20774556Smckusick	 *	Get the mount point information of the filesystem
20874556Smckusick	 *	create snapshot file
20974556Smckusick	 *	return created snapshot file
21074556Smckusick	 *	if not found, clear bkgrdflag and proceed with normal fsck
21174556Smckusick	 */
21274556Smckusick	mntp = getmntpt(filesys);
21374556Smckusick	if (bkgrdflag) {
21474556Smckusick		if (mntp == NULL) {
21574556Smckusick			bkgrdflag = 0;
21675557Smckusick			pfatal("NOT MOUNTED, CANNOT RUN IN BACKGROUND\n");
21774556Smckusick		} else if ((mntp->f_flags & MNT_SOFTDEP) == 0) {
21874556Smckusick			bkgrdflag = 0;
21975557Smckusick			pfatal("NOT USING SOFT UPDATES, %s\n",
22075557Smckusick			    "CANNOT RUN IN BACKGROUND");
22174556Smckusick		} else if ((mntp->f_flags & MNT_RDONLY) != 0) {
22274556Smckusick			bkgrdflag = 0;
22375557Smckusick			pfatal("MOUNTED READ-ONLY, CANNOT RUN IN BACKGROUND\n");
22475557Smckusick		} else if ((fsreadfd = open(filesys, O_RDONLY)) >= 0) {
22575557Smckusick			if (readsb(0) != 0) {
22675557Smckusick				if (sblock.fs_flags & FS_NEEDSFSCK) {
22775557Smckusick					bkgrdflag = 0;
22875557Smckusick					pfatal("UNEXPECTED INCONSISTENCY, %s\n",
22975557Smckusick					    "CANNOT RUN IN BACKGROUND\n");
23075557Smckusick				}
23175557Smckusick				if ((sblock.fs_flags & FS_UNCLEAN) == 0 &&
23275557Smckusick				    skipclean && preen) {
23375557Smckusick					/*
23475557Smckusick					 * filesystem is clean;
23575557Smckusick					 * skip snapshot and report it clean
23675557Smckusick					 */
23775557Smckusick					pwarn("FILESYSTEM CLEAN; %s\n",
23875557Smckusick					    "SKIPPING CHECKS");
23975557Smckusick					goto clean;
24075557Smckusick				}
24175557Smckusick			}
24275557Smckusick			close(fsreadfd);
24375557Smckusick		}
24475557Smckusick		if (bkgrdflag) {
24574556Smckusick			snprintf(snapname, sizeof snapname, "%s/.fsck_snapshot",
24674556Smckusick			    mntp->f_mntonname);
24774556Smckusick			args.fspec = snapname;
24874556Smckusick			while (mount("ffs", mntp->f_mntonname,
24974556Smckusick			    mntp->f_flags | MNT_UPDATE | MNT_SNAPSHOT,
25074556Smckusick			    &args) < 0) {
25174556Smckusick				if (errno == EEXIST && unlink(snapname) == 0)
25274556Smckusick					continue;
25374556Smckusick				bkgrdflag = 0;
25475557Smckusick				pfatal("CANNOT CREATE SNAPSHOT %s: %s\n",
25574556Smckusick				    snapname, strerror(errno));
25674556Smckusick				break;
25774556Smckusick			}
25874556Smckusick			if (bkgrdflag != 0)
25974556Smckusick				filesys = snapname;
26074556Smckusick		}
26174556Smckusick	}
26274556Smckusick
26323675Speter	switch (setup(filesys)) {
26423675Speter	case 0:
2651558Srgrimes		if (preen)
2661558Srgrimes			pfatal("CAN'T CHECK FILE SYSTEM.");
26741477Sjulian		return (0);
26823675Speter	case -1:
26975557Smckusick	clean:
27041477Sjulian		pwarn("clean, %ld free ", sblock.fs_cstotal.cs_nffree +
27141477Sjulian		    sblock.fs_frag * sblock.fs_cstotal.cs_nbfree);
27241477Sjulian		printf("(%d frags, %d blocks, %.1f%% fragmentation)\n",
27341477Sjulian		    sblock.fs_cstotal.cs_nffree, sblock.fs_cstotal.cs_nbfree,
27441477Sjulian		    sblock.fs_cstotal.cs_nffree * 100.0 / sblock.fs_dsize);
27531904Sbde		return (0);
2762153Sdg	}
27755275Speter
27855275Speter	/*
27934266Sjulian	 * Cleared if any questions answered no. Used to decide if
28034266Sjulian	 * the superblock should be marked clean.
28134266Sjulian	 */
28234266Sjulian	resolved = 1;
28334266Sjulian	/*
2841558Srgrimes	 * 1: scan inodes tallying blocks used
2851558Srgrimes	 */
2861558Srgrimes	if (preen == 0) {
2871558Srgrimes		printf("** Last Mounted on %s\n", sblock.fs_fsmnt);
28874556Smckusick		if (mntp != NULL && mntp->f_flags & MNT_ROOTFS)
2891558Srgrimes			printf("** Root file system\n");
2901558Srgrimes		printf("** Phase 1 - Check Blocks and Sizes\n");
2911558Srgrimes	}
2921558Srgrimes	pass1();
2931558Srgrimes
2941558Srgrimes	/*
2951558Srgrimes	 * 1b: locate first references to duplicates, if any
2961558Srgrimes	 */
2971558Srgrimes	if (duplist) {
29834266Sjulian		if (preen || usedsoftdep)
2991558Srgrimes			pfatal("INTERNAL ERROR: dups with -p");
3001558Srgrimes		printf("** Phase 1b - Rescan For More DUPS\n");
3011558Srgrimes		pass1b();
3021558Srgrimes	}
3031558Srgrimes
3041558Srgrimes	/*
3051558Srgrimes	 * 2: traverse directories from root to mark all connected directories
3061558Srgrimes	 */
3071558Srgrimes	if (preen == 0)
3081558Srgrimes		printf("** Phase 2 - Check Pathnames\n");
3091558Srgrimes	pass2();
3101558Srgrimes
3111558Srgrimes	/*
3121558Srgrimes	 * 3: scan inodes looking for disconnected directories
3131558Srgrimes	 */
3141558Srgrimes	if (preen == 0)
3151558Srgrimes		printf("** Phase 3 - Check Connectivity\n");
3161558Srgrimes	pass3();
3171558Srgrimes
3181558Srgrimes	/*
3191558Srgrimes	 * 4: scan inodes looking for disconnected files; check reference counts
3201558Srgrimes	 */
3211558Srgrimes	if (preen == 0)
3221558Srgrimes		printf("** Phase 4 - Check Reference Counts\n");
3231558Srgrimes	pass4();
3241558Srgrimes
3251558Srgrimes	/*
3261558Srgrimes	 * 5: check and repair resource counts in cylinder groups
3271558Srgrimes	 */
3281558Srgrimes	if (preen == 0)
3291558Srgrimes		printf("** Phase 5 - Check Cyl groups\n");
3301558Srgrimes	pass5();
3311558Srgrimes
3321558Srgrimes	/*
3331558Srgrimes	 * print out summary statistics
3341558Srgrimes	 */
3351558Srgrimes	n_ffree = sblock.fs_cstotal.cs_nffree;
3361558Srgrimes	n_bfree = sblock.fs_cstotal.cs_nbfree;
33774556Smckusick	files = maxino - ROOTINO - sblock.fs_cstotal.cs_nifree - n_files;
33874556Smckusick	blks = n_blks +
33974556Smckusick	    sblock.fs_ncg * (cgdmin(&sblock, 0) - cgsblock(&sblock, 0));
34074556Smckusick	blks += cgsblock(&sblock, 0) - cgbase(&sblock, 0);
34174556Smckusick	blks += howmany(sblock.fs_cssize, sblock.fs_fsize);
34274556Smckusick	blks = maxfsblock - (n_ffree + sblock.fs_frag * n_bfree) - blks;
34374556Smckusick	if (bkgrdflag && (files > 0 || blks > 0)) {
34474556Smckusick		countdirs = sblock.fs_cstotal.cs_ndir - countdirs;
34574556Smckusick		pwarn("Reclaimed: %d directories, %d files, %d fragments\n",
34674556Smckusick		    countdirs, files - countdirs, blks);
34774556Smckusick	}
3481558Srgrimes	pwarn("%ld files, %ld used, %ld free ",
3491558Srgrimes	    n_files, n_blks, n_ffree + sblock.fs_frag * n_bfree);
35031904Sbde	printf("(%d frags, %d blocks, %.1f%% fragmentation)\n",
35131904Sbde	    n_ffree, n_bfree, n_ffree * 100.0 / sblock.fs_dsize);
3521558Srgrimes	if (debug) {
35374556Smckusick		if (files < 0)
35474556Smckusick			printf("%d inodes missing\n", -files);
35574556Smckusick		if (blks < 0)
35674556Smckusick			printf("%d blocks missing\n", -blks);
3571558Srgrimes		if (duplist != NULL) {
3581558Srgrimes			printf("The following duplicate blocks remain:");
3591558Srgrimes			for (dp = duplist; dp; dp = dp->next)
36031904Sbde				printf(" %d,", dp->dup);
3611558Srgrimes			printf("\n");
3621558Srgrimes		}
3631558Srgrimes		if (zlnhead != NULL) {
3641558Srgrimes			printf("The following zero link count inodes remain:");
3651558Srgrimes			for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
36631904Sbde				printf(" %u,", zlnp->zlncnt);
3671558Srgrimes			printf("\n");
3681558Srgrimes		}
3691558Srgrimes	}
3701558Srgrimes	zlnhead = (struct zlncnt *)0;
3711558Srgrimes	duplist = (struct dups *)0;
3721558Srgrimes	muldup = (struct dups *)0;
3731558Srgrimes	inocleanup();
3742179Sdg	if (fsmodified) {
37541474Sjulian		sblock.fs_time = time(NULL);
3761558Srgrimes		sbdirty();
3771558Srgrimes	}
3781558Srgrimes	if (cvtlevel && sblk.b_dirty) {
3798871Srgrimes		/*
3801558Srgrimes		 * Write out the duplicate super blocks
3811558Srgrimes		 */
3821558Srgrimes		for (cylno = 0; cylno < sblock.fs_ncg; cylno++)
3831558Srgrimes			bwrite(fswritefd, (char *)&sblock,
3841558Srgrimes			    fsbtodb(&sblock, cgsblock(&sblock, cylno)), SBSIZE);
3851558Srgrimes	}
38634266Sjulian	if (rerun)
38734266Sjulian		resolved = 0;
38855275Speter
38955725Speter	/*
39055773Speter	 * Check to see if the filesystem is mounted read-write.
39155725Speter	 */
39274556Smckusick	if (bkgrdflag == 0 && mntp != NULL && (mntp->f_flags & MNT_RDONLY) == 0)
39355275Speter		resolved = 0;
39434266Sjulian	ckfini(resolved);
39541474Sjulian
39641474Sjulian	for (cylno = 0; cylno < sblock.fs_ncg; cylno++)
39741474Sjulian		if (inostathead[cylno].il_stat != NULL)
39841474Sjulian			free((char *)inostathead[cylno].il_stat);
39941474Sjulian	free((char *)inostathead);
40041474Sjulian	inostathead = NULL;
40141474Sjulian	if (fsmodified && !preen)
4021558Srgrimes		printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
40318808Sguido	if (rerun)
40418808Sguido		printf("\n***** PLEASE RERUN FSCK *****\n");
40574556Smckusick	if (mntp != NULL) {
40623675Speter		struct ufs_args args;
40723675Speter		int ret;
40855725Speter		/*
40955725Speter		 * We modified a mounted filesystem.  Do a mount update on
41055725Speter		 * it unless it is read-write, so we can continue using it
41155725Speter		 * as safely as possible.
41255725Speter		 */
41374556Smckusick		if (mntp->f_flags & MNT_RDONLY) {
41455725Speter			args.fspec = 0;
41555725Speter			args.export.ex_flags = 0;
41655725Speter			args.export.ex_root = 0;
41774556Smckusick			ret = mount("ufs", mntp->f_mntonname,
41874556Smckusick			    mntp->f_flags | MNT_UPDATE | MNT_RELOAD, &args);
41955725Speter			if (ret == 0)
42055725Speter				return (0);
42155725Speter			pwarn("mount reload of '%s' failed: %s\n\n",
42274556Smckusick			    mntp->f_mntonname, strerror(errno));
42355725Speter		}
42441474Sjulian		if (!fsmodified)
42541474Sjulian			return (0);
4261558Srgrimes		if (!preen)
4271558Srgrimes			printf("\n***** REBOOT NOW *****\n");
4281558Srgrimes		sync();
4291558Srgrimes		return (4);
4301558Srgrimes	}
4311558Srgrimes	return (0);
4321558Srgrimes}
43355275Speter
43455275Speter/*
43555725Speter * Get the directory that the device is mounted on.
43655275Speter */
43755275Speterstatic struct statfs *
43855275Spetergetmntpt(name)
43955275Speter	const char *name;
44055275Speter{
44155725Speter	struct stat devstat, mntdevstat;
44255725Speter	char device[sizeof(_PATH_DEV) - 1 + MNAMELEN];
44355725Speter	char *devname;
44455275Speter	struct statfs *mntbuf;
44555275Speter	int i, mntsize;
44655275Speter
44755725Speter	if (stat(name, &devstat) != 0 ||
44855275Speter	    !(S_ISCHR(devstat.st_mode) || S_ISBLK(devstat.st_mode)))
44955275Speter		return (NULL);
45055275Speter	mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
45155275Speter	for (i = 0; i < mntsize; i++) {
45255725Speter		if (strcmp(mntbuf[i].f_fstypename, "ufs") != 0)
45355275Speter			continue;
45455725Speter		devname = mntbuf[i].f_mntfromname;
45555725Speter		if (*devname != '/') {
45655725Speter			strcpy(device, _PATH_DEV);
45755725Speter			strcat(device, devname);
45855725Speter			devname = device;
45955725Speter		}
46055773Speter		if (stat(devname, &mntdevstat) == 0 &&
46155725Speter		    mntdevstat.st_rdev == devstat.st_rdev)
46255275Speter			return (&mntbuf[i]);
46355275Speter	}
46455275Speter	return (NULL);
46555275Speter}
46666861Sadrian
46766861Sadrianstatic void
46866861Sadrianusage()
46966861Sadrian{
47066861Sadrian        extern char *__progname;
47166861Sadrian
47266861Sadrian        (void) fprintf(stderr,
47366861Sadrian            "Usage: %s [-dfnpy] [-B be|le] [-b block] [-c level] [-m mode] "
47466861Sadrian                        "filesystem ...\n",
47566861Sadrian            __progname);
47666861Sadrian        exit(1);
47766861Sadrian}
478