#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <assert.h>
#include <endian.h>
#include <stddef.h>
#include "convert.h"
#define PMEMOBJ_MAX_LAYOUT ((size_t)1024)
#define OBJ_DSC_P_SIZE 2048
#define OBJ_DSC_P_UNUSED (OBJ_DSC_P_SIZE - PMEMOBJ_MAX_LAYOUT - 40)
struct pool_hdr {
char data[4096];
};
struct pmem_ops {
void *persist;
void *flush;
void *drain;
void *memcpy_persist;
void *memset_persist;
void *base;
size_t pool_size;
struct remote_ops {
void *read;
void *ctx;
uintptr_t base;
} remote;
};
struct palloc_heap {
struct pmem_ops p_ops;
struct heap_layout *layout;
struct heap_rt *rt;
uint64_t size;
uint64_t run_id;
void *base;
};
struct lane_descriptor {
unsigned runtime_nlanes;
unsigned next_lane_idx;
uint64_t *lane_locks;
struct lane *lane;
};
#define _POBJ_CL_SIZE 64
typedef union {
long long align;
char padding[_POBJ_CL_SIZE];
} PMEMmutex;
struct pmemobjpool {
struct pool_hdr hdr;
char layout[PMEMOBJ_MAX_LAYOUT];
uint64_t lanes_offset;
uint64_t nlanes;
uint64_t heap_offset;
uint64_t heap_size;
unsigned char unused[OBJ_DSC_P_UNUSED];
uint64_t checksum;
uint64_t root_offset;
uint64_t run_id;
uint64_t root_size;
uint64_t conversion_flags;
char pmem_reserved[512];
void *addr;
size_t size;
int is_pmem;
int rdonly;
struct palloc_heap heap;
struct lane_descriptor lanes_desc;
uint64_t uuid_lo;
int is_dev_dax;
void *ctl;
void *tx_postcommit_tasks;
void *set;
void *replica;
void *redo;
void *persist_local;
void *flush_local;
void *drain_local;
void *memcpy_persist_local;
void *memset_persist_local;
struct pmem_ops p_ops;
PMEMmutex rootlock;
int is_master_replica;
int has_remote_replicas;
void *rpp;
uintptr_t remote_base;
char *node_addr;
char *pool_desc;
void *persist_remote;
int vg_boot;
int tx_debug_skip_expensive_checks;
void *tx_params;
char unused2[1028];
};
struct allocation_header_legacy {
uint8_t unused[8];
uint64_t size;
uint8_t unused2[32];
uint64_t root_size;
uint64_t type_num;
};
static void
obj_root_restore_size(struct pmemobjpool *pop)
{
#define LEGACY_INTERNAL_OBJECT_MASK ((1ULL) << 63)
if (pop->root_offset == 0)
return;
uint64_t off = pop->root_offset;
off -= sizeof(struct allocation_header_legacy);
struct allocation_header_legacy *hdr =
(struct allocation_header_legacy *)((uintptr_t)pop + off);
pop->root_size = hdr->root_size & ~LEGACY_INTERNAL_OBJECT_MASK;
}
#define CONVERSION_FLAG_OLD_SET_CACHE ((1ULL) << 0)
int
convert_v3_v4(void *psf, void *addr)
{
struct pmemobjpool *pop = addr;
assert(sizeof(struct pmemobjpool) == 8192);
pop->conversion_flags = CONVERSION_FLAG_OLD_SET_CACHE;
memset(pop->pmem_reserved, 0, sizeof(pop->pmem_reserved));
obj_root_restore_size(pop);
pmempool_convert_persist(psf, pop, sizeof(*pop));
return 0;
}