On Wed, Jul 30, 2014 at 04:24:37PM +0900, Hitoshi Mitake wrote:
> Current sheepdog doesn't support vdi locking. This patch and
> succeeding ones revive the feature. With this feature, more than two
> clients (including QEMU and tgt) are not allowed to open same VDI at
> the same time.
> 
> Cc: Fabian Zimmermann <dev....@gmail.com>
> Cc: Valerio Pachera <siri...@gmail.com>
> Signed-off-by: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp>
> ---
>  sheep/ops.c        | 41 ++++++++++++++++++++++----
>  sheep/sheep_priv.h |  3 ++
>  sheep/vdi.c        | 86 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 125 insertions(+), 5 deletions(-)
> 
> diff --git a/sheep/ops.c b/sheep/ops.c
> index 58ff397..7ca06d6 100644
> --- a/sheep/ops.c
> +++ b/sheep/ops.c
> @@ -1306,6 +1306,34 @@ static int local_repair_replica(struct request *req)
>       return ret;
>  }
>  
> +static int cluster_lock_vdi(const struct sd_req *req, struct sd_rsp *rsp,
> +                         void *data, const struct sd_node *sender)
> +{
> +     uint32_t vid = rsp->vdi.vdi_id;
> +
> +     sd_info("node: %s is locking VDI: %"PRIx32, node_to_str(sender), vid);
> +
> +     if (!lock_vdi(vid, &sender->nid)) {
> +             sd_err("locking %"PRIx32 "failed", vid);
> +             return SD_RES_VDI_NOT_LOCKED;
> +     }
> +
> +     return SD_RES_SUCCESS;
> +}
> +
> +static int cluster_release_vdi_main(const struct sd_req *req,
> +                                 struct sd_rsp *rsp, void *data,
> +                                 const struct sd_node *sender)
> +{
> +     uint32_t vid = req->vdi.base_vdi_id;
> +
> +     sd_info("node: %s is unlocking VDI: %"PRIx32, node_to_str(sender), vid);
> +
> +     unlock_vdi(vid, &sender->nid);
> +
> +     return SD_RES_SUCCESS;
> +}
> +
>  static struct sd_op_template sd_ops[] = {
>  
>       /* cluster operations */
> @@ -1400,6 +1428,14 @@ static struct sd_op_template sd_ops[] = {
>               .name = "LOCK_VDI",
>               .type = SD_OP_TYPE_CLUSTER,
>               .process_work = cluster_get_vdi_info,
> +             .process_main = cluster_lock_vdi,
> +     },
> +
> +     [SD_OP_RELEASE_VDI] = {
> +             .name = "RELEASE_VDI",
> +             .type = SD_OP_TYPE_CLUSTER,
> +             .process_work = local_release_vdi,
> +             .process_main = cluster_release_vdi_main,
>       },
>  
>       [SD_OP_REWEIGHT] = {
> @@ -1438,11 +1474,6 @@ static struct sd_op_template sd_ops[] = {
>       },
>  
>       /* local operations */
> -     [SD_OP_RELEASE_VDI] = {
> -             .name = "RELEASE_VDI",
> -             .type = SD_OP_TYPE_LOCAL,
> -             .process_work = local_release_vdi,
> -     },
>  
>       [SD_OP_GET_STORE_LIST] = {
>               .name = "GET_STORE_LIST",
> diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
> index b0156ee..74aa08e 100644
> --- a/sheep/sheep_priv.h
> +++ b/sheep/sheep_priv.h
> @@ -345,6 +345,9 @@ int sd_delete_vdi(const char *name);
>  int sd_lookup_vdi(const char *name, uint32_t *vid);
>  int sd_create_hyper_volume(const char *name, uint32_t *vdi_id);
>  
> +bool lock_vdi(uint32_t vid, const struct node_id *owner);
> +bool unlock_vdi(uint32_t vid, const struct node_id *owner);
> +

It would be better to name them as 'vdi_{lock,unlock}' like other vdi helpers
vdi_create. Here prefix vdi_ works as a namespace for functions.

Thanks
Yuan
-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to