This commit adds support to print UUID tree elements to print-tree.c.

Signed-off-by: Stefan Behrens <sbehr...@giantdisaster.de>
---
 fs/btrfs/print-tree.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/fs/btrfs/print-tree.c b/fs/btrfs/print-tree.c
index dc0024f..6e204ee 100644
--- a/fs/btrfs/print-tree.c
+++ b/fs/btrfs/print-tree.c
@@ -155,6 +155,73 @@ static void print_extent_ref_v0(struct extent_buffer *eb, 
int slot)
 }
 #endif
 
+static void print_uuid_item(struct extent_buffer *l,
+                           struct btrfs_uuid_item *ptr,
+                           u64 item_size)
+{
+       do {
+               u64 sub_item_type;
+               u64 sub_item_len;
+               u64 subvol_id;
+
+               if (item_size < sizeof(*ptr)) {
+                       printk(KERN_INFO "btrfs: uuid item too short!\n");
+                       return;
+               }
+               sub_item_type = btrfs_uuid_type(l, ptr);
+               sub_item_len = btrfs_uuid_len(l, ptr);
+               ptr++;
+               item_size -= sizeof(*ptr);
+               if (sub_item_len * 8 > item_size) {
+                       printk(KERN_INFO "btrfs: uuid item too short (2)!\n");
+                       return;
+               }
+
+               item_size -= sub_item_len * 8;
+               switch (sub_item_type) {
+               case BTRFS_UUID_ITEM_TYPE_SUBVOL:
+                       while (sub_item_len) {
+                               read_extent_buffer(l, &subvol_id,
+                                                  (unsigned long)ptr, 8);
+                               printk(KERN_INFO "\t\tsubvol_id %llu\n",
+                                      (unsigned long long)
+                                       le64_to_cpu(subvol_id));
+                               sub_item_len--;
+                               ptr = (struct btrfs_uuid_item *)
+                                       (((char *)ptr) + 8);
+                       }
+                       break;
+               case BTRFS_UUID_ITEM_TYPE_RECEIVED_SUBVOL:
+                       while (sub_item_len) {
+                               read_extent_buffer(l, &subvol_id,
+                                                  (unsigned long)ptr, 8);
+                               printk(KERN_INFO "\t\treceived_subvol_id 
%llu\n",
+                                      (unsigned long long)
+                                       le64_to_cpu(subvol_id));
+                               sub_item_len--;
+                               ptr = (struct btrfs_uuid_item *)
+                                       (((char *)ptr) + 8);
+                       }
+                       break;
+               default:
+                       printk(KERN_INFO "\t\tunknown type=%llu, len=8*%llu\n",
+                              (unsigned long long)sub_item_type,
+                              (unsigned long long)sub_item_len);
+                       while (sub_item_len) {
+                               read_extent_buffer(l, &subvol_id,
+                                                  (unsigned long)ptr, 8);
+                               printk(KERN_INFO "\t\tid %llu\n",
+                                      (unsigned long long)
+                                       le64_to_cpu(subvol_id));
+                               sub_item_len--;
+                               ptr = (struct btrfs_uuid_item *)
+                                       (((char *)ptr) + 8);
+                       }
+                       break;
+               }
+       } while (item_size);
+}
+
 void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l)
 {
        int i;
@@ -168,6 +235,7 @@ void btrfs_print_leaf(struct btrfs_root *root, struct 
extent_buffer *l)
        struct btrfs_extent_data_ref *dref;
        struct btrfs_shared_data_ref *sref;
        struct btrfs_dev_extent *dev_extent;
+       struct btrfs_uuid_item *uuid_item;
        struct btrfs_key key;
        struct btrfs_key found_key;
 
@@ -301,6 +369,11 @@ void btrfs_print_leaf(struct btrfs_root *root, struct 
extent_buffer *l)
                case BTRFS_DEV_REPLACE_KEY:
                        printk(KERN_INFO "\t\tdev replace\n");
                        break;
+               case BTRFS_UUID_KEY:
+                       uuid_item = btrfs_item_ptr(l, i,
+                                                  struct btrfs_uuid_item);
+                       print_uuid_item(l, uuid_item, btrfs_item_size_nr(l, i));
+                       break;
                };
        }
 }
-- 
1.8.2.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to