Ejemplo n.º 1
0
int make_fs(const char *part_device, const char *fstype, unsigned int fsblocksize,
		unsigned int flags, const char *fslabel)
{
	int i;
	char fsblock_size[14];
	char *argv[12];
	char ext_opts[1024];
	uint64_t max_online_resize;
	const int lazy = !(flags & PLOOP_CREATE_NOLAZY);

	fsblocksize = fsblocksize != 0 ? fsblocksize : 4096;

	i = 0;
	argv[i++] = "mkfs";
	argv[i++] = "-t";
	argv[i++] = (char*)fstype;
	argv[i++] = "-j";
	if (fslabel != NULL) {
		argv[i++] = "-L";
		argv[i++] = (char*)fslabel;
	}
	snprintf(fsblock_size, sizeof(fsblock_size), "-b%u",
			fsblocksize);
	argv[i++] = fsblock_size;
	/* Reserve enough space so that the block group descriptor table can grow to 16T
	 */
	max_online_resize = PLOOP_MAX_FS_SIZE / fsblocksize;
	snprintf(ext_opts, sizeof(ext_opts), "-Elazy_itable_init=%d,resize=%" PRIu64,
			lazy, max_online_resize);
	argv[i++] = ext_opts;
	/* Set the journal size to 128M to allow online resize up to 16T
	 * independly on the initial image size
	*/
	argv[i++] = "-Jsize=128";
	argv[i++] = (char *)part_device;
	argv[i++] = NULL;

	if (run_prg(argv))
		return SYSEXIT_MKFS;

	i = 0;
	argv[i++] = get_prog(tune2fs_progs);
	argv[i++] =  "-ouser_xattr,acl";
	argv[i++] = "-c0";
	argv[i++] = "-i0";
	argv[i++] = "-eremount-ro";
	argv[i++] = (char *)part_device;
	argv[i++] = NULL;

	if (run_prg(argv))
		return SYSEXIT_MKFS;

	return 0;
}
Ejemplo n.º 2
0
Archivo: fsutils.c Proyecto: grze/ploop
int make_fs(const char *device, const char *fstype, unsigned int fsblocksize)
{
	char part_device[64];
	char fsblock_size[14];
	char *argv[10];
	char ext_opts[1024];
	__u64 max_online_resize;

	fsblocksize = fsblocksize != 0 ? fsblocksize : 4096;

	if (get_partition_device_name(device, part_device, sizeof(part_device)))
		return SYSEXIT_MKFS;

	argv[0] = "mkfs";
	argv[1] = "-t";
	argv[2] = (char*)fstype;
	argv[3] = "-j";
	snprintf(fsblock_size, sizeof(fsblock_size), "-b%u",
			fsblocksize);
	argv[4] = fsblock_size;
	/* Reserve enough space so that the block group descriptor table can grow to 16T
	 * Note: the max_online_resize is __u32 in mkfs.ext4
	 */
	max_online_resize = PLOOP_MAX_FS_SIZE / fsblocksize;
	if (max_online_resize > (__u32)~0)
		max_online_resize = (__u32)~0;
	snprintf(ext_opts, sizeof(ext_opts), "-Elazy_itable_init,resize=%llu",
			 max_online_resize);
	argv[5] = ext_opts;
	/* Set the journal size to 128M to allow online resize up to 16T
	 * independly on the initial image size
	*/
	argv[6] = "-Jsize=128";
	argv[7] = "-i16384"; /* 1 inode per 16K disk space */
	argv[8] = part_device;
	argv[9] = NULL;

	if (run_prg(argv))
		return SYSEXIT_MKFS;

	argv[0] = get_prog(tune2fs_progs);
	argv[1] =  "-ouser_xattr,acl";
	argv[2] = "-c0";
	argv[3] = "-i0";
	argv[4] = "-eremount-ro";
	argv[5] = part_device;
	argv[6] = NULL;

	if (run_prg(argv))
		return SYSEXIT_MKFS;

	return 0;
}
Ejemplo n.º 3
0
static int clone_btrfs_subvol(struct mosaic *m, struct volume *from,
		const char *name, int clone_flags)
{
	char *argv[8];
	char vol[PATH_MAX], pvol[PATH_MAX];
	int i;

	/*
	 * FIXME: locate subvolumes in subdirectories
	 */

	// Make sure upper directories exist
	snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name);
	if (mkdir_p(vol, 0, 0700) < 0) {
		// error is printed by mkdir_p()
		return -1;
	}

	i = 0;
	argv[i++] = "btrfs";
	argv[i++] = "subvolume";
	argv[i++] = "snapshot";
	snprintf(pvol, sizeof(pvol), "%s/%s", m->m_loc, from->t_name);
	argv[i++] = pvol;
	snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name);
	argv[i++] = vol;
	argv[i++] = NULL;
	if (run_prg(argv))
		return -1;

	return 0;
}
Ejemplo n.º 4
0
static int new_btrfs_subvol(struct mosaic *m, const char *name,
		unsigned long size_in_blocks, int make_flags)
{
	char *argv[8];
	char vol[PATH_MAX];
	int i;

	if (!(make_flags & NEW_VOL_WITH_FS))
		return -1;

	/*
	 * FIXME: locate this volume's subvolumes in subdirectories
	 * FIXME: qgroups
	 */

	// Make sure upper directories exist
	snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name);
	if (mkdir_p(vol, 0, 0700) < 0) {
		// error is printed by mkdir_p()
		return -1;
	}

	i = 0;
	argv[i++] = "btrfs";
	argv[i++] = "subvolume";
	argv[i++] = "create";
	snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name);
	argv[i++] = vol;
	argv[i++] = NULL;
	if (run_prg(argv))
		return -1;

	return 0;
}
Ejemplo n.º 5
0
static int drop_btrfs_subvol(struct mosaic *m, struct volume *t,
		int drop_flags)
{
	char *argv[8];
	char vol[PATH_MAX];
	const char *base = m->m_loc;
	int i, ret, dfd;

	/*
	 * FIXME: locate subvolumes in subdirectories
	 */
	i = 0;
	argv[i++] = "btrfs";
	argv[i++] = "subvolume";
	argv[i++] = "delete";
	snprintf(vol, sizeof(vol), "%s/%s", base, t->t_name);
	argv[i++] = vol;
	argv[i++] = NULL;
	if (run_prg(argv))
		return -1;

	// Remove all the non-empty parent directories up to base
	dfd = open(base, O_DIRECTORY);
	if (dfd < 0) {
		loge("%s: can't open %s: %m\n", __func__, base);
		return -1;
	}
	ret = rmdirat_r(dfd, base, t->t_name);
	close(dfd);

	return ret;
}
Ejemplo n.º 6
0
Archivo: fsutils.c Proyecto: grze/ploop
int create_gpt_partition(const char *device, off_t size, __u32 blocksize)
{
	unsigned long long start = blocksize;
	unsigned long long end = (size - blocksize) / blocksize * blocksize;
	char *argv[7];
	char s1[22], s2[22];

	if (size <= start + blocksize) {
		ploop_err(0, "Image size should be greater than %llu", start);
		return -1;
	}
	argv[0] = "parted";
	argv[1] = "-s";
	argv[2] = (char *)device;
	argv[3] = "mklabel gpt mkpart primary";
	snprintf(s1, sizeof(s1), "%llub", start << PLOOP1_SECTOR_LOG);
	argv[4] = s1;
	snprintf(s2, sizeof(s2), "%llub", (end << PLOOP1_SECTOR_LOG)-1);
	argv[5] = s2;
	argv[6] = NULL;

	if (run_prg(argv)) {
		ploop_err(0, "Failed to create partition");
		return -1;
	}

	return 0;
}
Ejemplo n.º 7
0
int partprobe(const char *device)
{
	char *argv[] = {"partprobe", (char *)device, NULL};

	if (run_prg(argv)) {
		ploop_err(0, "Failed to run partprobe %s", device);
		return SYSEXIT_SYS;
	}
	return 0;
}
Ejemplo n.º 8
0
int sgdisk_move_gpt_header(const char *device)
{
	char *argv[4];

	argv[0] = "sgdisk";
	argv[1] = "-e";
	argv[2] = (char *)device;
	argv[3] = NULL;

	if (run_prg(argv)) {
		ploop_err(0, "Failed to move GPT header to the end of the device");
		return SYSEXIT_SYS;
	}
	return 0;
}
Ejemplo n.º 9
0
int parted_mklabel_gpt(const char *device)
{
	char *argv[5];

	argv[0] = "parted";
	argv[1] = "-s";
	argv[2] = (char *)device;
	argv[3] = "mklabel gpt";
	argv[4] = NULL;

	if (run_prg(argv)) {
		ploop_err(0, "Failed to create GPT table");
		return SYSEXIT_SYS;
	}

	return 0;
}
Ejemplo n.º 10
0
int sgdisk_rmpart(const char *device, int part_num)
{
	char *argv[5];
	char s1[4];

	snprintf(s1, sizeof(s1), "%d", part_num);

	argv[0] = "sgdisk";
	argv[1] = "-d";
	argv[2] = s1;
	argv[3] = (char *)device;
	argv[4] = NULL;

	if (run_prg(argv)) {
		ploop_err(0, "Failed to delete partition %d", part_num);
		return SYSEXIT_SYS;
	}
	return 0;
}
Ejemplo n.º 11
0
void tune_fs(int balloonfd, const char *device, unsigned long long size_sec)
{
	unsigned long long reserved_blocks;
	struct statfs fs;
	char *argv[5];
	char buf[21];
	int ret;

	if (fstatfs(balloonfd, &fs) != 0) {
		ploop_err(errno, "tune_fs: can't statfs %s", device);
		return;
	}

	reserved_blocks = size_sec / 100 * 5 * SECTOR_SIZE / fs.f_bsize;
	if (reserved_blocks == 0) {
		ploop_err(0, "Can't set reserved blocks for size %llu",
				size_sec);
		return;
	}

	/* First try to use kernel API, if available */
	ret = ioctl(balloonfd, EXT4_IOC_SET_RSV_BLOCKS, &reserved_blocks);
	if (!ret)
		return;
	if (errno != ENOTTY) {
		ploop_err(errno, "Can't set reserved blocks to %llu",
				reserved_blocks);
		return;
	}

	/* Fallback to manual modification via tune2fs */
	argv[0] = get_prog(tune2fs_progs);
	argv[1] = "-r";
	snprintf(buf, sizeof(buf), "%llu", reserved_blocks);
	argv[2] = buf;
	argv[3] = (char *)device;
	argv[4] = NULL;

	run_prg(argv);
}
Ejemplo n.º 12
0
/* Create partition
 * device - path to a device
 * part_num - partition number
 * part_start - beginning of the partition in sectors
 * part_end - end of the partition in sectors
 */
int sgdisk_mkpart(const char *device,
			int part_num,
			unsigned long long part_start,
			unsigned long long part_end)
{
	char *argv[5];
	char s1[100];

	snprintf(s1, sizeof(s1), "%d:%lluk:%lluk",
			part_num, part_start/2, part_end/2);

	argv[0] = "sgdisk";
	argv[1] = "-n";
	argv[2] = s1;
	argv[3] = (char *)device;
	argv[4] = NULL;

	if (run_prg(argv)) {
		ploop_err(0, "Failed to create partition %d", part_num);
		return SYSEXIT_SYS;
	}
	return 0;
}
Ejemplo n.º 13
0
int main(int argc, char **argv)
	{
	static char buf[1024];
	char **args = argv + 1;
	const char *sname = "fipstests.sh";
	ARGS arg;
	int xargc;
	char **xargv;
	int lineno = 0, badarg = 0;
	int nerr = 0, quiet = 0, verbose = 0;
	int rv;
	FILE *in = NULL;
#ifdef FIPS_ALGVS_MEMCHECK
	CRYPTO_malloc_debug_init();
	OPENSSL_init();
	CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
#endif

#if defined(_TMS320C6400_PLUS)
	SysInit();
#endif

#if (defined(__arm__) || defined(__aarch64__))
	if (*args && !strcmp(*args, "-noaccel"))
		{
		extern unsigned int OPENSSL_armcap_P;

		OPENSSL_armcap_P=0;
		args++;
		argc--;
		}
#endif
	if (*args && *args[0] != '-')
		{
		rv = run_prg(argc - 1, args);
#ifdef FIPS_ALGVS_MEMCHECK
		CRYPTO_mem_leaks_fp(stderr);
#endif
		return rv;
		}
	while (!badarg && *args && *args[0] == '-')
		{
		if (!strcmp(*args, "-script"))
			{
			if (args[1])
				{
				args++;
				sname = *args;
				}
			else
				badarg = 1;
			}
		else if (!strcmp(*args, "-quiet"))
			quiet = 1;
		else if (!strcmp(*args, "-verbose"))
			verbose = 1;
		else
			badarg = 1;
		args++;
		}

	if (badarg)
		{
		fprintf(stderr, "Error processing arguments\n");
		return 1;
		}

	in = fopen(sname, "r");
	if (!in)
		{
		fprintf(stderr, "Error opening script file \"%s\"\n", sname);
		return 1;
		}

	arg.data = NULL;
	arg.count = 0;

	while (fgets(buf, sizeof(buf), in))
		{
		lineno++;
		if (!chopup_args(&arg, buf, &xargc, &xargv))
			fprintf(stderr, "Error processing line %d\n", lineno);
		else
			{
			if (!quiet)
				{
				int i;
				int narg = verbose ? xargc : xargc - 2;
				printf("Running command line:");
				for (i = 0; i < narg; i++)
					printf(" %s", xargv[i]);
				printf("\n");
				}
			rv = run_prg(xargc, xargv);
			if (FIPS_module_mode())
				FIPS_module_mode_set(0, NULL);
			if (rv != 0)
				nerr++;
			if (rv == -100)
				fprintf(stderr, "ERROR: Command not found\n");
			else if (rv != 0)
				fprintf(stderr, "ERROR: returned %d\n", rv);
			else if (verbose)
				printf("\tCommand run successfully\n");
			}
		}

	if (!quiet)
		printf("Completed with %d errors\n", nerr);

	if (arg.data)
		OPENSSL_free(arg.data);

	fclose(in);
#ifdef FIPS_ALGVS_MEMCHECK
	CRYPTO_mem_leaks_fp(stderr);
#endif
	if (nerr == 0)
		return 0;
	return 1;
	}