[syslinux] [PATCH v2] btrfs: Fix logical to physical block address mapping

Paulo Alcantara pcacjr at zytor.com
Sun Dec 27 05:58:36 PST 2015


On Sun, 27 Dec 2015 07:45:07 -0500
Gene Cumm <gene.cumm at gmail.com> wrote:

> On Thu, Dec 24, 2015 at 8:58 AM, Paulo Alcantara <pcacjr at gmail.com>
> wrote:
> > The current btrfs support did not handled multiple stripes stored in
> > chunk items, hence skipping the physical addresses that were needed
> > to do the mapping.
> >
> > Besides, the chunk tree may contain DEV_ITEM keys which store
> > information on all of the underlying block devices, so we must skip
> > them instead of finishing lookup.
> >
> > The bug was reproduced with btrfs-progs v4.2.2.
> >
> > Cc: Gene Cumm <gene.cumm at gmail.com>
> > Cc: H. Peter Anvin <hpa at zytor.com>
> > Signed-off-by: Paulo Alcantara <pcacjr at zytor.com>
> > ---
> > v1 -> v2:
> >  * Do not set ignore_key multiple times. Set it before parsing chunk
> >    tree.
> > ---
> >  core/fs/btrfs/btrfs.c | 52
> > +++++++++++++++++++++++++++++++++++----------------
> > core/fs/btrfs/btrfs.h |  2 ++ 2 files changed, 38 insertions(+), 16
> > deletions(-)
> >
> > diff --git a/core/fs/btrfs/btrfs.c b/core/fs/btrfs/btrfs.c
> > index 53e1105..ca611db 100644
> > --- a/core/fs/btrfs/btrfs.c
> > +++ b/core/fs/btrfs/btrfs.c
> 
> > @@ -371,16 +386,21 @@ static void btrfs_read_chunk_tree(struct
> > fs_info *fs) search_tree(fs, bfs->sb.chunk_root, &search_key,
> > &path); do {
> >                         do {
> > +                               /* skip information about
> > underlying block
> > +                                * devices.
> > +                                */
> > +                               if
> > (!btrfs_comp_keys_type(&ignore_key,
> > +
> > &path.item.key))
> > +                                       goto skip_dev_item;
> 
> Why not just a continue rather than a goto to an empty label?

No real reason, actually. I'll fix that up and then send v3. Thanks.

Paulo

> 
> >                                 if
> > (btrfs_comp_keys_type(&search_key,
> > -
> > &path.item.key))
> > +
> > &path.item.key)) break;
> > +
> >                                 chunk = (struct btrfs_chunk
> > *)(path.data);
> > -                               /* insert to mapping table, ignore
> > stripes */
> > -                               item.logical = path.item.key.offset;
> > -                               item.length = chunk->length;
> > -                               item.devid = chunk->stripe.devid;
> > -                               item.physical =
> > chunk->stripe.offset;
> > -                               insert_map(fs, &item);
> > +                               insert_map(fs, &path.item.key,
> > chunk); +
> > +                       skip_dev_item:
> > +                               ;
> >                         } while (!next_slot(fs, &search_key,
> > &path)); if (btrfs_comp_keys_type(&search_key, &path.item.key))
> >                                 break;
> 



-- 
Paulo Alcantara, HP Inc.
Speaking for myself only.


More information about the Syslinux mailing list