[syslinux] [PATCH] FSUUID for ext2 filesystem

Serj Kalichev serj.kalichev at gmail.com
Wed Nov 20 22:44:15 PST 2013


The ext2 filesystem supports volume UUID now.
The FSUUID variable can be set to kernel command line.
Patch is based on FSUUID for FAT patch.

Signed-off-by: Serj Kalichev <serj.kalichev at gmail.com>
---
 core/fs/ext2/ext2.c    | 40 +++++++++++++++++++++++++++++++++++++++-
 core/fs/ext2/ext2_fs.h |  1 +
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/core/fs/ext2/ext2.c b/core/fs/ext2/ext2.c
index df0856f..76bd1d5 100644
--- a/core/fs/ext2/ext2.c
+++ b/core/fs/ext2/ext2.c
@@ -312,6 +312,9 @@ static int ext2_fs_init(struct fs_info *fs)
     sbi->s_first_data_block = sb.s_first_data_block;
     sbi->s_inode_size = sb.s_inode_size;
 
+    /* Volume UUID */
+    memcpy(sbi->s_uuid, sb.s_uuid, sizeof(sbi->s_uuid));
+
     /* Initialize the cache, and force block zero to all zero */
     cache_init(fs->fs_dev, fs->block_shift);
     cs = _get_cache_block(fs->fs_dev, 0);
@@ -321,6 +324,41 @@ static int ext2_fs_init(struct fs_info *fs)
     return fs->block_shift;
 }
 
+#define EXT2_UUID_LEN (4 + 4 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 4 + 4 + 4 + 1)
+static char *ext2_fs_uuid(struct fs_info *fs)
+{
+    char *uuid = NULL;
+
+    uuid = malloc(EXT2_UUID_LEN);
+    if (!uuid)
+	return NULL;
+
+    if (snprintf(uuid, EXT2_UUID_LEN,
+                  "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+	          EXT2_SB(fs)->s_uuid[0],
+	          EXT2_SB(fs)->s_uuid[1],
+	          EXT2_SB(fs)->s_uuid[2],
+	          EXT2_SB(fs)->s_uuid[3],
+	          EXT2_SB(fs)->s_uuid[4],
+	          EXT2_SB(fs)->s_uuid[5],
+	          EXT2_SB(fs)->s_uuid[6],
+	          EXT2_SB(fs)->s_uuid[7],
+	          EXT2_SB(fs)->s_uuid[8],
+	          EXT2_SB(fs)->s_uuid[9],
+	          EXT2_SB(fs)->s_uuid[10],
+	          EXT2_SB(fs)->s_uuid[11],
+	          EXT2_SB(fs)->s_uuid[12],
+	          EXT2_SB(fs)->s_uuid[13],
+	          EXT2_SB(fs)->s_uuid[14],
+	          EXT2_SB(fs)->s_uuid[15]
+	          ) < 0) {
+	free(uuid);
+	return NULL;
+    }
+
+    return uuid;
+}
+
 const struct fs_ops ext2_fs_ops = {
     .fs_name       = "ext2",
     .fs_flags      = FS_THISIND | FS_USEMEM,
@@ -336,5 +374,5 @@ const struct fs_ops ext2_fs_ops = {
     .readlink      = ext2_readlink,
     .readdir       = ext2_readdir,
     .next_extent   = ext2_next_extent,
-    .fs_uuid       = NULL,
+    .fs_uuid       = ext2_fs_uuid,
 };
diff --git a/core/fs/ext2/ext2_fs.h b/core/fs/ext2/ext2_fs.h
index 8adc9bb..803a995 100644
--- a/core/fs/ext2/ext2_fs.h
+++ b/core/fs/ext2/ext2_fs.h
@@ -277,6 +277,7 @@ struct ext2_sb_info {
     uint32_t s_groups_count;    /* Number of groups in the fs */
     uint32_t s_first_data_block;	/* First Data Block */
     int      s_inode_size;
+    uint8_t  s_uuid[16];	/* 128-bit uuid for volume */
 };
 
 static inline struct ext2_sb_info *EXT2_SB(struct fs_info *fs)
-- 
1.8.1.2



More information about the Syslinux mailing list