コード例 #1
0
ファイル: md.c プロジェクト: janpychou/sheepdog
static void unplug_disk(int idx)
{
	int i;

	/*
	 * We need to keep last disk path to generate EIO when all disks are
	 * broken
	 */
	for (i = idx; i < md_nr_disks - 1; i++)
		md_disks[i] = md_disks[i + 1];
	md_nr_disks--;
	sys->disk_space = md_init_space();
	if (md_nr_disks > 0)
		kick_recover();
}
コード例 #2
0
ファイル: store.c プロジェクト: zplambert/sheepdog
int init_disk_space(const char *base_path)
{
	int ret = SD_RES_SUCCESS;
	uint64_t space_size = 0, mds;
	struct statvfs fs;

	if (sys->gateway_only)
		goto out;

	/* We need to init md even we don't need to update sapce */
	mds = md_init_space();

	/* If it is restarted */
	ret = get_node_space(&space_size);
	if (space_size != 0) {
		sys->disk_space = space_size;
		goto out;
	}

	/* User has specified the space at startup */
	if (sys->disk_space) {
		ret = set_node_space(sys->disk_space);
		goto out;
	}

	if (mds) {
		sys->disk_space = mds;
	} else {
		ret = statvfs(base_path, &fs);
		if (ret < 0) {
			sd_dprintf("get disk space failed %m");
			ret = SD_RES_EIO;
			goto out;
		}
		sys->disk_space = (uint64_t)fs.f_frsize * fs.f_bfree;
	}

	ret = set_node_space(sys->disk_space);
out:
	sd_dprintf("disk free space is %" PRIu64, sys->disk_space);
	return ret;
}