[sheepdog] [PATCH v3 1/3] sheep: handle VID overflow correctly
Liu Yuan
namei.unix at gmail.com
Fri Feb 27 09:51:21 CET 2015
On Fri, Feb 27, 2015 at 01:46:14PM +0900, Hitoshi Mitake wrote:
> Current sheep cannot handle a case like this:
> 1. iterate snapshot creation and let latest working VDI have VID 0xffffff
> 2. create one more snapshot
>
> This problem comes from invalid usage of find_next_zero_bit() of sheep.
> Current sheep checks its VID bitmap with find_next_zero_bit(). But the
> function has a subtle point we must care about. If we check a bitmap
> and whose right most bit is 1, it returns a number of the bit though
> the bit is not 0. It means
> /* the right most bit of sys->vdi_inuse is 1*/
> find_next_zero_bit(sys->vdi_inuse, SD_NR_VDIS, 0);
> will return SD_NR_VDIS - 1 (not SD_NR_VDIS, of course). So it is not
> possible to check the right most bit is used or not by simply calling
> find_next_zero_bit(). So the existing code cannot handle the case of
> overflow.
I did a small test, it looks like following:
int main()
{
long i = 0b111111;
printf("%lu\n", find_next_zero_bit(&i, 6, 5));
printf("%lu\n", find_next_zero_bit(&i, 6, 0));
}
It mimics what you described. But the result is
yliu at ubuntu-trusty:~/sheepdog$ ./a.out
6
6
which means find_next_zero_bit does return SD_NR_VDIS in your case. Am I missing
anything?
Thanks
Yuan
More information about the sheepdog
mailing list