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

Robin Dong robin.k.dong at gmail.com
Fri Feb 14 07:58:49 CET 2014


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


2014-02-14 14:20 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 | 43 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 43 insertions(+)
>
> diff --git a/sheep/vdi.c b/sheep/vdi.c
> index f4c589a..c627d26 100644
> --- a/sheep/vdi.c
> +++ b/sheep/vdi.c
> @@ -1028,6 +1028,48 @@ 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;
> +       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;
> +       }
> +out:
> +       free(inode);
> +}
> +
>  static int start_deletion(struct request *req, uint32_t vid)
>  {
>         struct deletion_work *dw = NULL;
> @@ -1066,6 +1108,7 @@ static int start_deletion(struct request *req,
> uint32_t vid)
>                 if (cloned) {
>                         dw->delete_vid_array[0] = vid;
>                         dw->delete_vid_count = 1;
> +                       clear_parent_child_vdi(vid);
>                 } else {
>                         sd_debug("snapshot chain has valid vdi, just mark
> vdi %"
>                                  PRIx32 " as deleted.", dw->target_vid);
> --
> 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/20140214/4d99f908/attachment.html>


More information about the sheepdog mailing list