Exemplo n.º 1
0
static int init_sys_vdi_bitmap(char *path)
{
    DIR *dir;
    struct dirent *dent;

    dir = opendir(path);
    if (!dir) {
        vprintf(SDOG_ERR, "failed to open the working directory: %m\n");
        return -1;
    }

    vprintf(SDOG_INFO, "found the working directory %s\n", path);
    while ((dent = readdir(dir))) {
        uint64_t oid;

        if (!strcmp(dent->d_name, "."))
            continue;

        oid = strtoull(dent->d_name, NULL, 16);
        if (oid == 0 || oid == ULLONG_MAX)
            continue;

        if (!is_vdi_obj(oid))
            continue;

        vprintf(SDOG_DEBUG, "found the VDI object %" PRIx64 "\n", oid);

        set_bit(oid_to_vid(oid), sys->vdi_inuse);
    }
    closedir(dir);

    return 0;
}
Exemplo n.º 2
0
static int farm_open(uint64_t oid, struct siocb *iocb, int create)
{
    struct strbuf buf = STRBUF_INIT;
    int ret = SD_RES_SUCCESS, fd;
    int flags = def_open_flags;

    if (iocb->epoch < sys->epoch)
        goto out;

    if (is_vdi_obj(oid))
        flags &= ~O_DIRECT;

    if (create)
        flags |= O_CREAT | O_TRUNC;

    strbuf_addstr(&buf, obj_path);
    strbuf_addf(&buf, "%016" PRIx64, oid);
    fd = open(buf.buf, flags, def_fmode);
    if (fd < 0) {
        ret = err_to_sderr(oid, errno);
        goto out;
    }
    iocb->fd = fd;
    ret = SD_RES_SUCCESS;
    if (!(iocb->flags & SD_FLAG_CMD_COW) && create) {
        ret = prealloc(fd, iocb->length);
        if (ret != SD_RES_SUCCESS)
            close(fd);
    }
out:
    strbuf_release(&buf);
    return ret;
}
Exemplo n.º 3
0
bool is_erasure_oid(uint64_t oid, uint8_t policy)
{
	if (is_vdi_obj(oid))
		return false;
	if (policy == 0)
		return false;
	return true;
}
Exemplo n.º 4
0
size_t get_store_objsize(uint8_t copy_policy, uint64_t oid)
{
	if (is_vdi_obj(oid))
		return SD_INODE_SIZE;
	if (copy_policy != 0) {
		int d;

		ec_policy_to_dp(copy_policy, &d, NULL);
		return SD_DATA_OBJ_SIZE / d;
	}
	return get_objsize(oid);
}
Exemplo n.º 5
0
static int init_objlist_and_vdi_bitmap(uint64_t oid, char *wd, uint32_t epoch,
				       void *arg)
{
	int ret;
	objlist_cache_insert(oid);

	if (is_vdi_obj(oid)) {
		sd_debug("found the VDI object %" PRIx64, oid);
		ret = init_vdi_state(oid, wd, epoch);
		if (ret != SD_RES_SUCCESS)
			return ret;
	}
	return SD_RES_SUCCESS;
}
Exemplo n.º 6
0
static int init_objlist_and_vdi_bitmap(uint64_t oid, void *arg)
{
	int ret;
	objlist_cache_insert(oid);

	if (is_vdi_obj(oid)) {
		vprintf(SDOG_DEBUG, "found the VDI object %" PRIx64 "\n", oid);
		set_bit(oid_to_vid(oid), sys->vdi_inuse);
		ret = init_vdi_copy_number(oid);
		if (ret != SD_RES_SUCCESS)
			return ret;
	}
	return SD_RES_SUCCESS;
}
Exemplo n.º 7
0
static int init_objlist_and_vdi_bitmap(uint64_t oid, const char *wd,
				       uint32_t epoch, uint8_t ec_index,
				       struct vnode_info *vinfo,
				       void *arg)
{
	int ret = SD_RES_SUCCESS;
	objlist_cache_insert(oid);

	if (is_vdi_obj(oid)) {
		sd_debug("found the VDI object %" PRIx64" epoch %"PRIu32
			 " at %s", oid, epoch, wd);
		atomic_set_bit(oid_to_vid(oid), sys->vdi_inuse);
	}
	return ret;
}
Exemplo n.º 8
0
static int init_objlist_and_vdi_bitmap(uint64_t oid, const char *wd,
				       uint32_t epoch, uint8_t ec_index,
				       struct vnode_info *vinfo,
				       void *arg)
{
	int ret;
	objlist_cache_insert(oid);

	if (is_vdi_obj(oid)) {
		sd_debug("found the VDI object %" PRIx64" epoch %"PRIu32
			 " at %s", oid, epoch, wd);
		ret = init_vdi_state(oid, wd, epoch);
		if (ret != SD_RES_SUCCESS)
			return ret;
	}
	return SD_RES_SUCCESS;
}
Exemplo n.º 9
0
size_t get_store_objsize(uint8_t copy_policy, uint8_t block_size_shift,
			 uint64_t oid)
{
	if (is_vdi_obj(oid))
		return SD_INODE_SIZE;
	if (is_vdi_btree_obj(oid))
		return SD_INODE_DATA_INDEX_SIZE;

	uint32_t object_size = (UINT32_C(1) << block_size_shift);
	if (copy_policy != 0) {
		int d;

		ec_policy_to_dp(copy_policy, &d, NULL);
		return object_size / d;
	}
	return get_objsize(oid, object_size);
}
Exemplo n.º 10
0
static int farm_atomic_put(uint64_t oid, struct siocb *iocb)
{
    char path[PATH_MAX], tmp_path[PATH_MAX];
    int flags = def_open_flags | O_CREAT;
    int ret = SD_RES_EIO, fd;
    uint32_t len = iocb->length;

    snprintf(path, sizeof(path), "%s%016" PRIx64, obj_path, oid);
    snprintf(tmp_path, sizeof(tmp_path), "%s%016" PRIx64 ".tmp",
             obj_path, oid);

    if (is_vdi_obj(oid))
        flags &= ~O_DIRECT;
    fd = open(tmp_path, flags, def_fmode);
    if (fd < 0) {
        eprintf("failed to open %s: %m\n", tmp_path);
        goto out;
    }

    ret = xwrite(fd, iocb->buf, len);
    if (ret != len) {
        eprintf("failed to write object. %m\n");
        ret = SD_RES_EIO;
        goto out_close;
    }

    ret = rename(tmp_path, path);
    if (ret < 0) {
        eprintf("failed to rename %s to %s: %m\n", tmp_path, path);
        ret = SD_RES_EIO;
        goto out_close;
    }
    dprintf("%"PRIx64"\n", oid);
    trunk_get_entry(oid);
    ret = SD_RES_SUCCESS;
out_close:
    close(fd);
out:
    return ret;
}
Exemplo n.º 11
0
bool is_erasure_oid(uint64_t oid)
{
	return !is_vdi_obj(oid) && !is_vdi_btree_obj(oid) &&
		!is_ledger_object(oid) &&
		get_vdi_copy_policy(oid_to_vid(oid)) > 0;
}