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:
Mariusz Tkaczyk 2021-05-17 16:39:03 +02:00 committed by Jes Sorensen
parent 8662f92d71
commit 1f5d54a06d
3 changed files with 19 additions and 16 deletions

View File

@ -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,

View File

@ -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;
} }

View File

@ -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.