From: Benny Halevy <bhalevy@panasas.com>
To: Boaz Harrosh <bharrosh@panasas.com>
Cc: andros@netapp.com, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 03/16] SQUASHME pnfs-submit embed pnfs_layout_type
Date: Mon, 12 Jul 2010 20:05:26 +0300 [thread overview]
Message-ID: <4C3B4B56.9050300@panasas.com> (raw)
In-Reply-To: <4C3B42FD.1070809@panasas.com>
On Jul. 12, 2010, 19:29 +0300, Boaz Harrosh <bharrosh@panasas.com> wrote:
> On 07/08/2010 01:34 AM, andros@netapp.com wrote:
>> From: Andy Adamson <andros@netapp.com>
>>
>> Change nfs_inode layout field to a pointer
>>
>> Each layoutdriver embeds the pnfs_layout_type in it's private layout cache
>> head structure, and allocates them both with the alloc_layout
>> layoutdriver_io_operation.
>>
>> NOTE API change: the layoutdriver_io_operation alloc_layout and free_layout now
>> use pnfs_layout_type pointers instead of void*.
>>
>> Signed-off-by: Andy Adamson <andros@netapp.com>
>> ---
>> fs/nfs/callback_proc.c | 2 +-
>> fs/nfs/inode.c | 12 +-----
>> fs/nfs/nfs4proc.c | 2 +-
>> fs/nfs/nfs4state.c | 4 +-
>> fs/nfs/pnfs.c | 111 +++++++++++++++++++++++----------------------
>> include/linux/nfs4_pnfs.h | 19 +++-----
>> include/linux/nfs_fs.h | 4 +-
>> 7 files changed, 71 insertions(+), 83 deletions(-)
>>
>> diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
>> index 4766695..d999ea8 100644
>> --- a/fs/nfs/callback_proc.c
>> +++ b/fs/nfs/callback_proc.c
>> @@ -233,7 +233,7 @@ static int pnfs_recall_layout(void *data)
>> rl.cbl_seg.length = NFS4_MAX_UINT64;
>>
>> if (rl.cbl_recall_type == RETURN_FILE) {
>> - if (pnfs_is_next_layout_stateid(&NFS_I(inode)->layout,
>> + if (pnfs_is_next_layout_stateid(NFS_I(inode)->layout,
>> rl.cbl_stateid))
>> status = pnfs_return_layout(inode, &rl.cbl_seg,
>> &rl.cbl_stateid, RETURN_FILE,
>> diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
>> index 3d51602..30252f4 100644
>> --- a/fs/nfs/inode.c
>> +++ b/fs/nfs/inode.c
>> @@ -1397,17 +1397,7 @@ static inline void nfs4_init_once(struct nfs_inode *nfsi)
>> #ifdef CONFIG_NFS_V4_1
>> init_waitqueue_head(&nfsi->lo_waitq);
>> nfsi->pnfs_layout_suspend = 0;
>> - seqlock_init(&nfsi->layout.seqlock);
>> - INIT_LIST_HEAD(&nfsi->layout.lo_layouts);
>> - INIT_LIST_HEAD(&nfsi->layout.segs);
>> - nfsi->layout.refcount = 0;
>> - nfsi->layout.ld_data = NULL;
>> - nfsi->layout.pnfs_layout_state = 0;
>> - memset(&nfsi->layout.stateid, 0, NFS4_STATEID_SIZE);
>> - nfsi->layout.roc_iomode = 0;
>> - nfsi->layout.lo_cred = NULL;
>> - nfsi->layout.pnfs_write_begin_pos = 0;
>> - nfsi->layout.pnfs_write_end_pos = 0;
>> + nfsi->layout = NULL;
>> #endif /* CONFIG_NFS_V4_1 */
>> #endif
>> }
>> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
>> index c5b8a2f..6acebc3 100644
>> --- a/fs/nfs/nfs4proc.c
>> +++ b/fs/nfs/nfs4proc.c
>> @@ -1086,7 +1086,7 @@ static void pnfs4_layout_reclaim(struct nfs4_state *state)
>> * flag during grace period
>> */
>> pnfs_destroy_layout(NFS_I(state->inode));
>> - pnfs_set_layout_stateid(&NFS_I(state->inode)->layout, &zero_stateid);
>> + pnfs_set_layout_stateid(NFS_I(state->inode)->layout, &zero_stateid);
>> #endif /* CONFIG_NFS_V4_1 */
>> }
>>
>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>> index bfe679b..6f44cb0 100644
>> --- a/fs/nfs/nfs4state.c
>> +++ b/fs/nfs/nfs4state.c
>> @@ -597,10 +597,10 @@ static void __nfs4_close(struct path *path, struct nfs4_state *state,
>> #ifdef CONFIG_NFS_V4_1
>> struct nfs_inode *nfsi = NFS_I(state->inode);
>>
>> - if (has_layout(nfsi) && nfsi->layout.roc_iomode) {
>> + if (has_layout(nfsi) && nfsi->layout->roc_iomode) {
>> struct nfs4_pnfs_layout_segment range;
>>
>> - range.iomode = nfsi->layout.roc_iomode;
>> + range.iomode = nfsi->layout->roc_iomode;
>> range.offset = 0;
>> range.length = NFS4_MAX_UINT64;
>> pnfs_return_layout(state->inode, &range, NULL,
>> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
>> index 53c15b1..6d435ed 100644
>> --- a/fs/nfs/pnfs.c
>> +++ b/fs/nfs/pnfs.c
>> @@ -152,10 +152,11 @@ pnfs_need_layoutcommit(struct nfs_inode *nfsi, struct nfs_open_context *ctx)
>> {
>> dprintk("%s: has_layout=%d ctx=%p\n", __func__, has_layout(nfsi), ctx);
>> spin_lock(&nfsi->vfs_inode.i_lock);
>> - if (has_layout(nfsi) && !layoutcommit_needed(nfsi)) {
>> - nfsi->layout.lo_cred = get_rpccred(ctx->state->owner->so_cred);
>> + if (has_layout(nfsi) && !
>> + !test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->layout->pnfs_layout_state)) {
>
> Is the "!!" intended
>
> Why did you open code layoutcommit_needed() ?
>
>> + nfsi->layout->lo_cred = get_rpccred(ctx->state->owner->so_cred);
>> __set_bit(NFS_INO_LAYOUTCOMMIT,
>> - &nfsi->layout.pnfs_layout_state);
>> + &nfsi->layout->pnfs_layout_state);
>> nfsi->change_attr++;
>> spin_unlock(&nfsi->vfs_inode.i_lock);
>> dprintk("%s: Set layoutcommit\n", __func__);
>> @@ -175,17 +176,17 @@ pnfs_update_last_write(struct nfs_inode *nfsi, loff_t offset, size_t extent)
>> loff_t end_pos;
>>
>> spin_lock(&nfsi->vfs_inode.i_lock);
>> - if (offset < nfsi->layout.pnfs_write_begin_pos)
>> - nfsi->layout.pnfs_write_begin_pos = offset;
>> + if (offset < nfsi->layout->pnfs_write_begin_pos)
>> + nfsi->layout->pnfs_write_begin_pos = offset;
>> end_pos = offset + extent - 1; /* I'm being inclusive */
>> - if (end_pos > nfsi->layout.pnfs_write_end_pos)
>> - nfsi->layout.pnfs_write_end_pos = end_pos;
>> + if (end_pos > nfsi->layout->pnfs_write_end_pos)
>> + nfsi->layout->pnfs_write_end_pos = end_pos;
>> dprintk("%s: Wrote %lu@%lu bpos %lu, epos: %lu\n",
>> __func__,
>> (unsigned long) extent,
>> (unsigned long) offset ,
>> - (unsigned long) nfsi->layout.pnfs_write_begin_pos,
>> - (unsigned long) nfsi->layout.pnfs_write_end_pos);
>> + (unsigned long) nfsi->layout->pnfs_write_begin_pos,
>> + (unsigned long) nfsi->layout->pnfs_write_end_pos);
>> spin_unlock(&nfsi->vfs_inode.i_lock);
>> }
>>
>> @@ -326,10 +327,9 @@ get_layout(struct pnfs_layout_type *lo)
>> static inline struct pnfs_layout_type *
>> grab_current_layout(struct nfs_inode *nfsi)
>> {
>> - struct pnfs_layout_type *lo = &nfsi->layout;
>> + struct pnfs_layout_type *lo = nfsi->layout;
>>
>> - BUG_ON_UNLOCKED_LO(lo);
>> - if (!lo->ld_data)
>> + if (!lo)
>> return NULL;
>> get_layout(lo);
>> return lo;
>> @@ -343,13 +343,13 @@ put_layout(struct pnfs_layout_type *lo)
>>
>> lo->refcount--;
>> if (!lo->refcount) {
>> - struct layoutdriver_io_operations *io_ops =
>> - PNFS_LD_IO_OPS(lo);
>> + struct layoutdriver_io_operations *io_ops = PNFS_LD_IO_OPS(lo);
>> + struct nfs_inode *nfsi = PNFS_NFS_INODE(lo);
>>
>> - dprintk("%s: freeing layout %p\n", __func__, lo->ld_data);
>> + dprintk("%s: freeing layout cache %p\n", __func__, lo);
>> WARN_ON(!list_empty(&lo->lo_layouts));
>> - io_ops->free_layout(lo->ld_data);
>> - lo->ld_data = NULL;
>> + io_ops->free_layout(lo);
>> + nfsi->layout = NULL;
>> }
>> }
>>
>> @@ -381,14 +381,13 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)
>> lo = grab_current_layout(nfsi);
>> if (lo) {
>> pnfs_free_layout(lo, &range);
>> - WARN_ON(!list_empty(&nfsi->layout.segs));
>> - WARN_ON(!list_empty(&nfsi->layout.lo_layouts));
>> - WARN_ON(nfsi->layout.ld_data);
>> + WARN_ON(!list_empty(&nfsi->layout->segs));
>> + WARN_ON(!list_empty(&nfsi->layout->lo_layouts));
>>
>> - if (nfsi->layout.refcount != 1)
>> + if (nfsi->layout->refcount != 1)
>> printk(KERN_WARNING "%s: layout refcount not=1 %d\n",
>> - __func__, nfsi->layout.refcount);
>> - WARN_ON(nfsi->layout.refcount != 1);
>> + __func__, nfsi->layout->refcount);
>> + WARN_ON(nfsi->layout->refcount != 1);
>>
>> put_layout(lo);
>> }
>> @@ -698,7 +697,7 @@ pnfs_return_layout_barrier(struct nfs_inode *nfsi,
>> bool ret = false;
>>
>> spin_lock(&nfsi->vfs_inode.i_lock);
>> - list_for_each_entry (lseg, &nfsi->layout.segs, fi_list) {
>> + list_for_each_entry(lseg, &nfsi->layout->segs, fi_list) {
>> if (!should_free_lseg(lseg, range))
>> continue;
>> lseg->valid = false;
>> @@ -904,29 +903,33 @@ pnfs_insert_layout(struct pnfs_layout_type *lo,
>> dprintk("%s:Return\n", __func__);
>> }
>>
>> +/*
>> + * Each layoutdriver embeds pnfs_layout_type as the first field in it's
>> + * per-layout type layout cache structure and returns it ZEROed
>> + * from layoutdriver_io_ops->alloc_layout
>> + */
>> static struct pnfs_layout_type *
>> alloc_init_layout(struct inode *ino)
>> {
>> - void *ld_data;
>> struct pnfs_layout_type *lo;
>> struct layoutdriver_io_operations *io_ops;
>>
>> + BUG_ON(NFS_I(ino)->layout != NULL);
>> io_ops = NFS_SERVER(ino)->pnfs_curr_ld->ld_io_ops;
>> - lo = &NFS_I(ino)->layout;
>> - ld_data = io_ops->alloc_layout(ino);
>> - if (!ld_data) {
>> + lo = io_ops->alloc_layout(ino);
>> + if (!lo) {
>> printk(KERN_ERR
>> "%s: out of memory: io_ops->alloc_layout failed\n",
>> __func__);
>> return NULL;
>> }
>> -
>> spin_lock(&ino->i_lock);
>> - BUG_ON(lo->ld_data != NULL);
>> - lo->ld_data = ld_data;
>> - memset(&lo->stateid, 0, NFS4_STATEID_SIZE);
>> lo->refcount = 1;
>> - lo->roc_iomode = 0;
>> + INIT_LIST_HEAD(&lo->lo_layouts);
>> + INIT_LIST_HEAD(&lo->segs);
>> + seqlock_init(&lo->seqlock);
>> + lo->lo_inode = ino;
>
>
> The spin_lock() could be moved to here, it's the single place
> that actually touches the nfsi.
>
>> + NFS_I(ino)->layout = lo;
>> spin_unlock(&ino->i_lock);
>> return lo;
>> }
>> @@ -961,7 +964,7 @@ get_lock_alloc_layout(struct inode *ino)
>> * wait until bit is cleared if we lost this race.
>> */
>> res = wait_on_bit_lock(
>> - &nfsi->layout.pnfs_layout_state,
>> + &nfsi->layout->pnfs_layout_state,
>> NFS_INO_LAYOUT_ALLOC,
>> pnfs_wait_schedule, TASK_KILLABLE);
>> if (res) {
>> @@ -972,7 +975,7 @@ get_lock_alloc_layout(struct inode *ino)
>> /* Was current_layout already allocated while we slept?
>> * If so, retry get_lock'ing it. Otherwise, allocate it.
>> */
>> - if (nfsi->layout.ld_data) {
>> + if (nfsi->layout) {
>> spin_lock(&ino->i_lock);
>> continue;
>> }
>> @@ -985,8 +988,8 @@ get_lock_alloc_layout(struct inode *ino)
>>
>> /* release the NFS_INO_LAYOUT_ALLOC bit and wake up waiters */
>> clear_bit_unlock(NFS_INO_LAYOUT_ALLOC,
>> - &nfsi->layout.pnfs_layout_state);
>> - wake_up_bit(&nfsi->layout.pnfs_layout_state,
>> + &nfsi->layout->pnfs_layout_state);
>> + wake_up_bit(&nfsi->layout->pnfs_layout_state,
>> NFS_INO_LAYOUT_ALLOC);
>> break;
>> }
>> @@ -1113,12 +1116,12 @@ _pnfs_update_layout(struct inode *ino,
>> }
>>
>> /* if get layout already failed once goto out */
>> - if (test_bit(lo_fail_bit(iomode), &nfsi->layout.pnfs_layout_state)) {
>> + if (test_bit(lo_fail_bit(iomode), &nfsi->layout->pnfs_layout_state)) {
>> if (unlikely(nfsi->pnfs_layout_suspend &&
>> get_seconds() >= nfsi->pnfs_layout_suspend)) {
>> dprintk("%s: layout_get resumed\n", __func__);
>> clear_bit(lo_fail_bit(iomode),
>> - &nfsi->layout.pnfs_layout_state);
>> + &nfsi->layout->pnfs_layout_state);
>> nfsi->pnfs_layout_suspend = 0;
>> } else
>> goto out_put;
>> @@ -1130,7 +1133,7 @@ _pnfs_update_layout(struct inode *ino,
>> send_layoutget(ino, ctx, &arg, lsegpp, lo);
>> out:
>> dprintk("%s end, state 0x%lx lseg %p\n", __func__,
>> - nfsi->layout.pnfs_layout_state, lseg);
>> + nfsi->layout->pnfs_layout_state, lseg);
>> return;
>> out_put:
>> if (lsegpp)
>> @@ -1235,12 +1238,12 @@ pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status)
>> /* remember that get layout failed and suspend trying */
>> nfsi->pnfs_layout_suspend = suspend;
>> set_bit(lo_fail_bit(lgp->args.lseg.iomode),
>> - &nfsi->layout.pnfs_layout_state);
>> + &nfsi->layout->pnfs_layout_state);
>> dprintk("%s: layout_get suspended until %ld\n",
>> __func__, suspend);
>> out:
>> dprintk("%s end (err:%d) state 0x%lx lseg %p\n",
>> - __func__, lgp->status, nfsi->layout.pnfs_layout_state, lseg);
>> + __func__, lgp->status, nfsi->layout->pnfs_layout_state, lseg);
>> return;
>> }
>>
>> @@ -1321,7 +1324,7 @@ pnfs_set_pg_test(struct inode *inode, struct nfs_pageio_descriptor *pgio)
>>
>> pgio->pg_test = NULL;
>>
>> - laytype = &NFS_I(inode)->layout;
>> + laytype = NFS_I(inode)->layout;
>> ld = NFS_SERVER(inode)->pnfs_curr_ld;
>> if (!pnfs_enabled_sb(NFS_SERVER(inode)) || !laytype)
>> return;
>> @@ -1454,7 +1457,7 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
>> numpages);
>> wdata->pdata.lseg = lseg;
>> trypnfs = nfss->pnfs_curr_ld->ld_io_ops->write_pagelist(
>> - &nfsi->layout,
>> + nfsi->layout,
>> args->pages,
>> args->pgbase,
>> numpages,
>> @@ -1507,7 +1510,7 @@ pnfs_readpages(struct nfs_read_data *rdata)
>> __func__, numpages);
>> rdata->pdata.lseg = lseg;
>> trypnfs = nfss->pnfs_curr_ld->ld_io_ops->read_pagelist(
>> - &nfsi->layout,
>> + nfsi->layout,
>> args->pages,
>> args->pgbase,
>> numpages,
>> @@ -1568,7 +1571,7 @@ pnfs_commit(struct nfs_write_data *data, int sync)
>> * This will be done by passing the buck to the layout driver.
>> */
>> data->pdata.lseg = NULL;
>> - trypnfs = nfss->pnfs_curr_ld->ld_io_ops->commit(&nfsi->layout,
>> + trypnfs = nfss->pnfs_curr_ld->ld_io_ops->commit(nfsi->layout,
>> sync, data);
>> dprintk("%s End (trypnfs:%d)\n", __func__, trypnfs);
>> return trypnfs;
>> @@ -1639,14 +1642,14 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
>> /* Clear layoutcommit properties in the inode so
>> * new lc info can be generated
>> */
>> - write_begin_pos = nfsi->layout.pnfs_write_begin_pos;
>> - write_end_pos = nfsi->layout.pnfs_write_end_pos;
>> - data->cred = nfsi->layout.lo_cred;
>> - nfsi->layout.pnfs_write_begin_pos = 0;
>> - nfsi->layout.pnfs_write_end_pos = 0;
>> - nfsi->layout.lo_cred = NULL;
>> - __clear_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->layout.pnfs_layout_state);
>> - pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
>> + write_begin_pos = nfsi->layout->pnfs_write_begin_pos;
>> + write_end_pos = nfsi->layout->pnfs_write_end_pos;
>> + data->cred = nfsi->layout->lo_cred;
>> + nfsi->layout->pnfs_write_begin_pos = 0;
>> + nfsi->layout->pnfs_write_end_pos = 0;
>> + nfsi->layout->lo_cred = NULL;
>> + __clear_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->layout->pnfs_layout_state);
>> + pnfs_get_layout_stateid(&data->args.stateid, nfsi->layout);
>>
>> spin_unlock(&inode->i_lock);
>>
>> diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
>> index c5af82f..2c6ce4c 100644
>> --- a/include/linux/nfs4_pnfs.h
>> +++ b/include/linux/nfs4_pnfs.h
>> @@ -35,13 +35,13 @@ struct pnfs_layoutdriver_type {
>> static inline struct nfs_inode *
>> PNFS_NFS_INODE(struct pnfs_layout_type *lo)
>> {
>> - return container_of(lo, struct nfs_inode, layout);
>> + return NFS_I(lo->lo_inode);
>> }
>>
>> static inline struct inode *
>> PNFS_INODE(struct pnfs_layout_type *lo)
>> {
>> - return &PNFS_NFS_INODE(lo)->vfs_inode;
>> + return lo->lo_inode;
>> }
>>
>> static inline struct nfs_server *
>> @@ -50,12 +50,6 @@ PNFS_NFS_SERVER(struct pnfs_layout_type *lo)
>> return NFS_SERVER(PNFS_INODE(lo));
>> }
>>
>> -static inline void *
>> -PNFS_LD_DATA(struct pnfs_layout_type *lo)
>> -{
>> - return lo->ld_data;
>> -}
>> -
>> static inline struct pnfs_layoutdriver_type *
>> PNFS_LD(struct pnfs_layout_type *lo)
>> {
>> @@ -77,13 +71,14 @@ PNFS_LD_POLICY_OPS(struct pnfs_layout_type *lo)
>> static inline bool
>> has_layout(struct nfs_inode *nfsi)
>> {
>> - return nfsi->layout.ld_data != NULL;
>> + return nfsi->layout != NULL;
>
> does this mean the same thing now?
>
> You could perhaps optimize with a bit flag that is set on
> first segment insert, and reset on last segment removal.
> Or some other/better scheme.
We may want to have has_layout() as well as has_layout_segs()
which will check that the lsegs list is not empty.
Benny
>
>> }
>>
>> static inline bool
>> layoutcommit_needed(struct nfs_inode *nfsi)
>> {
>> - return test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->layout.pnfs_layout_state);
>> + return has_layout(nfsi) &&
>> + test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->layout->pnfs_layout_state);
>
> What is the purpose of patch[1/1] ?
>
> you are unlocked and asking about a layout pointer. Which according to you might
> go away mid-flight?
>
>> }
>>
>> #else /* CONFIG_NFS_V4_1 */
>> @@ -149,8 +144,8 @@ struct layoutdriver_io_operations {
>> /* Layout information. For each inode, alloc_layout is executed once to retrieve an
>> * inode specific layout structure. Each subsequent layoutget operation results in
>> * a set_layout call to set the opaque layout in the layout driver.*/
>> - void * (*alloc_layout) (struct inode *inode);
>> - void (*free_layout) (void *layoutid);
>> + struct pnfs_layout_type * (*alloc_layout) (struct inode *inode);
>> + void (*free_layout) (struct pnfs_layout_type *);
>> struct pnfs_layout_segment * (*alloc_lseg) (struct pnfs_layout_type *layoutid, struct nfs4_pnfs_layoutget_res *lgr);
>> void (*free_lseg) (struct pnfs_layout_segment *lseg);
>>
>> diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
>> index b612746..7b999a4 100644
>> --- a/include/linux/nfs_fs.h
>> +++ b/include/linux/nfs_fs.h
>> @@ -104,7 +104,6 @@ struct pnfs_layout_type {
>> int roc_iomode; /* iomode to return on close, 0=none */
>> seqlock_t seqlock; /* Protects the stateid */
>> nfs4_stateid stateid;
>> - void *ld_data; /* layout driver private data */
>> unsigned long pnfs_layout_state;
>> #define NFS_INO_RO_LAYOUT_FAILED 0 /* get ro layout failed stop trying */
>> #define NFS_INO_RW_LAYOUT_FAILED 1 /* get rw layout failed stop trying */
>> @@ -116,6 +115,7 @@ struct pnfs_layout_type {
>> */
>> loff_t pnfs_write_begin_pos;
>> loff_t pnfs_write_end_pos;
>> + struct inode *lo_inode;
>> };
>>
>> /*
>> @@ -206,7 +206,7 @@ struct nfs_inode {
>> /* pNFS layout information */
>> #if defined(CONFIG_NFS_V4_1)
>> wait_queue_head_t lo_waitq;
>> - struct pnfs_layout_type layout;
>> + struct pnfs_layout_type *layout;
>> time_t pnfs_layout_suspend;
>> #endif /* CONFIG_NFS_V4_1 */
>> #endif /* CONFIG_NFS_V4*/
>
next prev parent reply other threads:[~2010-07-12 17:05 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-07 22:34 [PATCH 0/16] pnfs-submit fix layout allocation and reference counting andros
2010-07-07 22:34 ` [PATCH 01/16] SQUASHME pnfs-submit: add state flag for layoutcommit_needed andros
2010-07-07 22:34 ` [PATCH 02/16] SQUASHME: pnfs-submit: move pnfs_layout_suspend back to nfs_inode andros
2010-07-07 22:34 ` [PATCH 03/16] SQUASHME pnfs-submit embed pnfs_layout_type andros
2010-07-07 22:34 ` [PATCH 04/16] SQUASHME pnfs-submit: filelayout: use new alloc/free_layout API andros
2010-07-07 22:34 ` [PATCH 05/16] SQUASHME pnfs-submit: rewrite layout allocation andros
2010-07-07 22:34 ` [PATCH 06/16] SQUASHME pnfs-submit; fix pnfs_update_layout reference counting andros
2010-07-07 22:34 ` [PATCH 07/16] SQUASHME pnfs_submit: don't get a reference on boundary calculation andros
2010-07-07 22:34 ` [PATCH 08/16] SQUASHME pnfs-submit: don't reference the layout in init_lseg andros
2010-07-07 22:34 ` [PATCH 09/16] SQUASHME pnfs-submit: pnfs_update_layout always references the lseg andros
2010-07-07 22:34 ` [PATCH 10/16] SQUASHME pnfs-submit: reference the layout when inserted into segs list andros
2010-07-07 22:34 ` [PATCH 11/16] SQUASHME pnfs-submit: rename put_layout to put_layout_locked andros
2010-07-07 22:34 ` [PATCH 12/16] SQUASHME pnfs-submit: reference layout across layoutcommit andros
2010-07-07 22:34 ` [PATCH 13/16] SQUASHME pnfs-submit: reference layout for layoutreturn andros
2010-07-07 22:34 ` [PATCH 14/16] SQUASHME pnfs-submit: remove put_layout from pnfs_free_layout andros
2010-07-07 22:34 ` [PATCH 15/16] SQUASHME pnfs-submit: do not reference a layout in destroy_layout andros
2010-07-07 22:34 ` [PATCH 16/16] SQUASHME pnfs-submit: remove grab_current_layout andros
2010-07-12 17:19 ` [PATCH 12/16] SQUASHME pnfs-submit: reference layout across layoutcommit Benny Halevy
2010-07-12 18:27 ` William A. (Andy) Adamson
[not found] ` <AANLkTil1wUQUTht0QP7_Ttaagw0-LXef2J8wU6wSFUWG-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-12 18:29 ` Benny Halevy
2010-07-13 13:50 ` William A. (Andy) Adamson
2010-07-12 17:25 ` Boaz Harrosh
2010-07-12 18:09 ` William A. (Andy) Adamson
[not found] ` <AANLkTilWfV86wpO7vFho3FmL9y9Y6Sx9_-knKq7T-snu-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-12 18:27 ` Benny Halevy
2010-07-12 18:28 ` William A. (Andy) Adamson
[not found] ` <AANLkTilrcKirEQLe5mhtYNAnaJBSn6q4edC3TlXJd1rm-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-12 19:54 ` Benny Halevy
2010-07-12 9:13 ` [PATCH 09/16] SQUASHME pnfs-submit: pnfs_update_layout always references the lseg Benny Halevy
2010-07-12 8:30 ` [PATCH 05/16] SQUASHME pnfs-submit: rewrite layout allocation Benny Halevy
2010-07-13 13:39 ` William A. (Andy) Adamson
[not found] ` <AANLkTilb6ePL7s6H4TbhGfJt05Yw7Gc24V0C8cPHC22K-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-13 14:04 ` Benny Halevy
2010-07-12 16:32 ` [PATCH 04/16] SQUASHME pnfs-submit: filelayout: use new alloc/free_layout API Boaz Harrosh
2010-07-12 16:29 ` [PATCH 03/16] SQUASHME pnfs-submit embed pnfs_layout_type Boaz Harrosh
2010-07-12 17:05 ` Benny Halevy [this message]
2010-07-12 17:38 ` William A. (Andy) Adamson
2010-07-12 17:34 ` William A. (Andy) Adamson
[not found] ` <AANLkTikTMLQJwj1PeW2Y0dfmRcVFdNr6sasxJtaAiMg4-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-12 17:43 ` Boaz Harrosh
2010-07-12 18:33 ` William A. (Andy) Adamson
2010-07-07 22:57 ` [PATCH 0/16] pnfs-submit fix layout allocation and reference counting Gilliam, PaulX J
2010-07-08 10:16 ` Boaz Harrosh
2010-07-08 16:14 ` William A. (Andy) Adamson
2010-07-12 15:33 ` 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=4C3B4B56.9050300@panasas.com \
--to=bhalevy@panasas.com \
--cc=andros@netapp.com \
--cc=bharrosh@panasas.com \
--cc=linux-nfs@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.