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:
parent
0f3bd5b6c4
commit
48b1fc9ddb
18
Grow.c
18
Grow.c
|
@ -1051,6 +1051,8 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||||
} else {
|
} else {
|
||||||
/* need to check backup file is large enough */
|
/* need to check backup file is large enough */
|
||||||
char buf[512];
|
char buf[512];
|
||||||
|
struct stat stb;
|
||||||
|
unsigned int dev;
|
||||||
fdlist[d] = open(backup_file, O_RDWR|O_CREAT|O_EXCL,
|
fdlist[d] = open(backup_file, O_RDWR|O_CREAT|O_EXCL,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR);
|
||||||
offsets[d] = 8 * 512;
|
offsets[d] = 8 * 512;
|
||||||
|
@ -1060,6 +1062,22 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||||
rv = 1;
|
rv = 1;
|
||||||
break;
|
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);
|
memset(buf, 0, 512);
|
||||||
for (i=0; i < (signed)blocks + 8 ; i++) {
|
for (i=0; i < (signed)blocks + 8 ; i++) {
|
||||||
if (write(fdlist[d], buf, 512) != 512) {
|
if (write(fdlist[d], buf, 512) != 512) {
|
||||||
|
|
Loading…
Reference in New Issue