]> err.no Git - util-linux/commitdiff
blkid: add ext{2,3,4,4devel} support
authorKarel Zak <kzak@redhat.com>
Mon, 15 Sep 2008 12:11:23 +0000 (14:11 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 11 Feb 2009 22:21:45 +0000 (23:21 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libs/blkid/src/blkidP.h
libs/blkid/src/probe.c
libs/blkid/src/probers/Makefile.am
libs/blkid/src/probers/ext.c [new file with mode: 0644]
libs/blkid/src/probers/probers.h

index 98fb7ff6704be7ff2224ee30ccbbaa3f009c85fc..56e569f3e3519b8a449e7e2202a617f823d088dd 100644 (file)
@@ -262,6 +262,7 @@ extern int blkid_probe_set_utf8label(blkid_probe pr, unsigned char *label,
 extern int blkid_probe_sprintf_uuid(blkid_probe pr, unsigned char *uuid,
                                 size_t len, const char *fmt, ...);
 extern int blkid_probe_set_uuid(blkid_probe pr, unsigned char *uuid);
+extern int blkid_probe_set_uuid_as(blkid_probe pr, unsigned char *uuid, const char *name);
 
 
 #define BLKID_ENC_UTF16BE      0
index 4f99d088769ece213dd8bc168e827cddf98c8b40..c8b2947474a1b0692132bce2b28d372a8bde74cb 100644 (file)
@@ -48,7 +48,12 @@ static const struct blkid_idinfo *idinfos[] =
        &pdcraid_idinfo,
        &silraid_idinfo,
        &viaraid_idinfo,
-       &linuxraid_idinfo
+       &linuxraid_idinfo,
+       &ext4dev_idinfo,
+       &ext4_idinfo,
+       &ext3_idinfo,
+       &ext2_idinfo,
+       &jbd_idinfo
 };
 
 #ifndef ARRAY_SIZE
@@ -639,20 +644,23 @@ int blkid_probe_sprintf_uuid(blkid_probe pr, unsigned char *uuid,
 }
 
 /* default _set_uuid function to set DCE UUIDs */
-int blkid_probe_set_uuid(blkid_probe pr, unsigned char *uuid)
+int blkid_probe_set_uuid_as(blkid_probe pr, unsigned char *uuid, const char *name)
 {
        struct blkid_prval *v;
 
        if (uuid_is_empty(uuid, 16))
                return 0;
 
-       if ((pr->probreq & BLKID_PROBREQ_UUIDRAW) &&
-           blkid_probe_set_value(pr, "UUID_RAW", uuid, 16) < 0)
-               return -1;
-       if (!(pr->probreq & BLKID_PROBREQ_UUID))
-               return 0;
+       if (!name) {
+               if ((pr->probreq & BLKID_PROBREQ_UUIDRAW) &&
+                   blkid_probe_set_value(pr, "UUID_RAW", uuid, 16) < 0)
+                       return -1;
+               if (!(pr->probreq & BLKID_PROBREQ_UUID))
+                       return 0;
 
-       v = blkid_probe_assign_value(pr, "UUID");
+               v = blkid_probe_assign_value(pr, "UUID");
+       } else
+               v = blkid_probe_assign_value(pr, name);
 
 #ifdef HAVE_LIBUUID
        {
@@ -672,6 +680,11 @@ int blkid_probe_set_uuid(blkid_probe pr, unsigned char *uuid)
        return 0;
 }
 
+int blkid_probe_set_uuid(blkid_probe pr, unsigned char *uuid)
+{
+       return blkid_probe_set_uuid_as(pr, uuid, NULL);
+}
+
 int blkid_probe_get_value(blkid_probe pr, int num, const char **name,
                        unsigned char **data, size_t *len)
 {
index 9331636c325ad085ad5572341ff5d4ff67cbdaa1..59acd9e6e70a468938727c4f12d2ec0757611670 100644 (file)
@@ -16,6 +16,7 @@ libprobers_a_SOURCES =        probers.h \
                        promise_raid.c \
                        silicon_raid.c \
                        via_raid.c \
-                       linux_raid.c
+                       linux_raid.c \
+                       ext.c
 
 all-local: $(lib_LIBRARIES)
diff --git a/libs/blkid/src/probers/ext.c b/libs/blkid/src/probers/ext.c
new file mode 100644 (file)
index 0000000..7b5545e
--- /dev/null
@@ -0,0 +1,534 @@
+/*
+ * Copyright (C) 1999, 2001 by Andries Brouwer
+ * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
+ * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdint.h>
+#include <sys/utsname.h>
+#include <time.h>
+
+#include "blkidP.h"
+
+struct ext2_super_block {
+       uint32_t                s_inodes_count;
+       uint32_t                s_blocks_count;
+       uint32_t                s_r_blocks_count;
+       uint32_t                s_free_blocks_count;
+       uint32_t                s_free_inodes_count;
+       uint32_t                s_first_data_block;
+       uint32_t                s_log_block_size;
+       uint32_t                s_dummy3[7];
+       unsigned char           s_magic[2];
+       uint16_t                s_state;
+       uint16_t                s_errors;
+       uint16_t                s_minor_rev_level;
+       uint32_t                s_lastcheck;
+       uint32_t                s_checkinterval;
+       uint32_t                s_creator_os;
+       uint32_t                s_rev_level;
+       uint16_t                s_def_resuid;
+       uint16_t                s_def_resgid;
+       uint32_t                s_first_ino;
+       uint16_t                s_inode_size;
+       uint16_t                s_block_group_nr;
+       uint32_t                s_feature_compat;
+       uint32_t                s_feature_incompat;
+       uint32_t                s_feature_ro_compat;
+       unsigned char           s_uuid[16];
+       char                    s_volume_name[16];
+       char                    s_last_mounted[64];
+       uint32_t                s_algorithm_usage_bitmap;
+       uint8_t                 s_prealloc_blocks;
+       uint8_t                 s_prealloc_dir_blocks;
+       uint16_t                s_reserved_gdt_blocks;
+       uint8_t                 s_journal_uuid[16];
+       uint32_t                s_journal_inum;
+       uint32_t                s_journal_dev;
+       uint32_t                s_last_orphan;
+       uint32_t                s_hash_seed[4];
+       uint8_t                 s_def_hash_version;
+       uint8_t                 s_jnl_backup_type;
+       uint16_t                s_reserved_word_pad;
+       uint32_t                s_default_mount_opts;
+       uint32_t                s_first_meta_bg;
+       uint32_t                s_mkfs_time;
+       uint32_t                s_jnl_blocks[17];
+       uint32_t                s_blocks_count_hi;
+       uint32_t                s_r_blocks_count_hi;
+       uint32_t                s_free_blocks_hi;
+       uint16_t                s_min_extra_isize;
+       uint16_t                s_want_extra_isize;
+       uint32_t                s_flags;
+       uint16_t                s_raid_stride;
+       uint16_t                s_mmp_interval;
+       uint64_t                s_mmp_block;
+       uint32_t                s_raid_stripe_width;
+       uint32_t                s_reserved[163];
+};
+
+/* magic string */
+#define EXT_SB_MAGIC                           "\123\357"
+/* supper block offset */
+#define EXT_SB_OFF                             0x400
+/* supper block offset in kB */
+#define EXT_SB_KBOFF                           (EXT_SB_OFF >> 10)
+/* magic string offset within super block */
+#define EXT_MAG_OFF                            0x38
+
+
+
+/* for s_flags */
+#define EXT2_FLAGS_TEST_FILESYS                0x0004
+
+/* for s_feature_compat */
+#define EXT3_FEATURE_COMPAT_HAS_JOURNAL                0x0004
+
+/* for s_feature_ro_compat */
+#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER    0x0001
+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE      0x0002
+#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR       0x0004
+#define EXT4_FEATURE_RO_COMPAT_HUGE_FILE       0x0008
+#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM                0x0010
+#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK       0x0020
+#define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE     0x0040
+
+/* for s_feature_incompat */
+#define EXT2_FEATURE_INCOMPAT_FILETYPE         0x0002
+#define EXT3_FEATURE_INCOMPAT_RECOVER          0x0004
+#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV      0x0008
+#define EXT2_FEATURE_INCOMPAT_META_BG          0x0010
+#define EXT4_FEATURE_INCOMPAT_EXTENTS          0x0040 /* extents support */
+#define EXT4_FEATURE_INCOMPAT_64BIT            0x0080
+#define EXT4_FEATURE_INCOMPAT_MMP              0x0100
+#define EXT4_FEATURE_INCOMPAT_FLEX_BG          0x0200
+
+#define EXT2_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+                                        EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+#define EXT2_FEATURE_INCOMPAT_SUPP     (EXT2_FEATURE_INCOMPAT_FILETYPE| \
+                                        EXT2_FEATURE_INCOMPAT_META_BG)
+#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED      ~EXT2_FEATURE_INCOMPAT_SUPP
+#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED     ~EXT2_FEATURE_RO_COMPAT_SUPP
+
+#define EXT3_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+                                        EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+#define EXT3_FEATURE_INCOMPAT_SUPP     (EXT2_FEATURE_INCOMPAT_FILETYPE| \
+                                        EXT3_FEATURE_INCOMPAT_RECOVER| \
+                                        EXT2_FEATURE_INCOMPAT_META_BG)
+#define EXT3_FEATURE_INCOMPAT_UNSUPPORTED      ~EXT3_FEATURE_INCOMPAT_SUPP
+#define EXT3_FEATURE_RO_COMPAT_UNSUPPORTED     ~EXT3_FEATURE_RO_COMPAT_SUPP
+
+
+#ifdef FUCK
+
+/* for s_flags */
+#define EXT2_FLAGS_TEST_FILESYS                        0x0004
+
+/* for s_feature_compat */
+#define EXT3_FEATURE_COMPAT_HAS_JOURNAL                0x0004
+
+/* for s_feature_ro_compat */
+#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER    0x0001
+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE      0x0002
+#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR       0x0004
+#define EXT4_FEATURE_RO_COMPAT_HUGE_FILE       0x0008
+#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM                0x0010
+#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK       0x0020
+#define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE     0x0040
+
+/* for s_feature_incompat */
+#define EXT2_FEATURE_INCOMPAT_FILETYPE         0x0002
+#define EXT3_FEATURE_INCOMPAT_RECOVER          0x0004
+#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV      0x0008
+#define EXT2_FEATURE_INCOMPAT_META_BG          0x0010
+#define EXT4_FEATURE_INCOMPAT_EXTENTS          0x0040 /* extents support */
+#define EXT4_FEATURE_INCOMPAT_64BIT            0x0080
+#define EXT4_FEATURE_INCOMPAT_MMP              0x0100
+#define EXT4_FEATURE_INCOMPAT_FLEX_BG          0x0200
+
+#define EXT2_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+                                        EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+#define EXT2_FEATURE_INCOMPAT_SUPP     (EXT2_FEATURE_INCOMPAT_FILETYPE| \
+                                        EXT2_FEATURE_INCOMPAT_META_BG)
+#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED      ~EXT2_FEATURE_INCOMPAT_SUPP
+#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED     ~EXT2_FEATURE_RO_COMPAT_SUPP
+
+#define EXT3_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+                                        EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+#define EXT3_FEATURE_INCOMPAT_SUPP     (EXT2_FEATURE_INCOMPAT_FILETYPE| \
+                                        EXT3_FEATURE_INCOMPAT_RECOVER| \
+                                        EXT2_FEATURE_INCOMPAT_META_BG)
+#define EXT3_FEATURE_INCOMPAT_UNSUPPORTED      (~EXT3_FEATURE_INCOMPAT_SUPP)
+#define EXT3_FEATURE_RO_COMPAT_UNSUPPORTED     (~EXT3_FEATURE_RO_COMPAT_SUPP)
+
+#endif
+
+/*
+ * reads superblock and returns:
+ *     fc = feature_compat
+ *     fi = feature_incompat
+ *     frc = feature_ro_compat
+ */
+static struct ext2_super_block *ext_get_super(
+               blkid_probe pr, uint32_t *fc, uint32_t *fi, uint32_t *frc)
+{
+       struct ext2_super_block *es;
+
+       es = (struct ext2_super_block *)
+                       blkid_probe_get_buffer(pr, EXT_SB_OFF, 0x200);
+       if (!es)
+               return NULL;
+       if (fc)
+               *fc = le32_to_cpu(es->s_feature_compat);
+       if (fi)
+               *fi = le32_to_cpu(es->s_feature_incompat);
+       if (frc)
+               *frc = le32_to_cpu(es->s_feature_ro_compat);
+
+       return es;
+}
+
+static void ext_get_info(blkid_probe pr, int ver, struct ext2_super_block *es)
+{
+       DBG(DEBUG_PROBE, printf("ext2_sb.compat = %08X:%08X:%08X\n",
+                  le32_to_cpu(es->s_feature_compat),
+                  le32_to_cpu(es->s_feature_incompat),
+                  le32_to_cpu(es->s_feature_ro_compat)));
+
+       if (strlen(es->s_volume_name))
+               blkid_probe_set_label(pr, (unsigned char *) es->s_volume_name,
+                                       sizeof(es->s_volume_name));
+       blkid_probe_set_uuid(pr, es->s_uuid);
+
+       if (le32_to_cpu(es->s_feature_compat) & EXT3_FEATURE_COMPAT_HAS_JOURNAL)
+               blkid_probe_set_uuid_as(pr, es->s_journal_uuid, "EXT_JOURNAL");
+
+       if (ver != 2 && (pr->probreq & BLKID_PROBREQ_SECTYPE) &&
+           ((le32_to_cpu(es->s_feature_incompat) & EXT2_FEATURE_INCOMPAT_UNSUPPORTED) == 0))
+               blkid_probe_sprintf_version(pr, "%u.%u",
+                le32_to_cpu(es->s_rev_level), le16_to_cpu(es->s_minor_rev_level));
+}
+
+
+static int probe_jbd(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct ext2_super_block *es;
+       uint32_t fi;
+
+       es = ext_get_super(pr, NULL, &fi, NULL);
+       if (!es)
+               return -BLKID_ERR_PARAM;
+       if (!(fi & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV))
+               return -BLKID_ERR_PARAM;
+
+       ext_get_info(pr, 2, es);
+       return 0;
+}
+
+static int probe_ext2(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct ext2_super_block *es;
+       uint32_t fc, frc, fi;
+
+       es = ext_get_super(pr, &fc, &fi, &frc);
+       if (!es)
+               return -BLKID_ERR_PARAM;
+
+       /* Distinguish between ext3 and ext2 */
+       if (fc & EXT3_FEATURE_COMPAT_HAS_JOURNAL)
+               return -BLKID_ERR_PARAM;
+
+       /* Any features which ext2 doesn't understand */
+       if ((frc & EXT2_FEATURE_RO_COMPAT_UNSUPPORTED) ||
+           (fi  & EXT2_FEATURE_INCOMPAT_UNSUPPORTED))
+               return -BLKID_ERR_PARAM;
+
+       ext_get_info(pr, 2, es);
+       return 0;
+}
+
+static int probe_ext3(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct ext2_super_block *es;
+       uint32_t fc, frc, fi;
+
+       es = ext_get_super(pr, &fc, &fi, &frc);
+       if (!es)
+               return -BLKID_ERR_PARAM;
+
+       /* Distinguish from ext4dev */
+       if (le32_to_cpu(es->s_flags) & EXT2_FLAGS_TEST_FILESYS)
+               return -BLKID_ERR_PARAM;
+
+       /* ext3 requires journal */
+       if (!(fc & EXT3_FEATURE_COMPAT_HAS_JOURNAL))
+               return -BLKID_ERR_PARAM;
+
+       /* Any features which ext3 doesn't understand */
+       if ((frc & EXT3_FEATURE_RO_COMPAT_UNSUPPORTED) ||
+           (fi  & EXT3_FEATURE_INCOMPAT_UNSUPPORTED))
+               return -BLKID_ERR_PARAM;
+
+       ext_get_info(pr, 3, es);
+       return 0;
+}
+
+/***
+ * PLEASE, close your eyes and press PageDown quickly.
+ *
+ * ... the code below is ugly heuristic to detect if
+ *     system supports ext4 or ext4dev.
+ *                                        --kzak
+ ****/
+
+/*
+ * Check to see if a filesystem is in /proc/filesystems.
+ * Returns 1 if found, 0 if not
+ */
+static int fs_proc_check(const char *fs_name)
+{
+       FILE    *f;
+       char    buf[80], *cp, *t;
+
+       f = fopen("/proc/filesystems", "r");
+       if (!f)
+               return 0;
+       while (!feof(f)) {
+               if (!fgets(buf, sizeof(buf), f))
+                       break;
+               cp = buf;
+               if (!isspace(*cp)) {
+                       while (*cp && !isspace(*cp))
+                               cp++;
+               }
+               while (*cp && isspace(*cp))
+                       cp++;
+               if ((t = strchr(cp, '\n')) != NULL)
+                       *t = 0;
+               if ((t = strchr(cp, '\t')) != NULL)
+                       *t = 0;
+               if ((t = strchr(cp, ' ')) != NULL)
+                       *t = 0;
+               if (!strcmp(fs_name, cp)) {
+                       fclose(f);
+                       return 1;
+               }
+       }
+       fclose(f);
+       return (0);
+}
+
+/*
+ * Check to see if a filesystem is available as a module
+ * Returns 1 if found, 0 if not
+ */
+static int check_for_modules(const char *fs_name)
+{
+       struct utsname  uts;
+       FILE            *f;
+       char            buf[1024], *cp, *t;
+       int             i;
+
+       if (uname(&uts))
+               return 0;
+       snprintf(buf, sizeof(buf), "/lib/modules/%s/modules.dep", uts.release);
+
+       f = fopen(buf, "r");
+       if (!f)
+               return 0;
+       while (!feof(f)) {
+               if (!fgets(buf, sizeof(buf), f))
+                       break;
+               if ((cp = strchr(buf, ':')) != NULL)
+                       *cp = 0;
+               else
+                       continue;
+               if ((cp = strrchr(buf, '/')) != NULL)
+                       cp++;
+               i = strlen(cp);
+               if (i > 3) {
+                       t = cp + i - 3;
+                       if (!strcmp(t, ".ko"))
+                               *t = 0;
+               }
+               if (!strcmp(cp, fs_name))
+                       return 1;
+       }
+       fclose(f);
+       return 0;
+}
+
+static int system_supports_ext4(void)
+{
+       static time_t   last_check = 0;
+       static int      ret = -1;
+       time_t          now = time(0);
+
+       if (ret != -1 || (last_check - now) < 5)
+               return ret;
+       last_check = now;
+       ret = (fs_proc_check("ext4") || check_for_modules("ext4"));
+       return ret;
+}
+
+static int system_supports_ext4dev(void)
+{
+       static time_t   last_check = 0;
+       static int      ret = -1;
+       time_t          now = time(0);
+
+       if (ret != -1 || (last_check - now) < 5)
+               return ret;
+       last_check = now;
+       ret = (fs_proc_check("ext4dev") || check_for_modules("ext4dev"));
+       return ret;
+}
+
+static int probe_ext4dev(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct ext2_super_block *es;
+       uint32_t fc, frc, fi;
+
+       es = ext_get_super(pr, &fc, &fi, &frc);
+       if (!es)
+               return -BLKID_ERR_PARAM;
+
+       /* Distinguish from jbd */
+       if (fi & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
+               return -BLKID_ERR_PARAM;
+
+       /* ext4dev requires a journal */
+       if (!(fc & EXT3_FEATURE_COMPAT_HAS_JOURNAL))
+               return -BLKID_ERR_PARAM;
+
+       /*
+        * If the filesystem is marked as OK for use by in-development
+        * filesystem code, but ext4dev is not supported, and ext4 is,
+        * then don't call ourselves ext4dev, since we should be
+        * detected as ext4 in that case.
+        *
+        * If the filesystem is marked as in use by production
+        * filesystem, then it can only be used by ext4 and NOT by
+        * ext4dev, so always disclaim we are ext4dev in that case.
+        */
+       if (le32_to_cpu(es->s_flags) & EXT2_FLAGS_TEST_FILESYS) {
+               if (!system_supports_ext4dev() && system_supports_ext4())
+                       return -BLKID_ERR_PARAM;
+       } else
+               return -BLKID_ERR_PARAM;
+
+       ext_get_info(pr, 4, es);
+       return 0;
+}
+
+static int probe_ext4(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct ext2_super_block *es;
+       uint32_t fc, frc, fi;
+
+       es = ext_get_super(pr, &fc, &fi, &frc);
+       if (!es)
+               return -1;
+
+       /* Distinguish from jbd */
+       if (fi & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
+               return -BLKID_ERR_PARAM;
+
+       /* ext4 requires journal */
+       if (!(fc & EXT3_FEATURE_COMPAT_HAS_JOURNAL))
+               return -BLKID_ERR_PARAM;
+
+       /* Ext4 has at least one feature which ext3 doesn't understand */
+       if (!(frc & EXT3_FEATURE_RO_COMPAT_UNSUPPORTED) &&
+           !(fi  & EXT3_FEATURE_INCOMPAT_UNSUPPORTED))
+               return -BLKID_ERR_PARAM;
+
+       /*
+        * If the filesystem is a OK for use by in-development
+        * filesystem code, and ext4dev is supported or ext4 is not
+        * supported, then don't call ourselves ext4, so we can redo
+        * the detection and mark the filesystem as ext4dev.
+        *
+        * If the filesystem is marked as in use by production
+        * filesystem, then it can only be used by ext4 and NOT by
+        * ext4dev.
+        */
+       if (le32_to_cpu(es->s_flags) & EXT2_FLAGS_TEST_FILESYS) {
+               if (system_supports_ext4dev() || !system_supports_ext4())
+                       return -BLKID_ERR_PARAM;
+       }
+       ext_get_info(pr, 4, es);
+       return 0;
+}
+
+#define BLKID_EXT_MAGICS \
+       { \
+               {        \
+                       .magic = EXT_SB_MAGIC, \
+                       .len = sizeof(EXT_SB_MAGIC) - 1, \
+                       .kboff = EXT_SB_KBOFF, \
+                       .sboff = EXT_MAG_OFF \
+               }, \
+               { NULL } \
+       }
+
+const struct blkid_idinfo jbd_idinfo =
+{
+       .name           = "jbd",
+       .usage          = BLKID_USAGE_OTHER,
+       .probefunc      = probe_jbd,
+       .magics         = BLKID_EXT_MAGICS
+};
+
+const struct blkid_idinfo ext2_idinfo =
+{
+       .name           = "ext2",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_ext2,
+       .magics         = BLKID_EXT_MAGICS
+};
+
+const struct blkid_idinfo ext3_idinfo =
+{
+       .name           = "ext3",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_ext3,
+       .magics         = BLKID_EXT_MAGICS
+};
+
+const struct blkid_idinfo ext4_idinfo =
+{
+       .name           = "ext4",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_ext4,
+       .magics         = BLKID_EXT_MAGICS
+};
+
+const struct blkid_idinfo ext4dev_idinfo =
+{
+       .name           = "ext4dev",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_ext4dev,
+       .magics         = BLKID_EXT_MAGICS
+};
+
index 694672c2c018b0a70146fff199b73bc2cb696609..810e2649571ee85127584c805ae395d9125d809c 100644 (file)
@@ -28,5 +28,10 @@ extern const struct blkid_idinfo pdcraid_idinfo;
 extern const struct blkid_idinfo silraid_idinfo;
 extern const struct blkid_idinfo viaraid_idinfo;
 extern const struct blkid_idinfo linuxraid_idinfo;
+extern const struct blkid_idinfo ext4dev_idinfo;
+extern const struct blkid_idinfo ext4_idinfo;
+extern const struct blkid_idinfo ext3_idinfo;
+extern const struct blkid_idinfo ext2_idinfo;
+extern const struct blkid_idinfo jbd_idinfo;
 
 #endif /* _BLKID_PROBE_H */