btrfs-progs: Add new btrfs_open_ctree_flags CHUNK_ONLY
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Fri, 16 Jan 2015 03:22:28 +0000 (11:22 +0800)
committerDavid Sterba <dsterba@suse.cz>
Wed, 11 Feb 2015 16:19:30 +0000 (17:19 +0100)
Add new flag CHUNK_ONLY and internal used only flag __RETURN_CHUNK.

CHUNK_ONLY will imply __RETURN_CHUNK, SUPPRESS_ERROR and PARTIAL, which
will allow the fs to be opened with only chunk tree OK.

This will improve the usability for btrfs-find-root.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
disk-io.c
disk-io.h

index 6c1961e..b709ff5 100644 (file)
--- a/disk-io.c
+++ b/disk-io.c
@@ -1197,7 +1197,7 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
                           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;
@@ -1242,6 +1242,8 @@ struct btrfs_root *open_ctree(const char *filename, u64 sb_bytenr,
        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;
 }
 
@@ -1252,6 +1254,8 @@ struct btrfs_root *open_ctree_fd(int fp, const char *path, u64 sb_bytenr,
        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;
 }
 
index a69a62f..7a2a597 100644 (file)
--- a/disk-io.h
+++ b/disk-io.h
@@ -38,7 +38,17 @@ enum btrfs_open_ctree_flags {
         * 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)