*
* Copyright (C) 2006 Red Hat, Inc. <redhat.com>
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation version 2 of the License.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include "libvolume_id.h"
-#include "util.h"
+#include "libvolume_id-private.h"
/* Common gfs/gfs2 constants: */
#define GFS_MAGIC 0x01161970
char sb_lockproto[GFS_LOCKNAME_LEN];
char sb_locktable[GFS_LOCKNAME_LEN];
- /* In gfs1, quota and license dinodes followed */
+
+ struct gfs2_inum __pad3; /* Was quota inode in gfs1 */
+ struct gfs2_inum __pad4; /* Was licence inode in gfs1 */
+ uint8_t sb_uuid[16]; /* The UUID maybe 0 for backwards compat */
} PACKED;
+static int uuid_non_zero(const uint8_t *p)
+{
+ int i;
+ for (i = 0; i < 16; i++) {
+ if (p[i] != 0)
+ return 1;
+ }
+ return 0;
+}
+
static int volume_id_probe_gfs_generic(struct volume_id *id, uint64_t off, int vers)
{
struct gfs2_sb *sbd;
- info("probing at offset 0x%llx\n", (unsigned long long) off);
+ info("probing at offset 0x%" PRIx64 "\n", off);
sbd = (struct gfs2_sb *)
volume_id_get_buffer(id, off + GFS_SUPERBLOCK_OFFSET, sizeof(struct gfs2_sb));
return -1;
if (be32_to_cpu(sbd->sb_header.mh_magic) == GFS_MAGIC &&
- be32_to_cpu(sbd->sb_header.mh_type) == GFS_METATYPE_SB &&
- be32_to_cpu(sbd->sb_header.mh_format) == GFS_FORMAT_SB) {
+ be32_to_cpu(sbd->sb_header.mh_type) == GFS_METATYPE_SB) {
if (vers == 1) {
if (be32_to_cpu(sbd->sb_fs_format) != GFS_FORMAT_FS ||
be32_to_cpu(sbd->sb_multihost_format) != GFS_FORMAT_MULTI)
}
else
return -1;
+
+ if (strlen(sbd->sb_locktable)) {
+ uint8_t *label = (uint8_t *) sbd->sb_locktable;
+
+ volume_id_set_label_raw(id, label, GFS_LOCKNAME_LEN);
+ volume_id_set_label_string(id, label, GFS_LOCKNAME_LEN);
+ }
+ if (vers == 2 && uuid_non_zero(sbd->sb_uuid))
+ volume_id_set_uuid(id, sbd->sb_uuid, 0, UUID_DCE);
strcpy(id->type_version, "1");
volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
return 0;