2 * volume_id - reads filesystem label and uuid
4 * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation version 2 of the License.
26 #include "libvolume_id.h"
29 struct ufs_super_block {
52 uint32_t fs_maxcontig;
54 uint32_t fs_fragshift;
63 uint32_t fs_npsect_state;
64 uint32_t fs_interleave;
65 uint32_t fs_trackskew;
92 uint32_t fs_maxcluster;
94 uint16_t fs_opostbl[16][8];
98 uint8_t fs_volname[32];
102 uint32_t fs_ocsp[28];
103 uint32_t fs_contigdirs;
105 uint32_t fs_maxcluster;
109 int64_t fs_sparecon64[17];
110 int64_t fs_sblockloc;
111 struct ufs2_csum_total {
116 uint64_t cs_numclusters;
117 uint64_t cs_spare[3];
126 int64_t fs_pendingblocks;
127 int32_t fs_pendinginodes;
132 int32_t fs_sparecon[53];
134 int32_t fs_sparecon2[1];
136 uint32_t fs_qbmask[2];
137 uint32_t fs_qfmask[2];
140 int32_t fs_sparecon[53];
142 int32_t fs_sparecon2[1];
144 uint32_t fs_qbmask[2];
145 uint32_t fs_qfmask[2];
148 int32_t fs_sparecon[50];
149 int32_t fs_contigsumsize;
150 int32_t fs_maxsymlinklen;
152 uint32_t fs_maxfilesize[2];
153 uint32_t fs_qbmask[2];
154 uint32_t fs_qfmask[2];
158 int32_t fs_postblformat;
160 int32_t fs_postbloff;
166 #define UFS_MAGIC 0x00011954
167 #define UFS2_MAGIC 0x19540119
168 #define UFS_MAGIC_FEA 0x00195612
169 #define UFS_MAGIC_LFN 0x00095014
171 int volume_id_probe_ufs(struct volume_id *id, uint64_t off)
175 struct ufs_super_block *ufs;
176 int offsets[] = {0, 8, 64, 256, -1};
178 dbg("probing at offset 0x%llx", (unsigned long long) off);
180 for (i = 0; offsets[i] >= 0; i++) {
181 ufs = (struct ufs_super_block *) volume_id_get_buffer(id, off + (offsets[i] * 0x400), 0x800);
185 dbg("offset 0x%x", offsets[i] * 0x400);
186 magic = be32_to_cpu(ufs->fs_magic);
187 if ((magic == UFS_MAGIC) ||
188 (magic == UFS2_MAGIC) ||
189 (magic == UFS_MAGIC_FEA) ||
190 (magic == UFS_MAGIC_LFN)) {
191 dbg("magic 0x%08x(be)", magic);
194 magic = le32_to_cpu(ufs->fs_magic);
195 if ((magic == UFS_MAGIC) ||
196 (magic == UFS2_MAGIC) ||
197 (magic == UFS_MAGIC_FEA) ||
198 (magic == UFS_MAGIC_LFN)) {
199 dbg("magic 0x%08x(le)", magic);
206 volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);