2 * volume_id - reads filesystem label and uuid
4 * Copyright (C) Andre Masella <andre@masella.no-ip.org>
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.
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.
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
21 #include "volume_id_internal.h"
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
29 /* This is the superblock. The OCFS2 header files have structs in structs.
30 This is one has been simplified since we only care about the superblock.
33 struct 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 */
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
;
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 */
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 */
83 int FAST_FUNC
volume_id_probe_ocfs2(struct volume_id
*id
/*,uint64_t off*/)
85 #define off ((uint64_t)0)
86 struct ocfs2_super_block
*os
;
88 dbg("probing at offset 0x%llx", (unsigned long long) off
);
90 os
= volume_id_get_buffer(id
, off
+ OCFS2_SUPERBLOCK_OFFSET
, 0x200);
94 if (memcmp(os
->i_signature
, "OCFSV2", 6) != 0) {
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";)