Commit 3bd98568 authored by Boaz Harrosh's avatar Boaz Harrosh

ore: Support for partial component table

Users like the objlayout-driver would like to only pass
a partial device table that covers the IO in question.
For example exofs divides the file into raid-group-sized
chunks and only serves group_width number of devices at
a time.

The partiality is communicated by setting
ore_componets->first_dev and the array covers all logical
devices from oc->first_dev upto (oc->first_dev + oc->numdevs)

The ore_comp_dev() API receives a logical device index
and returns the actual present device in the table.
An out-of-range dev_index will BUG.

Logical device index is the theoretical device index as if
all the devices of a file are present. .i.e:
	total_devs = group_width * mirror_p1 * group_count
	0 <= dev_index < total_devs
Signed-off-by: default avatarBoaz Harrosh <bharrosh@panasas.com>
parent bbf9a31b
...@@ -217,6 +217,7 @@ static inline void exofs_init_comps(struct ore_components *oc, ...@@ -217,6 +217,7 @@ static inline void exofs_init_comps(struct ore_components *oc,
one_comp->obj.id = oid; one_comp->obj.id = oid;
exofs_make_credential(one_comp->cred, &one_comp->obj); exofs_make_credential(one_comp->cred, &one_comp->obj);
oc->first_dev = 0;
oc->numdevs = sbi->layout.group_width * sbi->layout.mirrors_p1 * oc->numdevs = sbi->layout.group_width * sbi->layout.mirrors_p1 *
sbi->layout.group_count; sbi->layout.group_count;
oc->single_comp = EC_SINGLE_COMP; oc->single_comp = EC_SINGLE_COMP;
......
...@@ -62,6 +62,10 @@ static struct osd_obj_id *_ios_obj(struct ore_io_state *ios, unsigned index) ...@@ -62,6 +62,10 @@ static struct osd_obj_id *_ios_obj(struct ore_io_state *ios, unsigned index)
static struct osd_dev *_ios_od(struct ore_io_state *ios, unsigned index) static struct osd_dev *_ios_od(struct ore_io_state *ios, unsigned index)
{ {
ORE_DBGMSG2("oc->first_dev=%d oc->numdevs=%d i=%d oc->ods=%p\n",
ios->oc->first_dev, ios->oc->numdevs, index,
ios->oc->ods);
return ore_comp_dev(ios->oc, index); return ore_comp_dev(ios->oc, index);
} }
......
...@@ -49,6 +49,7 @@ struct ore_dev { ...@@ -49,6 +49,7 @@ struct ore_dev {
}; };
struct ore_components { struct ore_components {
unsigned first_dev; /* First logical device no */
unsigned numdevs; /* Num of devices in array */ unsigned numdevs; /* Num of devices in array */
/* If @single_comp == EC_SINGLE_COMP, @comps points to a single /* If @single_comp == EC_SINGLE_COMP, @comps points to a single
* component. else there are @numdevs components * component. else there are @numdevs components
...@@ -70,14 +71,14 @@ struct ore_components { ...@@ -70,14 +71,14 @@ struct ore_components {
static inline struct osd_dev *ore_comp_dev( static inline struct osd_dev *ore_comp_dev(
const struct ore_components *oc, unsigned i) const struct ore_components *oc, unsigned i)
{ {
BUG_ON(oc->numdevs <= i); BUG_ON((i < oc->first_dev) || (oc->first_dev + oc->numdevs <= i));
return oc->ods[i]->od; return oc->ods[i - oc->first_dev]->od;
} }
static inline void ore_comp_set_dev( static inline void ore_comp_set_dev(
struct ore_components *oc, unsigned i, struct osd_dev *od) struct ore_components *oc, unsigned i, struct osd_dev *od)
{ {
oc->ods[i]->od = od; oc->ods[i - oc->first_dev]->od = od;
} }
struct ore_striping_info { struct ore_striping_info {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment