]> err.no Git - util-linux/commitdiff
blkid: add btrfs support
authorKarel Zak <kzak@redhat.com>
Mon, 12 Jan 2009 23:11:21 +0000 (00:11 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 11 Feb 2009 22:21:50 +0000 (23:21 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libs/blkid/src/probe.c
libs/blkid/src/probers/Makefile.am
libs/blkid/src/probers/btrfs.c [new file with mode: 0644]
libs/blkid/src/probers/probers.h

index e3c147dfce957c8820ddd6e0f4765fe78fd67dac..12ea210756671825527aa43e356315dcaa7a2172 100644 (file)
@@ -85,7 +85,8 @@ static const struct blkid_idinfo *idinfos[] =
        &oracleasm_idinfo,
        &vxfs_idinfo,
        &squashfs_idinfo,
-       &netware_idinfo
+       &netware_idinfo,
+       &btrfs_idinfo
 };
 
 #ifndef ARRAY_SIZE
index ff07ff86dbc0824704cc750c26d29cb240d779a4..116a2f655666797c236ecb05de2e09b10016dd24 100644 (file)
@@ -38,6 +38,7 @@ libprobers_a_SOURCES =        probers.h \
                        squashfs.c \
                        netware.c \
                        sysv.c \
+                       btrfs.c \
                        lvm.c
 
 all-local: $(lib_LIBRARIES)
diff --git a/libs/blkid/src/probers/btrfs.c b/libs/blkid/src/probers/btrfs.c
new file mode 100644 (file)
index 0000000..b7590f7
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2009 Karel Zak <kzak@redhat.com>
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "blkidP.h"
+
+struct btrfs_super_block {
+       uint8_t csum[32];
+       uint8_t fsid[16];
+       uint64_t bytenr;
+       uint64_t flags;
+       uint8_t magic[8];
+       uint64_t generation;
+       uint64_t root;
+       uint64_t chunk_root;
+       uint64_t log_root;
+       uint64_t log_root_transid;
+       uint64_t total_bytes;
+       uint64_t bytes_used;
+       uint64_t root_dir_objectid;
+       uint64_t num_devices;
+       uint32_t sectorsize;
+       uint32_t nodesize;
+       uint32_t leafsize;
+       uint32_t stripesize;
+       uint32_t sys_chunk_array_size;
+       uint64_t chunk_root_generation;
+       uint64_t compat_flags;
+       uint64_t compat_ro_flags;
+       uint64_t incompat_flags;
+       uint16_t csum_type;
+       uint8_t root_level;
+       uint8_t chunk_root_level;
+       uint8_t log_root_level;
+       struct btrfs_dev_item {
+               uint64_t devid;
+               uint64_t total_bytes;
+               uint64_t bytes_used;
+               uint32_t io_align;
+               uint32_t io_width;
+               uint32_t sector_size;
+               uint64_t type;
+               uint64_t generation;
+               uint64_t start_offset;
+               uint32_t dev_group;
+               uint8_t seek_speed;
+               uint8_t bandwidth;
+               uint8_t uuid[16];
+               uint8_t fsid[16];
+       } __attribute__ ((__packed__)) dev_item;
+       uint8_t label[256];
+} __attribute__ ((__packed__));
+
+static int probe_btrfs(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct btrfs_super_block *bfs;
+
+       bfs = blkid_probe_get_sb(pr, mag, struct btrfs_super_block);
+       if (!bfs)
+               return -1;
+
+       if (*bfs->label)
+               blkid_probe_set_label(pr,
+                               (unsigned char *) bfs->label,
+                               sizeof(bfs->label));
+
+       blkid_probe_set_uuid(pr, bfs->fsid);
+       blkid_probe_set_uuid_as(pr, bfs->dev_item.uuid, "SUB_UUID");
+
+       return 0;
+}
+
+const struct blkid_idinfo btrfs_idinfo =
+{
+       .name           = "btrfs",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_btrfs,
+       .magics         =
+       {
+               { .magic = "_BHRfS_M", .len = 8, .kboff = 64, .sboff = 0x40 },
+               { NULL }
+       }
+};
+
index b31938f2a689dcc343eecb3edf76ec1831f8650a..0a9a070fcb9e9b2b50658df3575a6834c152a040 100644 (file)
@@ -54,6 +54,6 @@ extern const struct blkid_idinfo squashfs_idinfo;
 extern const struct blkid_idinfo netware_idinfo;
 extern const struct blkid_idinfo sysv_idinfo;
 extern const struct blkid_idinfo xenix_idinfo;
-
+extern const struct blkid_idinfo btrfs_idinfo;
 
 #endif /* _BLKID_PROBE_H */