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 <neilb@suse.de>
This commit is contained in:
NeilBrown 2010-12-01 11:58:32 +11:00
parent 87f26d14f7
commit c82afc17a8
1 changed files with 18 additions and 0 deletions

18
Grow.c
View File

@ -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) {