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; }
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; }
bool is_erasure_oid(uint64_t oid, uint8_t policy) { if (is_vdi_obj(oid)) return false; if (policy == 0) return false; return true; }
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); }
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; }
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; }
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; }
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; }
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); }
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; }
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; }