From c82afc17a8fb132a4d0c843554a3b6135ac183b6 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 1 Dec 2010 11:58:32 +1100 Subject: [PATCH] Grow: disallow placing backup file on array being reshaped. the tests here aren't perfect, but they could catch some cases. Signed-off-by: NeilBrown --- Grow.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Grow.c b/Grow.c index 0515cfa1..e6055916 100644 --- a/Grow.c +++ b/Grow.c @@ -1646,6 +1646,8 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, } else { /* need to check backup file is large enough */ char buf[512]; + struct stat stb; + unsigned int dev; fdlist[d] = open(backup_file, O_RDWR|O_CREAT|O_EXCL, S_IRUSR | S_IWUSR); offsets[d] = 8 * 512; @@ -1655,6 +1657,22 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, rv = 1; break; } + /* Guard against backup file being on array device. + * If array is partitioned or if LVM etc is in the + * way this will not notice, but it is better than + * nothing. + */ + fstat(fdlist[d], &stb); + dev = stb.st_dev; + fstat(fd, &stb); + if (stb.st_rdev == dev) { + fprintf(stderr, Name ": backup file must NOT be" + " on the array being reshaped.\n"); + rv = 1; + close(fdlist[d]); + break; + } + memset(buf, 0, 512); for (i=0; i < (signed)blocks + 1 ; i++) { if (write(fdlist[d], buf, 512) != 512) { -- 2.39.2