BTRFS_UUID_SIZE);
ret = btrfs_setup_all_roots(fs_info, root_tree_bytenr, flags);
- if (ret)
+ if (ret && !(flags & __OPEN_CTREEE_RETURN_CHUNK_ROOT))
goto out_chunk;
return fs_info;
info = open_ctree_fs_info(filename, sb_bytenr, 0, flags);
if (!info)
return NULL;
+ if (flags & __OPEN_CTREEE_RETURN_CHUNK_ROOT)
+ return info->chunk_root;
return info->fs_root;
}
info = __open_ctree_fd(fp, path, sb_bytenr, 0, flags);
if (!info)
return NULL;
+ if (flags & __OPEN_CTREEE_RETURN_CHUNK_ROOT)
+ return info->chunk_root;
return info->fs_root;
}
* Don't print error messages if bytenr or checksums do not match in
* tree block headers. Turn on by OPEN_CTREE_SUPPRESS_ERROR
*/
- OPEN_CTREE_SUPPRESS_CHECK_BLOCK_ERRORS = (1 << 8)
+ OPEN_CTREE_SUPPRESS_CHECK_BLOCK_ERRORS = (1 << 8),
+ /* Return chunk root */
+ __OPEN_CTREEE_RETURN_CHUNK_ROOT = (1 << 9),
+ OPEN_CTREE_CHUNK_ROOT_ONLY = OPEN_CTREE_PARTIAL +
+ OPEN_CTREE_SUPPRESS_CHECK_BLOCK_ERRORS +
+ __OPEN_CTREEE_RETURN_CHUNK_ROOT,
+ /*
+ * TODO: cleanup: Split the open_ctree_flags into more indepent
+ * tree bits.
+ * Like split PARTIAL into SKIP_CSUM/SKIP_EXTENT
+ */
};
static inline u64 btrfs_sb_offset(int mirror)