We need to mask VDI_BIT to calculate data object id Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- block/sheepdog.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index a5d335b..18ecd22 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -327,7 +327,7 @@ static inline int after(uint32_t seq1, uint32_t seq2) static inline int is_data_obj_writeable(struct sd_inode *inode, unsigned int idx) { - return (inode->oid >> VDI_SPACE_SHIFT) == + return ((inode->oid & ~VDI_BIT) >> VDI_SPACE_SHIFT) == (inode->data_oid[idx] >> VDI_SPACE_SHIFT); } @@ -336,6 +336,11 @@ static inline int is_data_obj(uint64_t oid) return !(VDI_BIT & oid); } +static inline uint64_t to_data_oid(uint64_t vdi_oid, unsigned int idx) +{ + return (vdi_oid & ~VDI_BIT) | idx; +} + /* * 64 bit FNV-1a non-zero initial basis */ @@ -1411,12 +1416,12 @@ static void sd_write_bh_cb(void *p) create = 1; dprintf("update ino (%" PRIu64") %" PRIu64 " %" PRIu64 " %" PRIu64 "\n", - inode->oid, oid, inode->oid + idx, idx); + inode->oid, oid, to_data_oid(inode->oid, idx), idx); if (oid && !is_data_obj_writeable(inode, idx)) { old_oid = oid; flags = SD_FLAG_CMD_COW; } - oid = inode->oid + idx; + oid = to_data_oid(inode->oid, idx); acb->oid[i] = oid; dprintf("new oid %lx\n", acb->oid[i]); } -- 1.5.6.5 |