|
@@ -205,25 +205,36 @@ static void copy_single_comp(struct ore_components *oc, unsigned c,
|
|
int __alloc_objio_seg(unsigned numdevs, gfp_t gfp_flags,
|
|
int __alloc_objio_seg(unsigned numdevs, gfp_t gfp_flags,
|
|
struct objio_segment **pseg)
|
|
struct objio_segment **pseg)
|
|
{
|
|
{
|
|
- struct __alloc_objio_segment {
|
|
|
|
- struct objio_segment olseg;
|
|
|
|
- struct ore_dev *ods[numdevs];
|
|
|
|
- struct ore_comp comps[numdevs];
|
|
|
|
- } *aolseg;
|
|
|
|
-
|
|
|
|
- aolseg = kzalloc(sizeof(*aolseg), gfp_flags);
|
|
|
|
- if (unlikely(!aolseg)) {
|
|
|
|
|
|
+/* This is the in memory structure of the objio_segment
|
|
|
|
+ *
|
|
|
|
+ * struct __alloc_objio_segment {
|
|
|
|
+ * struct objio_segment olseg;
|
|
|
|
+ * struct ore_dev *ods[numdevs];
|
|
|
|
+ * struct ore_comp comps[numdevs];
|
|
|
|
+ * } *aolseg;
|
|
|
|
+ * NOTE: The code as above compiles and runs perfectly. It is elegant,
|
|
|
|
+ * type safe and compact. At some Past time Linus has decided he does not
|
|
|
|
+ * like variable length arrays, For the sake of this principal we uglify
|
|
|
|
+ * the code as below.
|
|
|
|
+ */
|
|
|
|
+ struct objio_segment *lseg;
|
|
|
|
+ size_t lseg_size = sizeof(*lseg) +
|
|
|
|
+ numdevs * sizeof(lseg->oc.ods[0]) +
|
|
|
|
+ numdevs * sizeof(*lseg->oc.comps);
|
|
|
|
+
|
|
|
|
+ lseg = kzalloc(lseg_size, gfp_flags);
|
|
|
|
+ if (unlikely(!lseg)) {
|
|
dprintk("%s: Faild allocation numdevs=%d size=%zd\n", __func__,
|
|
dprintk("%s: Faild allocation numdevs=%d size=%zd\n", __func__,
|
|
- numdevs, sizeof(*aolseg));
|
|
|
|
|
|
+ numdevs, lseg_size);
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
- aolseg->olseg.oc.numdevs = numdevs;
|
|
|
|
- aolseg->olseg.oc.single_comp = EC_MULTPLE_COMPS;
|
|
|
|
- aolseg->olseg.oc.comps = aolseg->comps;
|
|
|
|
- aolseg->olseg.oc.ods = aolseg->ods;
|
|
|
|
|
|
+ lseg->oc.numdevs = numdevs;
|
|
|
|
+ lseg->oc.single_comp = EC_MULTPLE_COMPS;
|
|
|
|
+ lseg->oc.ods = (void *)(lseg + 1);
|
|
|
|
+ lseg->oc.comps = (void *)(lseg->oc.ods + numdevs);
|
|
|
|
|
|
- *pseg = &aolseg->olseg;
|
|
|
|
|
|
+ *pseg = lseg;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|