Skip to content

Commit

Permalink
ore: cleanup: Embed an ore_striping_info inside ore_io_state
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Boaz Harrosh committed Oct 14, 2011
1 parent b916c5c commit 9826075
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 37 deletions.
61 changes: 24 additions & 37 deletions fs/exofs/ore.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,9 @@ int ore_get_rw_state(struct ore_layout *layout, struct ore_components *oc,
ios->offset = offset;

if (length) {
struct ore_striping_info si;

ore_calc_stripe_info(layout, offset, &si);
ios->length = (length <= si.group_length) ? length :
si.group_length;
ore_calc_stripe_info(layout, offset, &ios->si);
ios->length = (length <= ios->si.group_length) ? length :
ios->si.group_length;
ios->nr_pages = (ios->length + PAGE_SIZE - 1) / PAGE_SIZE;
}

Expand Down Expand Up @@ -416,17 +414,36 @@ static int _add_stripe_unit(struct ore_io_state *ios, unsigned *cur_pg,
return 0;
}

static int _prepare_one_group(struct ore_io_state *ios, u64 length,
struct ore_striping_info *si)
static int _prepare_for_striping(struct ore_io_state *ios)
{
struct ore_striping_info *si = &ios->si;
unsigned stripe_unit = ios->layout->stripe_unit;
unsigned mirrors_p1 = ios->layout->mirrors_p1;
unsigned devs_in_group = ios->layout->group_width * mirrors_p1;
unsigned dev = si->dev;
unsigned first_dev = dev - (dev % devs_in_group);
unsigned cur_pg = ios->pages_consumed;
u64 length = ios->length;
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) {
unsigned comp = dev - first_dev;
struct ore_per_dev_state *per_dev = &ios->per_dev[comp];
Expand Down Expand Up @@ -469,36 +486,6 @@ static int _prepare_one_group(struct ore_io_state *ios, u64 length,
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 i, ret;
Expand Down
1 change: 1 addition & 0 deletions include/scsi/osd_ore.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ typedef void (*ore_io_done_fn)(struct ore_io_state *ios, void *private);

struct ore_io_state {
struct kref kref;
struct ore_striping_info si;

void *private;
ore_io_done_fn done;
Expand Down

0 comments on commit 9826075

Please sign in to comment.