Add f2fs to blkid.

We can now identify f2fs filesystems and extract the UUID.

Bug: 20275581
Change-Id: I55f7b8aa6647913bd45f02a8e9eea18ca3c53939
diff --git a/lib/blkid/probe.c b/lib/blkid/probe.c
index 84649df..8215768 100644
--- a/lib/blkid/probe.c
+++ b/lib/blkid/probe.c
@@ -1386,6 +1386,18 @@
 	set_uuid(probe->dev, bs->fsid, 0);
 	return 0;
 }
+
+static int probe_f2fs(struct blkid_probe *probe,
+            struct blkid_magic *id,
+            unsigned char *buf)
+{
+    struct f2fs_super_block *bs;
+
+    bs = (struct f2fs_super_block *)buf;
+    set_uuid(probe->dev, bs->uuid, 0);
+    return 0;
+}
+
 /*
  * Various filesystem magics that we can check for.  Note that kboff and
  * sboff are in kilobytes and bytes respectively.  All magics are in
@@ -1485,6 +1497,7 @@
   { "lvm2pv",	 1,  0x018,  8, "LVM2 001",		probe_lvm2 },
   { "lvm2pv",	 1,  0x218,  8, "LVM2 001",		probe_lvm2 },
   { "btrfs",	 64,  0x40,  8, "_BHRfS_M",		probe_btrfs },
+  { "f2fs",	 1,      0,  4, "\x10\x20\xf5\xf2",	probe_f2fs },
   {   NULL,	 0,	 0,  0, NULL,			NULL }
 };
 
diff --git a/lib/blkid/probe.h b/lib/blkid/probe.h
index 37e80ef..8eef37e 100644
--- a/lib/blkid/probe.h
+++ b/lib/blkid/probe.h
@@ -726,6 +726,42 @@
 	__u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
 } __attribute__ ((__packed__));
 
+#define F2FS_MAX_EXTENSION      64  /* # of extension entries */
+
+struct f2fs_super_block {
+    __u32 magic;           /* Magic Number */
+    __u16 major_ver;       /* Major Version */
+    __u16 minor_ver;       /* Minor Version */
+    __u32 log_sectorsize;      /* log2 sector size in bytes */
+    __u32 log_sectors_per_block;   /* log2 # of sectors per block */
+    __u32 log_blocksize;       /* log2 block size in bytes */
+    __u32 log_blocks_per_seg;  /* log2 # of blocks per segment */
+    __u32 segs_per_sec;        /* # of segments per section */
+    __u32 secs_per_zone;       /* # of sections per zone */
+    __u32 checksum_offset;     /* checksum offset inside super block */
+    __u64 block_count;     /* total # of user blocks */
+    __u32 section_count;       /* total # of sections */
+    __u32 segment_count;       /* total # of segments */
+    __u32 segment_count_ckpt;  /* # of segments for checkpoint */
+    __u32 segment_count_sit;   /* # of segments for SIT */
+    __u32 segment_count_nat;   /* # of segments for NAT */
+    __u32 segment_count_ssa;   /* # of segments for SSA */
+    __u32 segment_count_main;  /* # of segments for main area */
+    __u32 segment0_blkaddr;    /* start block address of segment 0 */
+    __u32 cp_blkaddr;      /* start block address of checkpoint */
+    __u32 sit_blkaddr;     /* start block address of SIT */
+    __u32 nat_blkaddr;     /* start block address of NAT */
+    __u32 ssa_blkaddr;     /* start block address of SSA */
+    __u32 main_blkaddr;        /* start block address of main area */
+    __u32 root_ino;        /* root inode number */
+    __u32 node_ino;        /* node inode number */
+    __u32 meta_ino;        /* meta inode number */
+    __u8 uuid[16];          /* 128-bit uuid for volume */
+    __u16 volume_name[512];    /* volume name */
+    __u32 extension_count;     /* # of extensions below */
+    __u8 extension_list[F2FS_MAX_EXTENSION][8]; /* extension array */
+} __attribute__((__packed__));
+
 /*
  * Byte swap functions
  */