pd->used_pdes = __cpu_to_be16(0);
pd->max_pdes = __cpu_to_be16(max_phys_disks);
memset(pd->pad, 0xff, 52);
+ for (i = 0; i < max_phys_disks; i++)
+ memset(pd->entries[i].guid, 0xff, DDF_GUID_LEN);
if (posix_memalign((void**)&vd, 512, vdsize) != 0) {
pr_err("%s could not allocate vd\n", __func__);
ddf_set_updates_pending(ddf);
}
+static unsigned int find_unused_pde(const struct ddf_super *ddf)
+{
+ unsigned int i;
+ for (i = 0; i < __be16_to_cpu(ddf->phys->max_pdes); i++) {
+ if (all_ff(ddf->phys->entries[i].guid))
+ return i;
+ }
+ return DDF_NOTFOUND;
+}
+
/* add a device to a container, either while creating it or while
* expanding a pre-existing container
*/
* a phys_disk entry and a more detailed disk_data entry.
*/
fstat(fd, &stb);
+ n = find_unused_pde(ddf);
+ if (n == DDF_NOTFOUND) {
+ pr_err("%s: No free slot in array, cannot add disk\n",
+ __func__);
+ return 1;
+ }
+ pde = &ddf->phys->entries[n];
+
if (posix_memalign((void**)&dd, 512,
sizeof(*dd) + sizeof(dd->vlist[0]) * ddf->max_part) != 0) {
pr_err("%s could allocate buffer for new disk, aborting\n",
for (i = 0; i < ddf->max_part ; i++)
dd->vlist[i] = NULL;
- n = __be16_to_cpu(ddf->phys->used_pdes);
- pde = &ddf->phys->entries[n];
dd->pdnum = n;
if (st->update_tail) {
pd->used_pdes = __cpu_to_be16(n);
pde = &pd->entries[0];
dd->mdupdate = pd;
- } else {
- n++;
- ddf->phys->used_pdes = __cpu_to_be16(n);
- }
+ } else
+ ddf->phys->used_pdes = __cpu_to_be16(
+ 1 + __be16_to_cpu(ddf->phys->used_pdes));
memcpy(pde->guid, dd->disk.guid, DDF_GUID_LEN);
pde->refnum = dd->disk.refnum;