]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Dump: get stat from a wrong metadata file when restoring metadata
authorLidong Zhong <lidong.zhong@suse.com>
Mon, 14 Dec 2020 14:51:33 +0000 (22:51 +0800)
committerJes Sorensen <jsorensen@fb.com>
Sun, 20 Dec 2020 18:45:30 +0000 (13:45 -0500)
The dumped metadata files are shown as below
localhost:~ # ll -ih test/
total 16K
34565564 -rw-r--r-- 2 root root 1.0G Dec 14 21:15
scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-3
34565563 -rw-r--r-- 2 root root 1.0G Dec 14 21:15
scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-4
34565563 -rw-r--r-- 2 root root 1.0G Dec 14 21:15 sda
34565564 -rw-r--r-- 2 root root 1.0G Dec 14 21:15 sdb

It reports such error when trying to restore metadata for /dev/sda
localhost:~ # mdadm --restore=test /dev/sda
mdadm: test/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-4 is not the same
size as /dev/sda - cannot restore.
It's because the stb value has been changed to other metadata file in
the while statement.

Signed-off-by: Lidong Zhong <lidong.zhong@suse.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
Dump.c

diff --git a/Dump.c b/Dump.c
index 38e8f238a156f22b61b0e8dd8f89f62abed1d607..736bcb608496b355e33f77aa92cbf7f31c2ffe9d 100644 (file)
--- a/Dump.c
+++ b/Dump.c
@@ -272,6 +272,11 @@ int Restore_metadata(char *dev, char *dir, struct context *c,
                       fname);
                goto err;
        }
+       if (stat(fname, &stb) != 0) {
+               pr_err("Could not stat %s for --restore.\n",
+                      fname);
+               goto err;
+       }
        if (((unsigned long long)stb.st_size) != size) {
                pr_err("%s is not the same size as %s - cannot restore.\n",
                       fname, dev);