We need to mask VDI_BIT to calculate data object id

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 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

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to