source: branches/3.2/mindi-busybox/util-linux/volume_id/ocfs2.c @ 3232

Last change on this file since 3232 was 3232, checked in by Bruno Cornec, 7 years ago
  • Update mindi-busybox to 1.21.1
  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1/*
2 * volume_id - reads filesystem label and uuid
3 *
4 * Copyright (C) Andre Masella <andre@masella.no-ip.org>
5 *
6 *  This library is free software; you can redistribute it and/or
7 *  modify it under the terms of the GNU Lesser General Public
8 *  License as published by the Free Software Foundation; either
9 *  version 2.1 of the License, or (at your option) any later version.
10 *
11 *  This library is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 *  Lesser General Public License for more details.
15 *
16 *  You should have received a copy of the GNU Lesser General Public
17 *  License along with this library; if not, write to the Free Software
18 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#include "volume_id_internal.h"
22
23/* All these values are taken from ocfs2-tools's ocfs2_fs.h */
24#define OCFS2_VOL_UUID_LEN          16
25#define OCFS2_MAX_VOL_LABEL_LEN         64
26#define OCFS2_SUPERBLOCK_OFFSET         0x2000
27
28
29/* This is the superblock. The OCFS2 header files have structs in structs.
30This is one has been simplified since we only care about the superblock.
31*/
32
33struct ocfs2_super_block {
34    uint8_t     i_signature[8];         /* Signature for validation */
35    uint32_t    i_generation;           /* Generation number */
36    int16_t     i_suballoc_slot;            /* Slot suballocator this inode belongs to */
37    uint16_t    i_suballoc_bit;         /* Bit offset in suballocator block group */
38    uint32_t    i_reserved0;
39    uint32_t    i_clusters;         /* Cluster count */
40    uint32_t    i_uid;              /* Owner UID */
41    uint32_t    i_gid;              /* Owning GID */
42    uint64_t    i_size;             /* Size in bytes */
43    uint16_t    i_mode;             /* File mode */
44    uint16_t    i_links_count;          /* Links count */
45    uint32_t    i_flags;                /* File flags */
46    uint64_t    i_atime;                /* Access time */
47    uint64_t    i_ctime;                /* Creation time */
48    uint64_t    i_mtime;                /* Modification time */
49    uint64_t    i_dtime;                /* Deletion time */
50    uint64_t    i_blkno;                /* Offset on disk, in blocks */
51    uint64_t    i_last_eb_blk;          /* Pointer to last extent block */
52    uint32_t    i_fs_generation;            /* Generation per fs-instance */
53    uint32_t    i_atime_nsec;
54    uint32_t    i_ctime_nsec;
55    uint32_t    i_mtime_nsec;
56    uint64_t    i_reserved1[9];
57    uint64_t    i_pad1;             /* Generic way to refer to this 64bit union */
58    /* Normally there is a union of the different block types, but we only care about the superblock. */
59    uint16_t    s_major_rev_level;
60    uint16_t    s_minor_rev_level;
61    uint16_t    s_mnt_count;
62    int16_t     s_max_mnt_count;
63    uint16_t    s_state;                /* File system state */
64    uint16_t    s_errors;               /* Behaviour when detecting errors */
65    uint32_t    s_checkinterval;            /* Max time between checks */
66    uint64_t    s_lastcheck;            /* Time of last check */
67    uint32_t    s_creator_os;           /* OS */
68    uint32_t    s_feature_compat;           /* Compatible feature set */
69    uint32_t    s_feature_incompat;     /* Incompatible feature set */
70    uint32_t    s_feature_ro_compat;        /* Readonly-compatible feature set */
71    uint64_t    s_root_blkno;           /* Offset, in blocks, of root directory dinode */
72    uint64_t    s_system_dir_blkno;     /* Offset, in blocks, of system directory dinode */
73    uint32_t    s_blocksize_bits;           /* Blocksize for this fs */
74    uint32_t    s_clustersize_bits;     /* Clustersize for this fs */
75    uint16_t    s_max_slots;            /* Max number of simultaneous mounts before tunefs required */
76    uint16_t    s_reserved1;
77    uint32_t    s_reserved2;
78    uint64_t    s_first_cluster_group;      /* Block offset of 1st cluster group header */
79    uint8_t     s_label[OCFS2_MAX_VOL_LABEL_LEN];   /* Label for mounting, etc. */
80    uint8_t     s_uuid[OCFS2_VOL_UUID_LEN]; /* 128-bit uuid */
81} PACKED;
82
83int FAST_FUNC volume_id_probe_ocfs2(struct volume_id *id /*,uint64_t off*/)
84{
85#define off ((uint64_t)0)
86    struct ocfs2_super_block *os;
87
88    dbg("probing at offset 0x%llx", (unsigned long long) off);
89
90    os = volume_id_get_buffer(id, off + OCFS2_SUPERBLOCK_OFFSET, 0x200);
91    if (os == NULL)
92        return -1;
93
94    if (memcmp(os->i_signature, "OCFSV2", 6) != 0) {
95        return -1;
96    }
97
98//  volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
99//  volume_id_set_label_raw(id, os->s_label, OCFS2_MAX_VOL_LABEL_LEN < VOLUME_ID_LABEL_SIZE ?
100//                  OCFS2_MAX_VOL_LABEL_LEN : VOLUME_ID_LABEL_SIZE);
101    volume_id_set_label_string(id, os->s_label, OCFS2_MAX_VOL_LABEL_LEN < VOLUME_ID_LABEL_SIZE ?
102                    OCFS2_MAX_VOL_LABEL_LEN : VOLUME_ID_LABEL_SIZE);
103    volume_id_set_uuid(id, os->s_uuid, UUID_DCE);
104    IF_FEATURE_BLKID_TYPE(id->type = "ocfs2";)
105    return 0;
106}
Note: See TracBrowser for help on using the repository browser.