From 8497534a20d30a133751b5edb8334dbebfc5f749 Mon Sep 17 00:00:00 2001 From: Boaz Harrosh Date: Sun, 2 Oct 2011 15:32:50 +0200 Subject: [PATCH] --- yaml --- r: 269229 b: refs/heads/master c: 98260754046eee4cc7d75751a4a20182ade39f58 h: refs/heads/master i: 269227: 7e4d82f287d5a6a23ac6c916f91ea4c2577e3466 v: v3 --- [refs] | 2 +- trunk/fs/exofs/ore.c | 61 ++++++++++++++---------------------- trunk/include/scsi/osd_ore.h | 1 + 3 files changed, 26 insertions(+), 38 deletions(-) diff --git a/[refs] b/[refs] index eac7cb39edb5..5336598adcbd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b916c5cd4d895a27b47a652648958f73e4f23ac6 +refs/heads/master: 98260754046eee4cc7d75751a4a20182ade39f58 diff --git a/trunk/fs/exofs/ore.c b/trunk/fs/exofs/ore.c index c1c2cc607adf..7e02d33b5e5c 100644 --- a/trunk/fs/exofs/ore.c +++ b/trunk/fs/exofs/ore.c @@ -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; } @@ -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]; @@ -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; diff --git a/trunk/include/scsi/osd_ore.h b/trunk/include/scsi/osd_ore.h index 8fefdfbb1ced..baeef0200a1f 100644 --- a/trunk/include/scsi/osd_ore.h +++ b/trunk/include/scsi/osd_ore.h @@ -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;