• Qu Wenruo's avatar
    btrfs: backref: introduce the skeleton of btrfs_backref_iter · a37f232b
    Qu Wenruo authored
    Due to the complex nature of btrfs extent tree, when we want to iterate
    all backrefs of one extent, this involves quite a lot of work, like
    searching the EXTENT_ITEM/METADATA_ITEM, iteration through inline and keyed
    backrefs.
    
    Normally this would result in a complex code, something like:
    
      btrfs_search_slot()
      /* Ensure we are at EXTENT_ITEM/METADATA_ITEM */
      while (1) {	/* Loop for extent tree items */
    	while (ptr < end) { /* Loop for inlined items */
    		/* Real work here */
    	}
      next:
      	ret = btrfs_next_item()
    	/* Ensure we're still at keyed item for specified bytenr */
      }
    
    The idea of btrfs_backref_iter is to avoid such complex and hard to
    read code structure, but something like the following:
    
      iter = btrfs_backref_iter_alloc();
      ret = btrfs_backref_iter_start(iter, bytenr);
      if (ret < 0)
    	goto out;
      for (; ; ret = btrfs_backref_iter_next(iter)) {
    	/* Real work here */
      }
      out:
      btrfs_backref_iter_free(iter);
    
    This patch is just the skeleton + btrfs_backref_iter_start() code.
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    a37f232b
backref.c 63 KB