[sheepdog] [PATCH] sheep: handle VID overflow correctly
Hitoshi Mitake
mitake.hitoshi at lab.ntt.co.jp
Tue Feb 3 08:09:18 CET 2015
At Tue, 3 Feb 2015 11:55:34 +0800,
Liu Yuan wrote:
>
> On Mon, Feb 02, 2015 at 06:18:52PM +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
> >
> > (The situation can be reproduced with the below sequence:
> > $ dog vdi create 00471718 1G
> > $ dog vdi snapshot 00471718 (repeat 7 times) )
> >
> > In this case, new VID becomes 0x000000. Current fill_vdi_info() and
> > fill_vdi_info_range() cannot handle this case. It comes from the below
> > two reasons:
> > 1. Recent change 00ecfb24ee46f2 introduced a bug which breaks
> > fill_vdi_info_range() in a case of underflow of its variable i.
>
> I don't yet look close into this problem, but from this description, should we
> fix the bug somewhere else? because
>
> 1. fill_vdi_info_range() runs well in the past, so we'd better avoid to modify
> it to fix the bug introduced by other patch(es).
>
> 2. You mentioned it was introduced by 00ecfb24ee46f2, so we might better fix
> 00ecfb24ee46f2.
>
> It would be great if you can elaberate the bug, what it is, why breaks
> fill_vdi_info_range() and if modify fill_vdi_info_range() is the only way to
> fix the problem.
The problem is related to --no-share for snapshot, its design seems to
have a problem. I'll redesign it and refine this patch as a part of
the rework.
Thanks,
Hitoshi
>
> > 2. fill_vdi_info_range() assumes that its parameters, left and right,
> > are obtained from get_vdi_bitmap_range(). get_vdi_bitmap_range()
> > obtains left and right which mean the range of existing VIDs is
> > [left, right), in other words, [left, right - 1]. So
> > fill_vdi_info_range() starts checking from right - 1 to left. But
> > it means fill_vdi_info_range() cannot check VID 0xffffff even VID
> > overflow happens. So this patch lets fill_vdi_info_range() check
> > from right to left, and also change callers' manner (it passes left
> > and right - 1 in ordinal cases).
> >
> > Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> > ---
> > sheep/vdi.c | 30 +++++++++++++++++++++++-------
> > 1 file changed, 23 insertions(+), 7 deletions(-)
> >
> > diff --git a/sheep/vdi.c b/sheep/vdi.c
> > index 2889df6..3d14ccf 100644
> > --- a/sheep/vdi.c
> > +++ b/sheep/vdi.c
> > @@ -1404,9 +1404,11 @@ static int fill_vdi_info_range(uint32_t left, uint32_t right,
> > ret = SD_RES_NO_MEM;
> > goto out;
> > }
> > - for (i = right - 1; i && i >= left; i--) {
> > +
> > + i = right;
> > + while (i >= left) {
> > if (!test_bit(i, sys->vdi_inuse))
> > - continue;
> > + goto next;
> >
> > ret = sd_read_object(vid_to_vdi_oid(i), (char *)inode,
> > SD_INODE_HEADER_SIZE, 0);
> > @@ -1420,10 +1422,10 @@ 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;
> > - continue;
> > + goto next;
> > }
> > if (!vdi_tag_match(iocb, inode))
> > - continue;
> > + goto next;
> > } else {
> > /*
> > * Rollback & snap create, read, delete on
> > @@ -1438,6 +1440,10 @@ static int fill_vdi_info_range(uint32_t left, uint32_t right,
> > info->vid = inode->vdi_id;
> > goto out;
> > }
> > +next:
> > + if (!i)
> > + break;
> > + i--;
>
> I don't have the whole picture yet, but just for this fragment, we change the
> for loop into goto, is not so good for code clarity.
>
> Thanks
> Yuan
>
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> https://lists.wpkg.org/mailman/listinfo/sheepdog
More information about the sheepdog
mailing list