linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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 15/19] pnfs-obj: Get rid of objlayout_{alloc,free}_io_state
Date: Fri, 07 Oct 2011 13:17:49 -0400	[thread overview]
Message-ID: <4E8F343D.8080408@tonian.com> (raw)
In-Reply-To: <1317724539-27764-1-git-send-email-bharrosh@panasas.com>

On 2011-10-04 06:35, Boaz Harrosh wrote:
> This is part of moving objio_osd to use the ORE.
> 
> objlayout_io_state had two functions:
> 1. It was used in the error reporting mechanism at layout_return.
>    This function is kept intact.
>    (Later patch will rename objlayout_io_state => objlayout_io_res)
> 2. Carrier of rw io members into the objio_read/write_paglist API.
>    This is removed in this patch.
> 
> The {r,w}data received from NFS are passed directly to the
> objio_{read,write}_paglist API. The io_engine is now allocating
> it's own IO state as part of the read/write. The minimal
> functionality that was part of the generic allocation is passed
> to the io_engine.
> 
> So part of this patch is rename of:
> 	ios->ol_state.foo => ios->foo
> 
> At objlayout_{read,write}_done an objlayout_io_state is passed that
> denotes the result of the IO. (Hence the later name change).
> If the IO is successful objlayout calls an objio_free_result() API
> immediately (Which for objio_osd causes the release of the io_state).
> If the IO ended in an error it is hanged onto until reported in
> layout_return and is released later through the objio_free_result()
> API. (All this is not new just renamed and cleaned)
> 
> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>

Reviewed-by: Benny Halevy <bhalevy@tonian.com>

Thanks!

> ---
>  fs/nfs/objlayout/objio_osd.c |   94 ++++++++++++++++++++++----------
>  fs/nfs/objlayout/objlayout.c |  124 +++++++++++-------------------------------
>  fs/nfs/objlayout/objlayout.h |   36 ++++++-------
>  3 files changed, 112 insertions(+), 142 deletions(-)
> 
> diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
> index 0c7c9ec..48eb91a 100644
> --- a/fs/nfs/objlayout/objio_osd.c
> +++ b/fs/nfs/objlayout/objio_osd.c
> @@ -148,6 +148,13 @@ struct objio_state {
>  	/* Generic layer */
>  	struct objlayout_io_state ol_state;
>  
> +	struct page **pages;
> +	unsigned pgbase;
> +	unsigned nr_pages;
> +	unsigned long count;
> +	loff_t offset;
> +	bool sync;
> +
>  	struct objio_segment *layout;
>  
>  	struct kref kref;
> @@ -394,30 +401,43 @@ void objio_free_lseg(struct pnfs_layout_segment *lseg)
>  	kfree(objio_seg);
>  }
>  
> -int objio_alloc_io_state(struct pnfs_layout_segment *lseg,
> -			 struct objlayout_io_state **outp,
> -			 gfp_t gfp_flags)
> +static int
> +objio_alloc_io_state(struct pnfs_layout_hdr *pnfs_layout_type,
> +	struct pnfs_layout_segment *lseg, struct page **pages, unsigned pgbase,
> +	loff_t offset, size_t count, void *rpcdata, gfp_t gfp_flags,
> +	struct objio_state **outp)
>  {
>  	struct objio_segment *objio_seg = OBJIO_LSEG(lseg);
>  	struct objio_state *ios;
> -	const unsigned first_size = sizeof(*ios) +
> -				objio_seg->num_comps * sizeof(ios->per_dev[0]);
> -	const unsigned sec_size = objio_seg->num_comps *
> -						sizeof(ios->ol_state.ioerrs[0]);
> -
> -	ios = kzalloc(first_size + sec_size, gfp_flags);
> -	if (unlikely(!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];
> +	} *aos;
> +
> +	aos = kzalloc(sizeof(*aos), gfp_flags);
> +	if (unlikely(!aos))
>  		return -ENOMEM;
>  
> -	ios->layout = objio_seg;
> -	ios->ol_state.ioerrs = ((void *)ios) + first_size;
> -	ios->ol_state.num_comps = objio_seg->num_comps;
> +	ios = &aos->objios;
>  
> -	*outp = &ios->ol_state;
> +	ios->layout = objio_seg;
> +	objlayout_init_ioerrs(&aos->objios.ol_state, objio_seg->num_comps,
> +			aos->ioerrs, rpcdata, pnfs_layout_type);
> +
> +	ios->pages = pages;
> +	ios->pgbase = pgbase;
> +	ios->nr_pages = (pgbase + count + PAGE_SIZE - 1) >> PAGE_SHIFT;
> +	ios->offset = offset;
> +	ios->count = count;
> +	ios->sync = 0;
> +	BUG_ON(ios->nr_pages > (pgbase + count + PAGE_SIZE - 1) >> PAGE_SHIFT);
> +
> +	*outp = ios;
>  	return 0;
>  }
>  
> -void objio_free_io_state(struct objlayout_io_state *ol_state)
> +void objio_free_result(struct objlayout_io_state *ol_state)
>  {
>  	struct objio_state *ios = container_of(ol_state, struct objio_state,
>  					       ol_state);
> @@ -598,7 +618,7 @@ static int _add_stripe_unit(struct objio_state *ios,  unsigned *cur_pg,
>  	if (per_dev->bio == NULL) {
>  		unsigned pages_in_stripe = ios->layout->group_width *
>  				      (ios->layout->stripe_unit / PAGE_SIZE);
> -		unsigned bio_size = (ios->ol_state.nr_pages + pages_in_stripe) /
> +		unsigned bio_size = (ios->nr_pages + pages_in_stripe) /
>  				    ios->layout->group_width;
>  
>  		if (BIO_MAX_PAGES_KMALLOC < bio_size)
> @@ -615,11 +635,11 @@ static int _add_stripe_unit(struct objio_state *ios,  unsigned *cur_pg,
>  		unsigned pglen = min_t(unsigned, PAGE_SIZE - pgbase, cur_len);
>  		unsigned added_len;
>  
> -		BUG_ON(ios->ol_state.nr_pages <= pg);
> +		BUG_ON(ios->nr_pages <= pg);
>  		cur_len -= pglen;
>  
>  		added_len = bio_add_pc_page(q, per_dev->bio,
> -					ios->ol_state.pages[pg], pglen, pgbase);
> +					ios->pages[pg], pglen, pgbase);
>  		if (unlikely(pglen != added_len))
>  			return -ENOMEM;
>  		pgbase = 0;
> @@ -660,7 +680,7 @@ static int _prepare_one_group(struct objio_state *ios, u64 length,
>  				cur_len = stripe_unit - si->unit_off;
>  				page_off = si->unit_off & ~PAGE_MASK;
>  				BUG_ON(page_off &&
> -				      (page_off != ios->ol_state.pgbase));
> +				      (page_off != ios->pgbase));
>  			} else { /* dev > si->dev */
>  				per_dev->offset = si->obj_offset - si->unit_off;
>  				cur_len = stripe_unit;
> @@ -693,8 +713,8 @@ out:
>  
>  static int _io_rw_pagelist(struct objio_state *ios, gfp_t gfp_flags)
>  {
> -	u64 length = ios->ol_state.count;
> -	u64 offset = ios->ol_state.offset;
> +	u64 length = ios->count;
> +	u64 offset = ios->offset;
>  	struct _striping_info si;
>  	unsigned last_pg = 0;
>  	int ret = 0;
> @@ -748,7 +768,7 @@ static int _io_exec(struct objio_state *ios)
>  	int ret = 0;
>  	unsigned i;
>  	objio_done_fn saved_done_fn = ios->done;
> -	bool sync = ios->ol_state.sync;
> +	bool sync = ios->sync;
>  
>  	if (sync) {
>  		ios->done = _sync_done;
> @@ -792,7 +812,7 @@ static int _read_done(struct objio_state *ios)
>  	else
>  		status = ret;
>  
> -	objlayout_read_done(&ios->ol_state, status, ios->ol_state.sync);
> +	objlayout_read_done(&ios->ol_state, status, ios->sync);
>  	return ret;
>  }
>  
> @@ -854,12 +874,18 @@ err:
>  	return ret;
>  }
>  
> -int objio_read_pagelist(struct objlayout_io_state *ol_state)
> +int objio_read_pagelist(struct nfs_read_data *rdata)
>  {
> -	struct objio_state *ios = container_of(ol_state, struct objio_state,
> -					       ol_state);
> +	struct objio_state *ios;
>  	int ret;
>  
> +	ret = objio_alloc_io_state(NFS_I(rdata->inode)->layout,
> +			rdata->lseg, rdata->args.pages, rdata->args.pgbase,
> +			rdata->args.offset, rdata->args.count, rdata,
> +			GFP_KERNEL, &ios);
> +	if (unlikely(ret))
> +		return ret;
> +
>  	ret = _io_rw_pagelist(ios, GFP_KERNEL);
>  	if (unlikely(ret))
>  		return ret;
> @@ -886,7 +912,7 @@ static int _write_done(struct objio_state *ios)
>  		status = ret;
>  	}
>  
> -	objlayout_write_done(&ios->ol_state, status, ios->ol_state.sync);
> +	objlayout_write_done(&ios->ol_state, status, ios->sync);
>  	return ret;
>  }
>  
> @@ -976,12 +1002,20 @@ err:
>  	return ret;
>  }
>  
> -int objio_write_pagelist(struct objlayout_io_state *ol_state, bool stable)
> +int objio_write_pagelist(struct nfs_write_data *wdata, int how)
>  {
> -	struct objio_state *ios = container_of(ol_state, struct objio_state,
> -					       ol_state);
> +	struct objio_state *ios;
>  	int ret;
>  
> +	ret = objio_alloc_io_state(NFS_I(wdata->inode)->layout,
> +			wdata->lseg, wdata->args.pages, wdata->args.pgbase,
> +			wdata->args.offset, wdata->args.count, wdata, GFP_NOFS,
> +			&ios);
> +	if (unlikely(ret))
> +		return ret;
> +
> +	ios->sync = 0 != (how & FLUSH_SYNC);
> +
>  	/* TODO: ios->stable = stable; */
>  	ret = _io_rw_pagelist(ios, GFP_NOFS);
>  	if (unlikely(ret))
> diff --git a/fs/nfs/objlayout/objlayout.c b/fs/nfs/objlayout/objlayout.c
> index 99c807d..a82053a 100644
> --- a/fs/nfs/objlayout/objlayout.c
> +++ b/fs/nfs/objlayout/objlayout.c
> @@ -156,59 +156,23 @@ last_byte_offset(u64 start, u64 len)
>  	return end > start ? end - 1 : NFS4_MAX_UINT64;
>  }
>  
> -static struct objlayout_io_state *
> -objlayout_alloc_io_state(struct pnfs_layout_hdr *pnfs_layout_type,
> -			struct page **pages,
> -			unsigned pgbase,
> -			loff_t offset,
> -			size_t count,
> -			struct pnfs_layout_segment *lseg,
> -			void *rpcdata,
> -			gfp_t gfp_flags)
> +void _fix_verify_io_params(struct pnfs_layout_segment *lseg,
> +			   struct page ***p_pages, unsigned *p_pgbase,
> +			   u64 offset, unsigned long count)
>  {
> -	struct objlayout_io_state *state;
>  	u64 lseg_end_offset;
>  
> -	dprintk("%s: allocating io_state\n", __func__);
> -	if (objio_alloc_io_state(lseg, &state, gfp_flags))
> -		return NULL;
> -
>  	BUG_ON(offset < lseg->pls_range.offset);
>  	lseg_end_offset = end_offset(lseg->pls_range.offset,
>  				     lseg->pls_range.length);
>  	BUG_ON(offset >= lseg_end_offset);
> -	if (offset + count > lseg_end_offset) {
> -		count = lseg->pls_range.length -
> -				(offset - lseg->pls_range.offset);
> -		dprintk("%s: truncated count %Zd\n", __func__, count);
> -	}
> +	WARN_ON(offset + count > lseg_end_offset);
>  
> -	if (pgbase > PAGE_SIZE) {
> -		pages += pgbase >> PAGE_SHIFT;
> -		pgbase &= ~PAGE_MASK;
> +	if (*p_pgbase > PAGE_SIZE) {
> +		dprintk("%s: pgbase(0x%x) > PAGE_SIZE\n", __func__, *p_pgbase);
> +		*p_pages += *p_pgbase >> PAGE_SHIFT;
> +		*p_pgbase &= ~PAGE_MASK;
>  	}
> -
> -	INIT_LIST_HEAD(&state->err_list);
> -	state->lseg = lseg;
> -	state->rpcdata = rpcdata;
> -	state->pages = pages;
> -	state->pgbase = pgbase;
> -	state->nr_pages = (pgbase + count + PAGE_SIZE - 1) >> PAGE_SHIFT;
> -	state->offset = offset;
> -	state->count = count;
> -	state->sync = 0;
> -
> -	return state;
> -}
> -
> -static void
> -objlayout_free_io_state(struct objlayout_io_state *state)
> -{
> -	dprintk("%s: freeing io_state\n", __func__);
> -	if (unlikely(!state))
> -		return;
> -
> -	objio_free_io_state(state);
>  }
>  
>  /*
> @@ -217,12 +181,10 @@ objlayout_free_io_state(struct objlayout_io_state *state)
>  static void
>  objlayout_iodone(struct objlayout_io_state *state)
>  {
> -	dprintk("%s: state %p status\n", __func__, state);
> -
>  	if (likely(state->status >= 0)) {
> -		objlayout_free_io_state(state);
> +		objio_free_result(state);
>  	} else {
> -		struct objlayout *objlay = OBJLAYOUT(state->lseg->pls_layout);
> +		struct objlayout *objlay = state->objlay;
>  
>  		spin_lock(&objlay->lock);
>  		objlay->delta_space_valid = OBJ_DSU_INVALID;
> @@ -289,15 +251,15 @@ objlayout_read_done(struct objlayout_io_state *state, ssize_t status, bool sync)
>  {
>  	struct nfs_read_data *rdata = state->rpcdata;
>  
> -	state->status = status;
> -	dprintk("%s: Begin status=%zd eof=%d\n", __func__,
> -		status, rdata->res.eof);
> -	rdata->task.tk_status = status;
> +	state->status = rdata->task.tk_status = status;
>  	if (status >= 0)
>  		rdata->res.count = status;
>  	objlayout_iodone(state);
>  	/* must not use state after this point */
>  
> +	dprintk("%s: Return status=%zd eof=%d sync=%d\n", __func__,
> +		status, rdata->res.eof, sync);
> +
>  	if (sync)
>  		pnfs_ld_read_done(rdata);
>  	else {
> @@ -314,7 +276,6 @@ objlayout_read_pagelist(struct nfs_read_data *rdata)
>  {
>  	loff_t offset = rdata->args.offset;
>  	size_t count = rdata->args.count;
> -	struct objlayout_io_state *state;
>  	int err;
>  	loff_t eof;
>  
> @@ -331,20 +292,14 @@ objlayout_read_pagelist(struct nfs_read_data *rdata)
>  	}
>  
>  	rdata->res.eof = (offset + count) >= eof;
> +	_fix_verify_io_params(rdata->lseg, &rdata->args.pages,
> +			      &rdata->args.pgbase,
> +			      rdata->args.offset, rdata->args.count);
>  
> -	state = objlayout_alloc_io_state(NFS_I(rdata->inode)->layout,
> -					 rdata->args.pages, rdata->args.pgbase,
> -					 offset, count,
> -					 rdata->lseg, rdata,
> -					 GFP_KERNEL);
> -	if (unlikely(!state)) {
> -		err = -ENOMEM;
> -		goto out;
> -	}
>  	dprintk("%s: inode(%lx) offset 0x%llx count 0x%Zx eof=%d\n",
>  		__func__, rdata->inode->i_ino, offset, count, rdata->res.eof);
>  
> -	err = objio_read_pagelist(state);
> +	err = objio_read_pagelist(rdata);
>   out:
>  	if (unlikely(err)) {
>  		rdata->pnfs_error = err;
> @@ -374,23 +329,18 @@ void
>  objlayout_write_done(struct objlayout_io_state *state, ssize_t status,
>  		     bool sync)
>  {
> -	struct nfs_write_data *wdata;
> +	struct nfs_write_data *wdata = state->rpcdata;
>  
> -	dprintk("%s: Begin\n", __func__);
> -	wdata = state->rpcdata;
> -	state->status = status;
> -	wdata->task.tk_status = status;
> +	state->status = wdata->task.tk_status = status;
>  	if (status >= 0) {
>  		wdata->res.count = status;
>  		wdata->verf.committed = state->committed;
> -		dprintk("%s: Return status %d committed %d\n",
> -			__func__, wdata->task.tk_status,
> -			wdata->verf.committed);
> -	} else
> -		dprintk("%s: Return status %d\n",
> -			__func__, wdata->task.tk_status);
> +	}
>  	objlayout_iodone(state);
> -	/* must not use state after this point */
> +	/* must not use oir after this point */
> +
> +	dprintk("%s: Return status %zd committed %d sync=%d\n", __func__,
> +		status, wdata->verf.committed, sync);
>  
>  	if (sync)
>  		pnfs_ld_write_done(wdata);
> @@ -407,25 +357,13 @@ enum pnfs_try_status
>  objlayout_write_pagelist(struct nfs_write_data *wdata,
>  			 int how)
>  {
> -	struct objlayout_io_state *state;
>  	int err;
>  
> -	state = objlayout_alloc_io_state(NFS_I(wdata->inode)->layout,
> -					 wdata->args.pages,
> -					 wdata->args.pgbase,
> -					 wdata->args.offset,
> -					 wdata->args.count,
> -					 wdata->lseg, wdata,
> -					 GFP_NOFS);
> -	if (unlikely(!state)) {
> -		err = -ENOMEM;
> -		goto out;
> -	}
> +	_fix_verify_io_params(wdata->lseg, &wdata->args.pages,
> +			      &wdata->args.pgbase,
> +			      wdata->args.offset, wdata->args.count);
>  
> -	state->sync = how & FLUSH_SYNC;
> -
> -	err = objio_write_pagelist(state, how & FLUSH_STABLE);
> - out:
> +	err = objio_write_pagelist(wdata, how);
>  	if (unlikely(err)) {
>  		wdata->pnfs_error = err;
>  		dprintk("%s: Returned Error %d\n", __func__, err);
> @@ -564,7 +502,7 @@ encode_accumulated_error(struct objlayout *objlay, __be32 *p)
>  			merge_ioerr(&accumulated_err, ioerr);
>  		}
>  		list_del(&state->err_list);
> -		objlayout_free_io_state(state);
> +		objio_free_result(state);
>  	}
>  
>  	pnfs_osd_xdr_encode_ioerr(p, &accumulated_err);
> @@ -632,7 +570,7 @@ objlayout_encode_layoutreturn(struct pnfs_layout_hdr *pnfslay,
>  			goto loop_done;
>  		}
>  		list_del(&state->err_list);
> -		objlayout_free_io_state(state);
> +		objio_free_result(state);
>  	}
>  loop_done:
>  	spin_unlock(&objlay->lock);
> diff --git a/fs/nfs/objlayout/objlayout.h b/fs/nfs/objlayout/objlayout.h
> index 4edac9b..d7b2ccfa 100644
> --- a/fs/nfs/objlayout/objlayout.h
> +++ b/fs/nfs/objlayout/objlayout.h
> @@ -75,14 +75,7 @@ OBJLAYOUT(struct pnfs_layout_hdr *lo)
>   * embedded in objects provider io_state data structure
>   */
>  struct objlayout_io_state {
> -	struct pnfs_layout_segment *lseg;
> -
> -	struct page **pages;
> -	unsigned pgbase;
> -	unsigned nr_pages;
> -	unsigned long count;
> -	loff_t offset;
> -	bool sync;
> +	struct objlayout *objlay;
>  
>  	void *rpcdata;
>  	int status;             /* res */
> @@ -99,6 +92,18 @@ struct objlayout_io_state {
>  	struct pnfs_osd_ioerr *ioerrs;
>  };
>  
> +static inline
> +void objlayout_init_ioerrs(struct objlayout_io_state *oir, unsigned num_comps,
> +			struct pnfs_osd_ioerr *ioerrs, void *rpcdata,
> +			struct pnfs_layout_hdr *pnfs_layout_type)
> +{
> +	oir->objlay = OBJLAYOUT(pnfs_layout_type);
> +	oir->rpcdata = rpcdata;
> +	INIT_LIST_HEAD(&oir->err_list);
> +	oir->num_comps = num_comps;
> +	oir->ioerrs = ioerrs;
> +}
> +
>  /*
>   * Raid engine I/O API
>   */
> @@ -109,15 +114,10 @@ extern int objio_alloc_lseg(struct pnfs_layout_segment **outp,
>  	gfp_t gfp_flags);
>  extern void objio_free_lseg(struct pnfs_layout_segment *lseg);
>  
> -extern int objio_alloc_io_state(
> -	struct pnfs_layout_segment *lseg,
> -	struct objlayout_io_state **outp,
> -	gfp_t gfp_flags);
> -extern void objio_free_io_state(struct objlayout_io_state *state);
> +extern void objio_free_result(struct objlayout_io_state *state);
>  
> -extern int objio_read_pagelist(struct objlayout_io_state *ol_state);
> -extern int objio_write_pagelist(struct objlayout_io_state *ol_state,
> -				    bool stable);
> +extern int objio_read_pagelist(struct nfs_read_data *rdata);
> +extern int objio_write_pagelist(struct nfs_write_data *wdata, int how);
>  
>  /*
>   * callback API
> @@ -127,10 +127,8 @@ extern void objlayout_io_set_result(struct objlayout_io_state *state,
>  			int osd_error, u64 offset, u64 length, bool is_write);
>  
>  static inline void
> -objlayout_add_delta_space_used(struct objlayout_io_state *state, s64 space_used)
> +objlayout_add_delta_space_used(struct objlayout *objlay, s64 space_used)
>  {
> -	struct objlayout *objlay = OBJLAYOUT(state->lseg->pls_layout);
> -
>  	/* If one of the I/Os errored out and the delta_space_used was
>  	 * invalid we render the complete report as invalid. Protocol mandate
>  	 * the DSU be accurate or not reported.

  reply	other threads:[~2011-10-11  2:32 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 [this message]
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
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=4E8F343D.8080408@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).