static int uuid_f( int argc, char **argv) { char bp[40]; xfs_agnumber_t agno; uuid_t uu; uuid_t *uup = NULL; if (argc != 1 && argc != 2) { dbprintf(_("invalid parameters\n")); return 0; } if (argc == 2) { /* WRITE UUID */ if ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode) { dbprintf(_("%s: not in expert mode, writing disabled\n"), progname); return 0; } if (!strcasecmp(argv[1], "generate")) { platform_uuid_generate(&uu); } else if (!strcasecmp(argv[1], "nil")) { platform_uuid_clear(&uu); } else if (!strcasecmp(argv[1], "rewrite")) { uup = do_uuid(0, NULL); if (!uup) { dbprintf(_("failed to read UUID from AG 0\n")); return 0; } memcpy(&uu, uup, sizeof(uuid_t)); platform_uuid_unparse(&uu, bp); dbprintf(_("old UUID = %s\n"), bp); } else if (!strcasecmp(argv[1], "restore")) { xfs_sb_t tsb; if (!get_sb(0, &tsb)) return 0; /* Not set; nothing to do. Success! */ if (!xfs_sb_version_hasmetauuid(&tsb)) return 0; memcpy(&uu, mp->m_sb.sb_meta_uuid, sizeof(uuid_t)); } else { if (platform_uuid_parse(argv[1], &uu)) { dbprintf(_("invalid UUID\n")); return 0; } } /* clear the log (setting uuid) if it's not dirty */ if (!sb_logzero(&uu)) return 0; dbprintf(_("writing all SBs\n")); for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) if (!do_uuid(agno, &uu)) { dbprintf(_("failed to set UUID in AG %d\n"), agno); break; } platform_uuid_unparse(&uu, bp); dbprintf(_("new UUID = %s\n"), bp); return 0; } else { /* READ+CHECK UUID */ for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { uup = do_uuid(agno, NULL); if (!uup) { dbprintf(_("failed to read UUID from AG %d\n"), agno); return 0; } if (agno) { if (memcmp(&uu, uup, sizeof(uuid_t))) { dbprintf(_("warning: UUID in AG %d " "differs to the primary SB\n"), agno); break; } } else { memcpy(&uu, uup, sizeof(uuid_t)); } } if (mp->m_sb.sb_logstart) { if (x.logdev && x.logdev != x.ddev) dbprintf(_("warning - external log specified " "for FS with an internal log\n")); } else if (!x.logdev || (x.logdev == x.ddev)) { dbprintf(_("warning - no external log specified " "for FS with an external log\n")); } platform_uuid_unparse(&uu, bp); dbprintf(_("UUID = %s\n"), bp); } return 0; }
static int uuid_f( int argc, char **argv) { char bp[40]; xfs_agnumber_t agno; uuid_t uu; uuid_t *uup=NULL; if (argc != 1 && argc != 2) { dbprintf("invalid parameters\n"); return 0; } if (argc==2) { /* write uuid */ if (flag_readonly || !flag_expert_mode) { dbprintf("%s not started in read-write expert mode, writing disabled\n", progname); return 0; } if (!strcasecmp(argv[1], "generate")) { uuid_generate(uu); } else if (!strcasecmp(argv[1], "nil")) { uuid_clear(uu); } else if (!strcasecmp(argv[1], "rewrite")) { uup=do_uuid(0, NULL); if (!uup) { dbprintf("failed to read UUID from AG 0\n"); return 0; } memcpy(&uu, *uup, sizeof(uuid_t)); uuid_unparse(uu, bp); dbprintf("old uuid = %s\n", bp); } else { if (uuid_parse(argv[1], uu)) { dbprintf("invalid uuid\n"); return 0; } } if (mp->m_sb.sb_logstart) { if (xfsargs.logdev) { dbprintf("external log specified for FS with internal log - aborting \n"); return 0; } } else { if (!xfsargs.logdev) { dbprintf("no external log specified for FS with external log - aborting\n"); return 0; } } dbprintf("clearing log and setting uuid\n"); /* clear log (setting uuid) */ if (libxfs_log_clear( (mp->m_sb.sb_logstart)?xfsargs.ddev:xfsargs.logdev, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), &uu, XLOG_FMT)) { dbprintf("error clearing log\n"); return 0; } dbprintf("writing all SBs\n"); for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) if (!do_uuid(agno, &uu)) { dbprintf("failed to set uuid in AG %d\n", agno); break; } uuid_unparse(uu, bp); dbprintf("new uuid = %s\n", bp); return 0; } else { /* get (check) uuid */ for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { uup=do_uuid(agno, NULL); if (!uup) { dbprintf("failed to read UUID from AG %d\n", agno); return 0; } if (agno) { if (memcmp(&uu, uup, sizeof(uuid_t))) { dbprintf("warning: uuid copies differ\n"); break; } } else { memcpy(uu, uup, sizeof(uuid_t)); } } if (mp->m_sb.sb_logstart) { if (xfsargs.logdev) dbprintf("warning: external log specified for FS with internal log\n"); } else { if (!xfsargs.logdev) { dbprintf("warning: no external log specified for FS with external log\n"); } } uuid_unparse(uu, bp); dbprintf("uuid = %s\n", bp); } return 0; }