*
* 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 "libvolume_id.h"
#include "libvolume_id-private.h"
-#include "util.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));
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;