[sheepdog] [PATCH v3] dog: allow vdi snapshot without snapshot tag

Ruoyu liangry at ucweb.com
Fri Sep 19 10:54:37 CEST 2014


Reviewed-by: Ruoyu <liangry at ucweb.com>

On 2014年09月19日 16:00, Hitoshi Mitake wrote:
> The commit a21bf27906b23448b92cca9943e1019105ffac2f makes
> $ dog vdi snapshot <vdi>
> fail if the <vdi> is an ordinal vdi because newly created VDIs have
> snapid 0. This patch avoids the failure with checking the VDI is
> snapshot or not.
>
> Cc: Ruoyu <liangry at ucweb.com>
> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> ---
>   dog/vdi.c | 36 +++++++++++++++++++++++++-----------
>   1 file changed, 25 insertions(+), 11 deletions(-)
>
> v3: rework switch case for handling error code of find_vdi_name()
>
> v2: correct vdi existence checking
>
> diff --git a/dog/vdi.c b/dog/vdi.c
> index fa6130e..c541706 100644
> --- a/dog/vdi.c
> +++ b/dog/vdi.c
> @@ -567,6 +567,7 @@ static int vdi_snapshot(int argc, char **argv)
>   	int vs_count = 0;
>   	struct node_id owners[SD_MAX_COPIES];
>   	int nr_owners = 0, nr_issued_prevent_inode_update = 0;
> +	bool fail_if_snapshot = false;
>   
>   	if (vdi_cmd_data.snapshot_id != 0) {
>   		sd_err("Please specify a non-integer value for "
> @@ -577,23 +578,36 @@ static int vdi_snapshot(int argc, char **argv)
>   	ret = find_vdi_name(vdiname, vdi_cmd_data.snapshot_id,
>   			vdi_cmd_data.snapshot_tag, &vid);
>   	switch (ret) {
> -	case SD_RES_NO_VDI:
> -		sd_err("Failed to create snapshot for %s: %s",
> -			vdiname, sd_strerror(ret));
> -		return EXIT_FAILURE;
>   	case SD_RES_NO_TAG:
>   		break;
> +	case SD_RES_SUCCESS:
> +		fail_if_snapshot = true;
> +		break;
>   	default:
> -		sd_err("Failed to create snapshot for %s, maybe "
> -			"snapshot id (%d) or tag (%s) is existed",
> -			vdiname, vdi_cmd_data.snapshot_id,
> -			vdi_cmd_data.snapshot_tag);
> +		sd_err("Failed to create snapshot for %s: %s",
> +			vdiname, sd_strerror(ret));
>   		return EXIT_FAILURE;
>   	}
>   
> -	ret = read_vdi_obj(vdiname, 0, "", &vid, inode, SD_INODE_HEADER_SIZE);
> -	if (ret != EXIT_SUCCESS)
> -		return ret;
> +	if (fail_if_snapshot) {
> +		ret = dog_read_object(vid_to_vdi_oid(vid), inode,
> +				      SD_INODE_HEADER_SIZE, 0, true);
> +		if (ret != EXIT_SUCCESS)
> +			return ret;
> +
> +		if (vdi_is_snapshot(inode)) {
> +			sd_err("Failed to create snapshot for %s, maybe "
> +			       "snapshot id (%d) or tag (%s) is existed",
> +			       vdiname, vdi_cmd_data.snapshot_id,
> +			       vdi_cmd_data.snapshot_tag);
> +			return EXIT_FAILURE;
> +		}
> +	} else {
> +		ret = read_vdi_obj(vdiname, 0, "", &vid, inode,
> +				   SD_INODE_HEADER_SIZE);
> +		if (ret != EXIT_SUCCESS)
> +			return ret;
> +	}
>   
>   	if (inode->store_policy) {
>   		sd_err("creating a snapshot of hypervolume is not supported");





More information about the sheepdog mailing list