ore: cleanup: Embed an ore_striping_info inside ore_io_state
Now that each ore_io_state covers only a single raid group. A single striping_info math is needed. Embed one inside ore_io_state to cache the calculation results and eliminate an extra call. Also the outer _prepare_for_striping is removed since it does nothing. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
This commit is contained in:
parent
b916c5cd4d
commit
9826075404
|
@ -121,11 +121,9 @@ int ore_get_rw_state(struct ore_layout *layout, struct ore_components *oc,
|
||||||
ios->offset = offset;
|
ios->offset = offset;
|
||||||
|
|
||||||
if (length) {
|
if (length) {
|
||||||
struct ore_striping_info si;
|
ore_calc_stripe_info(layout, offset, &ios->si);
|
||||||
|
ios->length = (length <= ios->si.group_length) ? length :
|
||||||
ore_calc_stripe_info(layout, offset, &si);
|
ios->si.group_length;
|
||||||
ios->length = (length <= si.group_length) ? length :
|
|
||||||
si.group_length;
|
|
||||||
ios->nr_pages = (ios->length + PAGE_SIZE - 1) / PAGE_SIZE;
|
ios->nr_pages = (ios->length + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,17 +414,36 @@ static int _add_stripe_unit(struct ore_io_state *ios, unsigned *cur_pg,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _prepare_one_group(struct ore_io_state *ios, u64 length,
|
static int _prepare_for_striping(struct ore_io_state *ios)
|
||||||
struct ore_striping_info *si)
|
|
||||||
{
|
{
|
||||||
|
struct ore_striping_info *si = &ios->si;
|
||||||
unsigned stripe_unit = ios->layout->stripe_unit;
|
unsigned stripe_unit = ios->layout->stripe_unit;
|
||||||
unsigned mirrors_p1 = ios->layout->mirrors_p1;
|
unsigned mirrors_p1 = ios->layout->mirrors_p1;
|
||||||
unsigned devs_in_group = ios->layout->group_width * mirrors_p1;
|
unsigned devs_in_group = ios->layout->group_width * mirrors_p1;
|
||||||
unsigned dev = si->dev;
|
unsigned dev = si->dev;
|
||||||
unsigned first_dev = dev - (dev % devs_in_group);
|
unsigned first_dev = dev - (dev % devs_in_group);
|
||||||
unsigned cur_pg = ios->pages_consumed;
|
unsigned cur_pg = ios->pages_consumed;
|
||||||
|
u64 length = ios->length;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!ios->pages) {
|
||||||
|
if (ios->kern_buff) {
|
||||||
|
struct ore_per_dev_state *per_dev = &ios->per_dev[0];
|
||||||
|
|
||||||
|
per_dev->offset = si->obj_offset;
|
||||||
|
per_dev->dev = si->dev;
|
||||||
|
|
||||||
|
/* no cross device without page array */
|
||||||
|
BUG_ON((ios->layout->group_width > 1) &&
|
||||||
|
(si->unit_off + ios->length >
|
||||||
|
ios->layout->stripe_unit));
|
||||||
|
}
|
||||||
|
ios->numdevs = ios->layout->mirrors_p1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BUG_ON(length > si->group_length);
|
||||||
|
|
||||||
while (length) {
|
while (length) {
|
||||||
unsigned comp = dev - first_dev;
|
unsigned comp = dev - first_dev;
|
||||||
struct ore_per_dev_state *per_dev = &ios->per_dev[comp];
|
struct ore_per_dev_state *per_dev = &ios->per_dev[comp];
|
||||||
|
@ -469,36 +486,6 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _prepare_for_striping(struct ore_io_state *ios)
|
|
||||||
{
|
|
||||||
struct ore_striping_info si;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!ios->pages) {
|
|
||||||
if (ios->kern_buff) {
|
|
||||||
struct ore_per_dev_state *per_dev = &ios->per_dev[0];
|
|
||||||
|
|
||||||
ore_calc_stripe_info(ios->layout, ios->offset, &si);
|
|
||||||
per_dev->offset = si.obj_offset;
|
|
||||||
per_dev->dev = si.dev;
|
|
||||||
|
|
||||||
/* no cross device without page array */
|
|
||||||
BUG_ON((ios->layout->group_width > 1) &&
|
|
||||||
(si.unit_off + ios->length >
|
|
||||||
ios->layout->stripe_unit));
|
|
||||||
}
|
|
||||||
ios->numdevs = ios->layout->mirrors_p1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ore_calc_stripe_info(ios->layout, ios->offset, &si);
|
|
||||||
|
|
||||||
BUG_ON(ios->length > si.group_length);
|
|
||||||
ret = _prepare_one_group(ios, ios->length, &si);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ore_create(struct ore_io_state *ios)
|
int ore_create(struct ore_io_state *ios)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
|
@ -93,6 +93,7 @@ typedef void (*ore_io_done_fn)(struct ore_io_state *ios, void *private);
|
||||||
|
|
||||||
struct ore_io_state {
|
struct ore_io_state {
|
||||||
struct kref kref;
|
struct kref kref;
|
||||||
|
struct ore_striping_info si;
|
||||||
|
|
||||||
void *private;
|
void *private;
|
||||||
ore_io_done_fn done;
|
ore_io_done_fn done;
|
||||||
|
|
Loading…
Reference in New Issue