[sheepdog] [PATCH v2 2/2] sheep: clear child vdi for deletion of clone

Robin Dong robin.k.dong at gmail.com
Mon Feb 17 10:06:25 CET 2014


Reviewed-by: Robin Dong <sanbai at taobao.com>


2014-02-17 13:39 GMT+08:00 Liu Yuan <namei.unix at gmail.com>:

> This will fix a bug that after deletion of clones, we fail to create clones
> with the snapshot that we previousy cloned.
>
> Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> ---
>  sheep/vdi.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 47 insertions(+)
>
> diff --git a/sheep/vdi.c b/sheep/vdi.c
> index f4c589a..2da82a2 100644
> --- a/sheep/vdi.c
> +++ b/sheep/vdi.c
> @@ -1028,6 +1028,51 @@ static uint64_t get_vdi_root(uint32_t vid, bool
> *cloned)
>         return vid;
>  }
>
> +static void clear_parent_child_vdi(uint32_t vid)
> +{
> +       struct sd_inode * inode = xmalloc(SD_INODE_HEADER_SIZE);
> +       uint32_t pvid, i;
> +       int ret;
> +
> +       ret = read_backend_object(vid_to_vdi_oid(vid), (char *)inode,
> +                                 SD_INODE_HEADER_SIZE, 0);
> +       if (ret != SD_RES_SUCCESS) {
> +               sd_err("failed to read inode %"PRIx32, vid);
> +               goto out;
> +       }
> +
> +       pvid = inode->parent_vdi_id;
> +       if (!pvid)
> +               goto out;
> +       ret = read_backend_object(vid_to_vdi_oid(pvid), (char *)inode,
> +                                 SD_INODE_HEADER_SIZE, 0);
> +       if (ret != SD_RES_SUCCESS) {
> +               sd_err("failed to read parent inode %"PRIx32, pvid);
> +               goto out;
> +       }
> +
> +       for (i = 0; i < MAX_CHILDREN; i++)
> +               if (inode->child_vdi_id[i] == vid) {
> +                       inode->child_vdi_id[i] = 0;
> +                       break;
> +               }
> +
> +       if (i == MAX_CHILDREN) {
> +               sd_info("failed to find child %"PRIx32, vid);
> +               goto out;
> +       }
> +
> +       ret = sd_write_object(vid_to_vdi_oid(pvid), (char *)inode,
> +                             SD_INODE_HEADER_SIZE, 0, false);
> +       if (ret != SD_RES_SUCCESS) {
> +               sd_err("failed to update parent %"PRIx32, pvid);
> +               goto out;
> +       }
> +       sd_debug("parent %"PRIx32, pvid);
> +out:
> +       free(inode);
> +}
> +
>  static int start_deletion(struct request *req, uint32_t vid)
>  {
>         struct deletion_work *dw = NULL;
> @@ -1052,6 +1097,8 @@ static int start_deletion(struct request *req,
> uint32_t vid)
>                 goto out;
>         }
>
> +       clear_parent_child_vdi(vid);
> +
>         ret = fill_delete_vid_array(dw, root_vid);
>         if (ret < 0) {
>                 ret = SD_RES_EIO;
> --
> 1.8.1.2
>
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog
>



-- 
--
Best Regard
Robin Dong
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.wpkg.org/pipermail/sheepdog/attachments/20140217/fd1ea598/attachment-0004.html>


More information about the sheepdog mailing list