• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/fstools/libblkid-tiny/f2fs.c

  1 /*
  2  * Copyright (C) 2013 Alejandro Martinez Ruiz <alex@nowcomputing.com>
  3  *
  4  * This file may be redistributed under the terms of the
  5  * GNU Lesser General Public License
  6  */
  7 
  8 #include <stddef.h>
  9 #include <string.h>
 10 
 11 #include "superblocks.h"
 12 
 13 #define F2FS_MAGIC              "\x10\x20\xF5\xF2"
 14 #define F2FS_MAGIC_OFF          0
 15 #define F2FS_UUID_SIZE          16
 16 #define F2FS_LABEL_SIZE         512
 17 #define F2FS_SB1_OFF            0x400
 18 #define F2FS_SB1_KBOFF          (F2FS_SB1_OFF >> 10)
 19 #define F2FS_SB2_OFF            0x1400
 20 #define F2FS_SB2_KBOFF          (F2FS_SB2_OFF >> 10)
 21 
 22 struct f2fs_super_block {                                       /* According to version 1.1 */
 23 /* 0x00 */      uint32_t        magic;                          /* Magic Number */
 24 /* 0x04 */      uint16_t        major_ver;                      /* Major Version */
 25 /* 0x06 */      uint16_t        minor_ver;                      /* Minor Version */
 26 /* 0x08 */      uint32_t        log_sectorsize;                 /* log2 sector size in bytes */
 27 /* 0x0C */      uint32_t        log_sectors_per_block;          /* log2 # of sectors per block */
 28 /* 0x10 */      uint32_t        log_blocksize;                  /* log2 block size in bytes */
 29 /* 0x14 */      uint32_t        log_blocks_per_seg;             /* log2 # of blocks per segment */
 30 /* 0x18 */      uint32_t        segs_per_sec;                   /* # of segments per section */
 31 /* 0x1C */      uint32_t        secs_per_zone;                  /* # of sections per zone */
 32 /* 0x20 */      uint32_t        checksum_offset;                /* checksum offset inside super block */
 33 /* 0x24 */      uint64_t        block_count;                    /* total # of user blocks */
 34 /* 0x2C */      uint32_t        section_count;                  /* total # of sections */
 35 /* 0x30 */      uint32_t        segment_count;                  /* total # of segments */
 36 /* 0x34 */      uint32_t        segment_count_ckpt;             /* # of segments for checkpoint */
 37 /* 0x38 */      uint32_t        segment_count_sit;              /* # of segments for SIT */
 38 /* 0x3C */      uint32_t        segment_count_nat;              /* # of segments for NAT */
 39 /* 0x40 */      uint32_t        segment_count_ssa;              /* # of segments for SSA */
 40 /* 0x44 */      uint32_t        segment_count_main;             /* # of segments for main area */
 41 /* 0x48 */      uint32_t        segment0_blkaddr;               /* start block address of segment 0 */
 42 /* 0x4C */      uint32_t        cp_blkaddr;                     /* start block address of checkpoint */
 43 /* 0x50 */      uint32_t        sit_blkaddr;                    /* start block address of SIT */
 44 /* 0x54 */      uint32_t        nat_blkaddr;                    /* start block address of NAT */
 45 /* 0x58 */      uint32_t        ssa_blkaddr;                    /* start block address of SSA */
 46 /* 0x5C */      uint32_t        main_blkaddr;                   /* start block address of main area */
 47 /* 0x60 */      uint32_t        root_ino;                       /* root inode number */
 48 /* 0x64 */      uint32_t        node_ino;                       /* node inode number */
 49 /* 0x68 */      uint32_t        meta_ino;                       /* meta inode number */
 50 /* 0x6C */      uint8_t         uuid[F2FS_UUID_SIZE];           /* 128-bit uuid for volume */
 51 /* 0x7C */      uint16_t        volume_name[F2FS_LABEL_SIZE];   /* volume name */
 52 #if 0
 53 /* 0x47C */     uint32_t        extension_count;                /* # of extensions below */
 54 /* 0x480 */     uint8_t         extension_list[64][8];          /* extension array */
 55 #endif
 56 } __attribute__((packed));
 57 
 58 static int probe_f2fs(blkid_probe pr, const struct blkid_idmag *mag)
 59 {
 60         struct f2fs_super_block *sb;
 61         uint16_t major, minor;
 62 
 63         sb = blkid_probe_get_sb(pr, mag, struct f2fs_super_block);
 64         if (!sb)
 65                 return errno ? -errno : 1;
 66 
 67         major = le16_to_cpu(sb->major_ver);
 68         minor = le16_to_cpu(sb->minor_ver);
 69 
 70         /* For version 1.0 we cannot know the correct sb structure */
 71         if (major == 1 && minor == 0)
 72                 return 0;
 73 
 74         if (*((unsigned char *) sb->volume_name))
 75                 blkid_probe_set_utf8label(pr, (unsigned char *) sb->volume_name,
 76                                                 sizeof(sb->volume_name),
 77                                                 BLKID_ENC_UTF16LE);
 78 
 79         blkid_probe_set_uuid(pr, sb->uuid);
 80         blkid_probe_sprintf_version(pr, "%u.%u", major, minor);
 81         return 0;
 82 }
 83 
 84 const struct blkid_idinfo f2fs_idinfo =
 85 {
 86         .name           = "f2fs",
 87         .usage          = BLKID_USAGE_FILESYSTEM,
 88         .probefunc      = probe_f2fs,
 89         .magics         =
 90         {
 91                 {
 92                         .magic = F2FS_MAGIC,
 93                         .len = 4,
 94                         .kboff = F2FS_SB1_KBOFF,
 95                         .sboff = F2FS_MAGIC_OFF
 96                 },
 97                 { NULL }
 98         }
 99 };
100 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt