[sheepdog] [PATCH] sheep: fix vid wrap around

福本 佳史 fukumoto.yoshifumi at lab.ntt.co.jp
Mon Feb 2 09:15:07 CET 2015


Sorry, this patch didn't work well.
Please ignore this patch.
But there is problem on vid wrap around.

> From: fukumoto.yoshifumi at lab.ntt.co.jp
> To: sheepdog at lists.wpkg.org
> Cc: FUKUMOTO Yoshifumi <fukumoto.yoshifumi at lab.ntt.co.jp>
> Subject: [sheepdog] [PATCH] sheep: fix vid wrap around
> Message-ID:
> 	<1422855383-1231-1-git-send-email-fukumoto.yoshifumi at lab.ntt.co.jp>
>
> From: FUKUMOTO Yoshifumi <fukumoto.yoshifumi at lab.ntt.co.jp>
>
> If a vid of a vdi reaches the max number of vid space, creating the snapshot of
> the vdi fails.
>
> Example:
> $ dog vdi create 00471718 1G
> $ dog vdi snapshot 00471718   (repeat 7 times)
> failed to read a response
> Failed to create snapshot for 00471718: I/O error
>
> This patch fixes the problem.
>
> Signed-off-by: FUKUMOTO Yoshifumi <fukumoto.yoshifumi at lab.ntt.co.jp>
> ---
>  sheep/vdi.c | 17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/sheep/vdi.c b/sheep/vdi.c
> index 2889df6..4113a4f 100644
> --- a/sheep/vdi.c
> +++ b/sheep/vdi.c
> @@ -1398,15 +1398,20 @@ static int fill_vdi_info_range(uint32_t left, uint32_t right,
>  	uint32_t i;
>  	const char *name = iocb->name;
>
> +	if (!right)
> +		return SD_RES_NO_VDI;
>  	inode = malloc(SD_INODE_HEADER_SIZE);
>  	if (!inode) {
>  		sd_err("failed to allocate memory");
>  		ret = SD_RES_NO_MEM;
>  		goto out;
>  	}
> -	for (i = right - 1; i && i >= left; i--) {
> -		if (!test_bit(i, sys->vdi_inuse))
> +	for (i = right - 1; i >= left; i--) {
> +		if (!test_bit(i, sys->vdi_inuse)) {
> +			if (!i)
> +				break;
>  			continue;
> +		}
>
>  		ret = sd_read_object(vid_to_vdi_oid(i), (char *)inode,
>  				     SD_INODE_HEADER_SIZE, 0);
> @@ -1420,9 +1425,13 @@ static int fill_vdi_info_range(uint32_t left, uint32_t right,
>  				/* Read, delete, clone on snapshots */
>  				if (!vdi_is_snapshot(inode)) {
>  					vdi_found = true;
> +					if (!i)
> +						break;
>  					continue;
>  				}
>  				if (!vdi_tag_match(iocb, inode))
> +					if (!i)
> +						break;
>  					continue;
>  			} else {
>  				/*
> @@ -1438,6 +1447,8 @@ static int fill_vdi_info_range(uint32_t left, uint32_t right,
>  			info->vid = inode->vdi_id;
>  			goto out;
>  		}
> +		if (!i)
> +			break;
>  	}
>  	ret = vdi_found ? SD_RES_NO_TAG : SD_RES_NO_VDI;
>  out:
> @@ -1458,7 +1469,7 @@ static int fill_vdi_info(unsigned long left, unsigned long right,
>  	switch (ret) {
>  	case SD_RES_NO_VDI:
>  	case SD_RES_NO_TAG:
> -		ret = fill_vdi_info_range(left, SD_NR_VDIS - 1, iocb, info);
> +		ret = fill_vdi_info_range(left, SD_NR_VDIS, iocb, info);
>  		break;
>  	default:
>  		break;
> -- 1.9.1





More information about the sheepdog mailing list