From: NeilBrown Date: Wed, 1 Dec 2010 00:58:32 +0000 (+1100) Subject: Grow: disallow placing backup file on array being reshaped. X-Git-Tag: mdadm-3.1.5~32 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=48b1fc9ddbd1c4f6a5d0cb43d0290ea75dbdbc5f 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 --- diff --git a/Grow.c b/Grow.c index bcb84a88..61e7ab89 100644 --- a/Grow.c +++ b/Grow.c @@ -1051,6 +1051,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; @@ -1060,6 +1062,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 + 8 ; i++) { if (write(fdlist[d], buf, 512) != 512) {