From: Benny Halevy <bhalevy@tonian.com>
To: Boaz Harrosh <bharrosh@panasas.com>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>,
Benny Halevy <bhalevy@panasas.com>,
Brent Welch <welch@panasas.com>,
NFS list <linux-nfs@vger.kernel.org>,
open-osd <osd-dev@open-osd.org>
Subject: Re: [PATCH 17/19] pnfs-obj: move to ore 01: ore_layout & ore_components
Date: Fri, 07 Oct 2011 13:26:49 -0400 [thread overview]
Message-ID: <4E8F3659.7090409@tonian.com> (raw)
In-Reply-To: <1317724581-27825-1-git-send-email-bharrosh@panasas.com>
On 2011-10-04 06:36, Boaz Harrosh wrote:
> For Ease of reviewing I split the move to ore into 3 parts
> move to ore 01: ore_layout & ore_components
> move to ore 02: move to ORE
> move to ore 03: Remove old raid engine
>
> This patch modifies the objio_lseg, layout-segment level
> and devices and components arrays to use the ORE types.
>
> Though it will be removed soon, also the raid engine
> is modified to actually compile, possibly run, with
> the new types. So it is the same old raid engine but
> with some new ORE types.
>
> For Ease of reviewing, some of the old code is
> "#if 0" but is not removed so the diff command works
> better. The old code will be removed in the 3rd patch.
>
> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Acked-by: Benny Halevy <bhalevy@tonian.com>
Thanks!
> ---
> fs/nfs/objlayout/objio_osd.c | 272 ++++++++++++++++++++----------------------
> 1 files changed, 128 insertions(+), 144 deletions(-)
>
> diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
> index 2347e0a..bd7ec26 100644
> --- a/fs/nfs/objlayout/objio_osd.c
> +++ b/fs/nfs/objlayout/objio_osd.c
> @@ -38,7 +38,7 @@
> */
>
> #include <linux/module.h>
> -#include <scsi/osd_initiator.h>
> +#include <scsi/osd_ore.h>
>
> #include "objlayout.h"
>
> @@ -52,7 +52,7 @@ enum { BIO_MAX_PAGES_KMALLOC =
>
> struct objio_dev_ent {
> struct nfs4_deviceid_node id_node;
> - struct osd_dev *od;
> + struct ore_dev od;
> };
>
> static void
> @@ -60,8 +60,8 @@ objio_free_deviceid_node(struct nfs4_deviceid_node *d)
> {
> struct objio_dev_ent *de = container_of(d, struct objio_dev_ent, id_node);
>
> - dprintk("%s: free od=%p\n", __func__, de->od);
> - osduld_put_device(de->od);
> + dprintk("%s: free od=%p\n", __func__, de->od.od);
> + osduld_put_device(de->od.od);
> kfree(de);
> }
>
> @@ -98,12 +98,12 @@ _dev_list_add(const struct nfs_server *nfss,
> nfss->pnfs_curr_ld,
> nfss->nfs_client,
> d_id);
> - de->od = od;
> + de->od.od = od;
>
> d = nfs4_insert_deviceid_node(&de->id_node);
> n = container_of(d, struct objio_dev_ent, id_node);
> if (n != de) {
> - dprintk("%s: Race with other n->od=%p\n", __func__, n->od);
> + dprintk("%s: Race with other n->od=%p\n", __func__, n->od.od);
> objio_free_deviceid_node(&de->id_node);
> de = n;
> }
> @@ -111,28 +111,11 @@ _dev_list_add(const struct nfs_server *nfss,
> return de;
> }
>
> -struct caps_buffers {
> - u8 caps_key[OSD_CRYPTO_KEYID_SIZE];
> - u8 creds[OSD_CAP_LEN];
> -};
> -
> struct objio_segment {
> struct pnfs_layout_segment lseg;
>
> - struct pnfs_osd_object_cred *comps;
> -
> - unsigned mirrors_p1;
> - unsigned stripe_unit;
> - unsigned group_width; /* Data stripe_units without integrity comps */
> - u64 group_depth;
> - unsigned group_count;
> -
> - unsigned max_io_size;
> -
> - unsigned comps_index;
> - unsigned num_comps;
> - /* variable length */
> - struct objio_dev_ent *ods[];
> + struct ore_layout layout;
> + struct ore_components oc;
> };
>
> static inline struct objio_segment *
> @@ -155,7 +138,8 @@ struct objio_state {
> loff_t offset;
> bool sync;
>
> - struct objio_segment *layout;
> + struct ore_layout *layout;
> + struct ore_components *oc;
>
> struct kref kref;
> objio_done_fn done;
> @@ -175,32 +159,33 @@ struct objio_state {
>
> /* Send and wait for a get_device_info of devices in the layout,
> then look them up with the osd_initiator library */
> -static struct objio_dev_ent *_device_lookup(struct pnfs_layout_hdr *pnfslay,
> - struct objio_segment *objio_seg, unsigned comp,
> - gfp_t gfp_flags)
> +static int objio_devices_lookup(struct pnfs_layout_hdr *pnfslay,
> + struct objio_segment *objio_seg, unsigned c, struct nfs4_deviceid *d_id,
> + gfp_t gfp_flags)
> {
> struct pnfs_osd_deviceaddr *deviceaddr;
> - struct nfs4_deviceid *d_id;
> struct objio_dev_ent *ode;
> struct osd_dev *od;
> struct osd_dev_info odi;
> int err;
>
> - d_id = &objio_seg->comps[comp].oc_object_id.oid_device_id;
> -
> ode = _dev_list_find(NFS_SERVER(pnfslay->plh_inode), d_id);
> - if (ode)
> - return ode;
> + if (ode) {
> + objio_seg->oc.ods[c] = &ode->od; /* must use container_of */
> + return 0;
> + }
>
> err = objlayout_get_deviceinfo(pnfslay, d_id, &deviceaddr, gfp_flags);
> if (unlikely(err)) {
> dprintk("%s: objlayout_get_deviceinfo dev(%llx:%llx) =>%d\n",
> __func__, _DEVID_LO(d_id), _DEVID_HI(d_id), err);
> - return ERR_PTR(err);
> + return err;
> }
>
> odi.systemid_len = deviceaddr->oda_systemid.len;
> if (odi.systemid_len > sizeof(odi.systemid)) {
> + dprintk("%s: odi.systemid_len > sizeof(systemid=%zd)\n",
> + __func__, sizeof(odi.systemid));
> err = -EINVAL;
> goto out;
> } else if (odi.systemid_len)
> @@ -225,38 +210,15 @@ static struct objio_dev_ent *_device_lookup(struct pnfs_layout_hdr *pnfslay,
>
> ode = _dev_list_add(NFS_SERVER(pnfslay->plh_inode), d_id, od,
> gfp_flags);
> -
> + objio_seg->oc.ods[c] = &ode->od; /* must use container_of */
> + dprintk("Adding new dev_id(%llx:%llx)\n",
> + _DEVID_LO(d_id), _DEVID_HI(d_id));
> out:
> - dprintk("%s: return=%d\n", __func__, err);
> objlayout_put_deviceinfo(deviceaddr);
> - return err ? ERR_PTR(err) : ode;
> -}
> -
> -static int objio_devices_lookup(struct pnfs_layout_hdr *pnfslay,
> - struct objio_segment *objio_seg,
> - gfp_t gfp_flags)
> -{
> - unsigned i;
> - int err;
> -
> - /* lookup all devices */
> - for (i = 0; i < objio_seg->num_comps; i++) {
> - struct objio_dev_ent *ode;
> -
> - ode = _device_lookup(pnfslay, objio_seg, i, gfp_flags);
> - if (unlikely(IS_ERR(ode))) {
> - err = PTR_ERR(ode);
> - goto out;
> - }
> - objio_seg->ods[i] = ode;
> - }
> - err = 0;
> -
> -out:
> - dprintk("%s: return=%d\n", __func__, err);
> return err;
> }
>
> +#if 0
> static int _verify_data_map(struct pnfs_osd_layout *layout)
> {
> struct pnfs_osd_data_map *data_map = &layout->olo_map;
> @@ -296,23 +258,45 @@ static int _verify_data_map(struct pnfs_osd_layout *layout)
>
> return 0;
> }
> +#endif
>
> -static void copy_single_comp(struct pnfs_osd_object_cred *cur_comp,
> - struct pnfs_osd_object_cred *src_comp,
> - struct caps_buffers *caps_p)
> +static void copy_single_comp(struct ore_components *oc, unsigned c,
> + struct pnfs_osd_object_cred *src_comp)
> {
> - WARN_ON(src_comp->oc_cap_key.cred_len > sizeof(caps_p->caps_key));
> - WARN_ON(src_comp->oc_cap.cred_len > sizeof(caps_p->creds));
> + struct ore_comp *ocomp = &oc->comps[c];
>
> - *cur_comp = *src_comp;
> + WARN_ON(src_comp->oc_cap_key.cred_len > 0); /* libosd is NO_SEC only */
> + WARN_ON(src_comp->oc_cap.cred_len > sizeof(ocomp->cred));
>
> - memcpy(caps_p->caps_key, src_comp->oc_cap_key.cred,
> - sizeof(caps_p->caps_key));
> - cur_comp->oc_cap_key.cred = caps_p->caps_key;
> + ocomp->obj.partition = src_comp->oc_object_id.oid_partition_id;
> + ocomp->obj.id = src_comp->oc_object_id.oid_object_id;
>
> - memcpy(caps_p->creds, src_comp->oc_cap.cred,
> - sizeof(caps_p->creds));
> - cur_comp->oc_cap.cred = caps_p->creds;
> + memcpy(ocomp->cred, src_comp->oc_cap.cred, sizeof(ocomp->cred));
> +}
> +
> +int __alloc_objio_seg(unsigned numdevs, gfp_t gfp_flags,
> + 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)) {
> + dprintk("%s: Faild allocation numdevs=%d size=%zd\n", __func__,
> + numdevs, sizeof(*aolseg));
> + 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;
> +
> + *pseg = &aolseg->olseg;
> + return 0;
> }
>
> int objio_alloc_lseg(struct pnfs_layout_segment **outp,
> @@ -324,59 +308,43 @@ int objio_alloc_lseg(struct pnfs_layout_segment **outp,
> struct objio_segment *objio_seg;
> struct pnfs_osd_xdr_decode_layout_iter iter;
> struct pnfs_osd_layout layout;
> - struct pnfs_osd_object_cred *cur_comp, src_comp;
> - struct caps_buffers *caps_p;
> + struct pnfs_osd_object_cred src_comp;
> + unsigned cur_comp;
> int err;
>
> err = pnfs_osd_xdr_decode_layout_map(&layout, &iter, xdr);
> if (unlikely(err))
> return err;
>
> - err = _verify_data_map(&layout);
> + err = __alloc_objio_seg(layout.olo_num_comps, gfp_flags, &objio_seg);
> if (unlikely(err))
> return err;
>
> - objio_seg = kzalloc(sizeof(*objio_seg) +
> - sizeof(objio_seg->ods[0]) * layout.olo_num_comps +
> - sizeof(*objio_seg->comps) * layout.olo_num_comps +
> - sizeof(struct caps_buffers) * layout.olo_num_comps,
> - gfp_flags);
> - if (!objio_seg)
> - return -ENOMEM;
> + objio_seg->layout.stripe_unit = layout.olo_map.odm_stripe_unit;
> + objio_seg->layout.group_width = layout.olo_map.odm_group_width;
> + objio_seg->layout.group_depth = layout.olo_map.odm_group_depth;
> + objio_seg->layout.mirrors_p1 = layout.olo_map.odm_mirror_cnt + 1;
> + objio_seg->layout.raid_algorithm = layout.olo_map.odm_raid_algorithm;
>
> - objio_seg->comps = (void *)(objio_seg->ods + layout.olo_num_comps);
> - cur_comp = objio_seg->comps;
> - caps_p = (void *)(cur_comp + layout.olo_num_comps);
> - while (pnfs_osd_xdr_decode_layout_comp(&src_comp, &iter, xdr, &err))
> - copy_single_comp(cur_comp++, &src_comp, caps_p++);
> + err = ore_verify_layout(layout.olo_map.odm_num_comps,
> + &objio_seg->layout);
> if (unlikely(err))
> goto err;
>
> - objio_seg->num_comps = layout.olo_num_comps;
> - objio_seg->comps_index = layout.olo_comps_index;
> - err = objio_devices_lookup(pnfslay, objio_seg, gfp_flags);
> - if (err)
> - goto err;
> -
> - objio_seg->mirrors_p1 = layout.olo_map.odm_mirror_cnt + 1;
> - objio_seg->stripe_unit = layout.olo_map.odm_stripe_unit;
> - if (layout.olo_map.odm_group_width) {
> - objio_seg->group_width = layout.olo_map.odm_group_width;
> - objio_seg->group_depth = layout.olo_map.odm_group_depth;
> - objio_seg->group_count = layout.olo_map.odm_num_comps /
> - objio_seg->mirrors_p1 /
> - objio_seg->group_width;
> - } else {
> - objio_seg->group_width = layout.olo_map.odm_num_comps /
> - objio_seg->mirrors_p1;
> - objio_seg->group_depth = -1;
> - objio_seg->group_count = 1;
> + objio_seg->oc.first_dev = layout.olo_comps_index;
> + cur_comp = 0;
> + while (pnfs_osd_xdr_decode_layout_comp(&src_comp, &iter, xdr, &err)) {
> + copy_single_comp(&objio_seg->oc, cur_comp, &src_comp);
> + err = objio_devices_lookup(pnfslay, objio_seg, cur_comp,
> + &src_comp.oc_object_id.oid_device_id,
> + gfp_flags);
> + if (err)
> + goto err;
> + ++cur_comp;
> }
> -
> - /* Cache this calculation it will hit for every page */
> - objio_seg->max_io_size = (BIO_MAX_PAGES_KMALLOC * PAGE_SIZE -
> - objio_seg->stripe_unit) *
> - objio_seg->group_width;
> + /* pnfs_osd_xdr_decode_layout_comp returns false on error */
> + if (unlikely(err))
> + goto err;
>
> *outp = &objio_seg->lseg;
> return 0;
> @@ -393,10 +361,14 @@ void objio_free_lseg(struct pnfs_layout_segment *lseg)
> int i;
> struct objio_segment *objio_seg = OBJIO_LSEG(lseg);
>
> - for (i = 0; i < objio_seg->num_comps; i++) {
> - if (!objio_seg->ods[i])
> + for (i = 0; i < objio_seg->oc.numdevs; i++) {
> + struct ore_dev *od = objio_seg->oc.ods[i];
> + struct objio_dev_ent *ode;
> +
> + if (!od)
> break;
> - nfs4_put_deviceid_node(&objio_seg->ods[i]->id_node);
> + ode = container_of(od, typeof(*ode), od);
> + nfs4_put_deviceid_node(&ode->id_node);
> }
> kfree(objio_seg);
> }
> @@ -411,8 +383,8 @@ objio_alloc_io_state(struct pnfs_layout_hdr *pnfs_layout_type,
> struct objio_state *ios;
> struct __alloc_objio_state {
> struct objio_state objios;
> - struct _objio_per_comp per_dev[objio_seg->num_comps];
> - struct pnfs_osd_ioerr ioerrs[objio_seg->num_comps];
> + struct _objio_per_comp per_dev[objio_seg->oc.numdevs];
> + struct pnfs_osd_ioerr ioerrs[objio_seg->oc.numdevs];
> } *aos;
>
> aos = kzalloc(sizeof(*aos), gfp_flags);
> @@ -421,8 +393,9 @@ objio_alloc_io_state(struct pnfs_layout_hdr *pnfs_layout_type,
>
> ios = &aos->objios;
>
> - ios->layout = objio_seg;
> - objlayout_init_ioerrs(&aos->objios.oir, objio_seg->num_comps,
> + ios->layout = &objio_seg->layout;
> + ios->oc = &objio_seg->oc;
> + objlayout_init_ioerrs(&aos->objios.oir, objio_seg->oc.numdevs,
> aos->ioerrs, rpcdata, pnfs_layout_type);
>
> ios->pages = pages;
> @@ -474,6 +447,27 @@ enum pnfs_osd_errno osd_pri_2_pnfs_err(enum osd_err_priority oep)
> }
> }
>
> +static void __on_dev_error(struct objio_state *ios, bool is_write,
> + struct ore_dev *od, unsigned dev_index, enum osd_err_priority oep,
> + u64 dev_offset, u64 dev_len)
> +{
> + struct objio_state *objios = ios->private;
> + struct pnfs_osd_objid pooid;
> + struct objio_dev_ent *ode = container_of(od, typeof(*ode), od);
> + /* FIXME: what to do with more-then-one-group layouts. We need to
> + * translate from ore_io_state index to oc->comps index
> + */
> + unsigned comp = dev_index;
> +
> + pooid.oid_device_id = ode->id_node.deviceid;
> + pooid.oid_partition_id = ios->oc->comps[comp].obj.partition;
> + pooid.oid_object_id = ios->oc->comps[comp].obj.id;
> +
> + objlayout_io_set_result(&objios->oir, comp,
> + &pooid, osd_pri_2_pnfs_err(oep),
> + dev_offset, dev_len, is_write);
> +}
> +
> static void _clear_bio(struct bio *bio)
> {
> struct bio_vec *bv;
> @@ -518,12 +512,9 @@ static int _io_check(struct objio_state *ios, bool is_write)
>
> continue; /* we recovered */
> }
> - objlayout_io_set_result(&ios->oir, i,
> - &ios->layout->comps[i].oc_object_id,
> - osd_pri_2_pnfs_err(osi.osd_err_pri),
> - ios->per_dev[i].offset,
> - ios->per_dev[i].length,
> - is_write);
> + __on_dev_error(ios, is_write, ios->oc->ods[i],
> + ios->per_dev[i].dev, osi.osd_err_pri,
> + ios->per_dev[i].offset, ios->per_dev[i].length);
>
> if (osi.osd_err_pri >= oep) {
> oep = osi.osd_err_pri;
> @@ -558,11 +549,11 @@ static void _io_free(struct objio_state *ios)
>
> struct osd_dev *_io_od(struct objio_state *ios, unsigned dev)
> {
> - unsigned min_dev = ios->layout->comps_index;
> - unsigned max_dev = min_dev + ios->layout->num_comps;
> + unsigned min_dev = ios->oc->first_dev;
> + unsigned max_dev = min_dev + ios->oc->numdevs;
>
> BUG_ON(dev < min_dev || max_dev <= dev);
> - return ios->layout->ods[dev - min_dev]->od;
> + return ios->oc->ods[dev - min_dev]->od;
> }
>
> struct _striping_info {
> @@ -820,12 +811,9 @@ static int _read_mirrors(struct objio_state *ios, unsigned cur_comp)
> struct osd_request *or = NULL;
> struct _objio_per_comp *per_dev = &ios->per_dev[cur_comp];
> unsigned dev = per_dev->dev;
> - struct pnfs_osd_object_cred *cred =
> - &ios->layout->comps[cur_comp];
> - struct osd_obj_id obj = {
> - .partition = cred->oc_object_id.oid_partition_id,
> - .id = cred->oc_object_id.oid_object_id,
> - };
> + struct ore_comp *cred =
> + &ios->oc->comps[cur_comp];
> + struct osd_obj_id obj = cred->obj;
> int ret;
>
> or = osd_start_request(_io_od(ios, dev), GFP_KERNEL);
> @@ -837,7 +825,7 @@ static int _read_mirrors(struct objio_state *ios, unsigned cur_comp)
>
> osd_req_read(or, &obj, per_dev->offset, per_dev->bio, per_dev->length);
>
> - ret = osd_finalize_request(or, 0, cred->oc_cap.cred, NULL);
> + ret = osd_finalize_request(or, 0, cred->cred, NULL);
> if (ret) {
> dprintk("%s: Faild to osd_finalize_request() => %d\n",
> __func__, ret);
> @@ -924,12 +912,8 @@ static int _write_mirrors(struct objio_state *ios, unsigned cur_comp)
>
> for (; cur_comp < last_comp; ++cur_comp, ++dev) {
> struct osd_request *or = NULL;
> - struct pnfs_osd_object_cred *cred =
> - &ios->layout->comps[cur_comp];
> - struct osd_obj_id obj = {
> - .partition = cred->oc_object_id.oid_partition_id,
> - .id = cred->oc_object_id.oid_object_id,
> - };
> + struct ore_comp *cred = &ios->oc->comps[cur_comp];
> + struct osd_obj_id obj = cred->obj;
> struct _objio_per_comp *per_dev = &ios->per_dev[cur_comp];
> struct bio *bio;
>
> @@ -964,7 +948,7 @@ static int _write_mirrors(struct objio_state *ios, unsigned cur_comp)
>
> osd_req_write(or, &obj, per_dev->offset, bio, per_dev->length);
>
> - ret = osd_finalize_request(or, 0, cred->oc_cap.cred, NULL);
> + ret = osd_finalize_request(or, 0, cred->cred, NULL);
> if (ret) {
> dprintk("%s: Faild to osd_finalize_request() => %d\n",
> __func__, ret);
> @@ -1030,7 +1014,7 @@ static bool objio_pg_test(struct nfs_pageio_descriptor *pgio,
> return false;
>
> return pgio->pg_count + req->wb_bytes <=
> - OBJIO_LSEG(pgio->pg_lseg)->max_io_size;
> + OBJIO_LSEG(pgio->pg_lseg)->layout.max_io_length;
> }
>
> static const struct nfs_pageio_ops objio_pg_read_ops = {
next prev parent reply other threads:[~2011-10-11 2:33 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-04 10:24 [PATCHSET 00/19] objlayout: Move to ORE Boaz Harrosh
2011-10-04 10:28 ` [PATCH 01/19] exofs: Rename struct ore_components comps => oc Boaz Harrosh
2011-10-04 10:28 ` [PATCH 02/19] exofs: Remove unused data_map member from exofs_sb_info Boaz Harrosh
2011-10-04 10:29 ` [PATCH 03/19] ore: Make ore_striping_info and ore_calc_stripe_info public Boaz Harrosh
2011-10-04 10:29 ` [PATCH 04/19] ore/exofs: Change the type of the devices array (API change) Boaz Harrosh
2011-10-04 10:30 ` [PATCH 05/19] ore: Only IO one group at a time " Boaz Harrosh
2011-10-04 10:30 ` [PATCH 06/19] ore: cleanup: Embed an ore_striping_info inside ore_io_state Boaz Harrosh
2011-10-04 10:31 ` [PATCH 07/19] ore: Remove check for ios->kern_buff in _prepare_for_striping to later Boaz Harrosh
2011-10-04 10:32 ` [PATCH 08/19] exofs: Support for short read/writes Boaz Harrosh
2011-10-04 10:32 ` [PATCH 09/19] ore: " Boaz Harrosh
2011-10-04 10:33 ` [PATCH 10/19] ore: Support for partial component table Boaz Harrosh
2011-10-04 10:34 ` [PATCH 11/19] ore/exofs: Define new ore_verify_layout Boaz Harrosh
2011-10-04 10:34 ` [PATCH 12/19] ore/exofs: Change ore_check_io API Boaz Harrosh
2011-10-04 10:34 ` [PATCH 13/19] pnfs-obj: Remove redundant EOF from objlayout_io_state Boaz Harrosh
2011-10-07 16:58 ` Benny Halevy
2011-10-04 10:35 ` [PATCH 14/19] pnfs-obj: Return PNFS_NOT_ATTEMPTED in case of read/write_pagelist Boaz Harrosh
2011-10-07 17:06 ` Benny Halevy
2011-10-04 10:35 ` [PATCH 15/19] pnfs-obj: Get rid of objlayout_{alloc,free}_io_state Boaz Harrosh
2011-10-07 17:17 ` Benny Halevy
2011-10-04 10:36 ` [PATCH 16/19] pnfs-obj: Rename objlayout_io_state => objlayout_io_res Boaz Harrosh
2011-10-04 12:20 ` Jim Rees
2011-10-04 12:27 ` Boaz Harrosh
2011-10-04 10:36 ` [PATCH 17/19] pnfs-obj: move to ore 01: ore_layout & ore_components Boaz Harrosh
2011-10-07 17:26 ` Benny Halevy [this message]
2011-10-04 10:36 ` [PATCH 18/19] pnfs-obj: move to ore 02: move to ORE Boaz Harrosh
2011-10-07 17:26 ` Benny Halevy
2011-10-04 10:37 ` [PATCH 19/19] pnfs-obj: move to ore 03: Remove old raid engine Boaz Harrosh
2011-10-07 17:27 ` Benny Halevy
2011-10-04 12:04 ` [PATCHSET 00/19] objlayout: Move to ORE Benny Halevy
2011-10-04 12:24 ` Boaz Harrosh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E8F3659.7090409@tonian.com \
--to=bhalevy@tonian.com \
--cc=Trond.Myklebust@netapp.com \
--cc=bhalevy@panasas.com \
--cc=bharrosh@panasas.com \
--cc=linux-nfs@vger.kernel.org \
--cc=osd-dev@open-osd.org \
--cc=welch@panasas.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).