| // SPDX-License-Identifier: GPL-2.0 | 
 | /* | 
 |  * Copyright (c) 2012 Red Hat, Inc. | 
 |  * All Rights Reserved. | 
 |  */ | 
 |  | 
 | #include "libxfs.h" | 
 | #include "libfrog/fsgeom.h" | 
 | #include "command.h" | 
 | #include "input.h" | 
 | #include "init.h" | 
 | #include "libfrog/paths.h" | 
 | #include "space.h" | 
 |  | 
 | static cmdinfo_t prealloc_cmd; | 
 |  | 
 | /* | 
 |  * Control preallocation amounts. | 
 |  */ | 
 | static int | 
 | prealloc_f( | 
 | 	int			argc, | 
 | 	char			**argv) | 
 | { | 
 | 	struct xfs_fs_eofblocks eofb = {0}; | 
 | 	struct xfs_fsop_geom	*fsgeom = &file->xfd.fsgeom; | 
 | 	int			c; | 
 |  | 
 | 	eofb.eof_version = XFS_EOFBLOCKS_VERSION; | 
 |  | 
 | 	while ((c = getopt(argc, argv, "g:m:p:su:")) != EOF) { | 
 | 		switch (c) { | 
 | 		case 'g': | 
 | 			eofb.eof_flags |= XFS_EOF_FLAGS_GID; | 
 | 			eofb.eof_gid = cvt_u32(optarg, 10); | 
 | 			if (errno) | 
 | 				return command_usage(&prealloc_cmd); | 
 | 			break; | 
 | 		case 'u': | 
 | 			eofb.eof_flags |= XFS_EOF_FLAGS_UID; | 
 | 			eofb.eof_uid = cvt_u32(optarg, 10); | 
 | 			if (errno) | 
 | 				return command_usage(&prealloc_cmd); | 
 | 			break; | 
 | 		case 'p': | 
 | 			eofb.eof_flags |= XFS_EOF_FLAGS_PRID; | 
 | 			eofb.eof_prid = cvt_u32(optarg, 10); | 
 | 			if (errno) | 
 | 				return command_usage(&prealloc_cmd); | 
 | 			break; | 
 | 		case 's': | 
 | 			eofb.eof_flags |= XFS_EOF_FLAGS_SYNC; | 
 | 			break; | 
 | 		case 'm': | 
 | 			eofb.eof_flags |= XFS_EOF_FLAGS_MINFILESIZE; | 
 | 			eofb.eof_min_file_size = cvtnum(fsgeom->blocksize, | 
 | 					fsgeom->sectsize, optarg); | 
 | 			break; | 
 | 		default: | 
 | 			return command_usage(&prealloc_cmd); | 
 | 		} | 
 | 	} | 
 | 	if (optind != argc) | 
 | 		return command_usage(&prealloc_cmd); | 
 |  | 
 | 	if (ioctl(file->xfd.fd, XFS_IOC_FREE_EOFBLOCKS, &eofb) < 0) { | 
 | 		fprintf(stderr, _("%s: XFS_IOC_FREE_EOFBLOCKS on %s: %s\n"), | 
 | 			progname, file->name, strerror(errno)); | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | static void | 
 | prealloc_help(void) | 
 | { | 
 | 	printf(_( | 
 | "\n" | 
 | "Remove speculative preallocation\n" | 
 | "\n" | 
 | " -g gid    -- remove prealloc on files matching group <gid>\n" | 
 | " -m minlen -- only consider files larger than <minlen>\n" | 
 | " -p prid   -- remove prealloc on files matching project <prid>\n" | 
 | " -s        -- wait for removal to complete\n" | 
 | " -u uid    -- remove prealloc on files matching user <uid>\n" | 
 | "\n" | 
 | "If none of -u, -g, or -p are specified, this command acts on all files.\n" | 
 | "minlen can take units.\n" | 
 | "\n")); | 
 |  | 
 | } | 
 |  | 
 | void | 
 | prealloc_init(void) | 
 | { | 
 | 	prealloc_cmd.name = "prealloc"; | 
 | 	prealloc_cmd.altname = "prealloc"; | 
 | 	prealloc_cmd.cfunc = prealloc_f; | 
 | 	prealloc_cmd.argmin = 1; | 
 | 	prealloc_cmd.argmax = -1; | 
 | 	prealloc_cmd.args = "[-s] [-u id] [-g id] [-p id] [-m minlen]"; | 
 | 	prealloc_cmd.flags = CMD_FLAG_ONESHOT; | 
 | 	prealloc_cmd.oneline = _("Remove speculative preallocation"); | 
 | 	prealloc_cmd.help = prealloc_help; | 
 |  | 
 | 	add_command(&prealloc_cmd); | 
 | } | 
 |  |