btrfs-progs: btrfstune: allow to continue uuid change

When the 'btrfsune -u' command is interrupted, the final filesystem fsid
is not written to the superblock and it cannot be mounted. Too bad that
'btrfstune' cannot continue to finish the UUID change as it should.

This patch fixes that and passes the relaxed flags for superblock and
only warns when it detects the fsid mismatch. As this is something that
should be noted in case it would be needed for further debugging, it's
not just silent.

Signed-off-by: David Sterba <dsterba@suse.com>
master
David Sterba 2018-06-18 18:15:12 +02:00
parent 7faaca0d9f
commit a8985f549c
2 changed files with 13 additions and 7 deletions

View File

@ -474,7 +474,8 @@ int main(int argc, char *argv[])
return 1;
}
ret = check_mounted_where(fd, device, NULL, 0, NULL, SBREAD_DEFAULT);
ret = check_mounted_where(fd, device, NULL, 0, NULL,
SBREAD_IGNORE_FSID_MISMATCH);
if (ret < 0) {
error("could not check mount status of %s: %s", device,
strerror(-ret));
@ -521,9 +522,9 @@ int main(int argc, char *argv[])
if (random_fsid || new_fsid_str) {
if (!force) {
warning(
"it's highly recommended to run 'btrfs check' before this operation");
warning(
"also canceling running UUID change progress may cause corruption");
"it's recommended to run 'btrfs check --readonly' before this operation.\n"
"\tThe whole operation must finish before the filesystem can be mounted again.\n"
"\tIf cancelled or interrupted, run 'btrfstune -u' to restart.");
ret = ask_user("We are going to change UUID, are your sure?");
if (!ret) {
fprintf(stderr, "UUID change canceled\n");

View File

@ -1383,9 +1383,14 @@ static int check_super(struct btrfs_super_block *sb, unsigned sbflags)
uuid_unparse(sb->fsid, fsid);
uuid_unparse(sb->dev_item.fsid, dev_fsid);
error("dev_item UUID does not match fsid: %s != %s",
dev_fsid, fsid);
goto error_out;
if (sbflags & SBREAD_IGNORE_FSID_MISMATCH) {
warning("ignored: dev_item fsid mismatch: %s != %s",
dev_fsid, fsid);
} else {
error("dev_item UUID does not match fsid: %s != %s",
dev_fsid, fsid);
goto error_out;
}
}
/*