Manage: Call validate_geometry when adding drive to external container
When adding drive to container call validate_geometry to verify whether drive is supported and can be addded to container. Remove unused parameters from validate_geometry_imsm_container(). There is no need to pass them. Don't calculate freesize if it is not mandatory. Make it configurable. Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
parent
8662f92d71
commit
1f5d54a06d
7
Manage.c
7
Manage.c
|
@ -992,6 +992,13 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if metadata handler is able to accept the drive */
|
||||||
|
if (!tst->ss->validate_geometry(tst, LEVEL_CONTAINER, 0, 1, NULL,
|
||||||
|
0, 0, dv->devname, NULL, 0, 1)) {
|
||||||
|
close(container_fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
Kill(dv->devname, NULL, 0, -1, 0);
|
Kill(dv->devname, NULL, 0, -1, 0);
|
||||||
dfd = dev_open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
|
dfd = dev_open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
|
||||||
if (tst->ss->add_to_super(tst, &disc, dfd,
|
if (tst->ss->add_to_super(tst, &disc, dfd,
|
||||||
|
|
|
@ -3475,10 +3475,11 @@ validate_geometry_ddf_container(struct supertype *st,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
if (freesize) {
|
||||||
*freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
|
*freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
|
||||||
if (*freesize == 0)
|
if (*freesize == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6652,8 +6652,7 @@ static int store_super_imsm(struct supertype *st, int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int validate_geometry_imsm_container(struct supertype *st, int level,
|
static int validate_geometry_imsm_container(struct supertype *st, int level,
|
||||||
int layout, int raiddisks, int chunk,
|
int raiddisks,
|
||||||
unsigned long long size,
|
|
||||||
unsigned long long data_offset,
|
unsigned long long data_offset,
|
||||||
char *dev,
|
char *dev,
|
||||||
unsigned long long *freesize,
|
unsigned long long *freesize,
|
||||||
|
@ -6725,8 +6724,8 @@ static int validate_geometry_imsm_container(struct supertype *st, int level,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (freesize)
|
||||||
*freesize = avail_size_imsm(st, ldsize >> 9, data_offset);
|
*freesize = avail_size_imsm(st, ldsize >> 9, data_offset);
|
||||||
rv = 1;
|
rv = 1;
|
||||||
exit:
|
exit:
|
||||||
if (super)
|
if (super)
|
||||||
|
@ -7586,15 +7585,11 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
||||||
* if given unused devices create a container
|
* if given unused devices create a container
|
||||||
* if given given devices in a container create a member volume
|
* if given given devices in a container create a member volume
|
||||||
*/
|
*/
|
||||||
if (level == LEVEL_CONTAINER) {
|
if (level == LEVEL_CONTAINER)
|
||||||
/* Must be a fresh device to add to a container */
|
/* Must be a fresh device to add to a container */
|
||||||
return validate_geometry_imsm_container(st, level, layout,
|
return validate_geometry_imsm_container(st, level, raiddisks,
|
||||||
raiddisks,
|
data_offset, dev,
|
||||||
*chunk,
|
freesize, verbose);
|
||||||
size, data_offset,
|
|
||||||
dev, freesize,
|
|
||||||
verbose);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Size is given in sectors.
|
* Size is given in sectors.
|
||||||
|
|
Loading…
Reference in New Issue