From: Benny Halevy <bhalevy@panasas.com>
To: Alexandros Batsakis <batsakis@netapp.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 5/8] pnfs-submit: request whole file layouts only
Date: Wed, 26 May 2010 11:42:12 +0300 [thread overview]
Message-ID: <4BFCDEE4.1060303@panasas.com> (raw)
In-Reply-To: <1274119004-30213-6-git-send-email-batsakis@netapp.com>
On May. 17, 2010, 20:56 +0300, Alexandros Batsakis <batsakis@netapp.com> wrote:
> In the first iteration of the pNFS code, we support only whole-file layouts.
> To facilitate the move to multiple-segments, we keep the segment processing
> code, but the segment list should always contain a max of one segment per I/O type
>
> Signed-off-by: Alexandros Batsakis <batsakis@netapp.com>
> ---
> fs/nfs/callback_proc.c | 7 ++++---
> fs/nfs/pnfs.c | 25 +++++--------------------
> 2 files changed, 9 insertions(+), 23 deletions(-)
>
> diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
> index 8ef1502..bfada25 100644
> --- a/fs/nfs/callback_proc.c
> +++ b/fs/nfs/callback_proc.c
> @@ -213,6 +213,10 @@ static int pnfs_recall_layout(void *data)
> then return layouts, resume after layoutreturns complete
> */
>
> + /* support whole file layouts only */
> + rl.cbl_seg.offset = 0;
> + rl.cbl_seg.length = NFS4_MAX_UINT64;
> +
> if (rl.cbl_recall_type == RETURN_FILE) {
> status = pnfs_return_layout(inode, &rl.cbl_seg, &rl.cbl_stateid,
> RETURN_FILE);
> @@ -221,9 +225,6 @@ static int pnfs_recall_layout(void *data)
> goto out;
> }
>
> - rl.cbl_seg.offset = 0;
> - rl.cbl_seg.length = NFS4_MAX_UINT64;
> -
> /* FIXME: This loop is inefficient, running in O(|s_inodes|^2) */
> while ((ino = nfs_layoutrecall_find_inode(clp, &rl)) != NULL) {
> /* XXX need to check status on pnfs_return_layout */
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index ecf6dc2..2cc8895 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -546,12 +546,6 @@ pnfs_layout_from_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
> * for now, assume that whole file layouts are requested.
> * arg->offset: 0
> * arg->length: all ones
> -*
> -* for now, assume the LAYOUTGET operation is triggered by an I/O request.
> -* the count field is the count in the I/O request, and will be used
> -* as the minlength. for the file operation that piggy-backs
> -* the LAYOUTGET operation with an OPEN, s
> -* arg->minlength = count.
> */
> static int
> get_layout(struct inode *ino,
> @@ -572,10 +566,10 @@ get_layout(struct inode *ino,
> return -ENOMEM;
> }
> lgp->lo = lo;
> - lgp->args.minlength = PAGE_CACHE_SIZE;
> + lgp->args.minlength = NFS4_MAX_UINT64;
> lgp->args.maxcount = PNFS_LAYOUT_MAXSIZE;
> lgp->args.lseg.iomode = range->iomode;
> - lgp->args.lseg.offset = range->offset;
> + lgp->args.lseg.offset = 0;
> lgp->args.lseg.length = max(range->length, lgp->args.minlength);
This is a protocol bug.
As per RFC5661, 18.43. Operation 50: LAYOUTGET:
The second range is between loga_offset and loga_offset +
loga_minlength - 1 inclusive. This range indicates the required
range the client needs the layout to cover. Thus, loga_minlength
MUST be less than or equal to loga_length.
Therefore, lseg.length must also be set to NFS4_MAX_UINT64
> lgp->args.type = server->pnfs_curr_ld->id;
> lgp->args.inode = ino;
> @@ -1068,8 +1062,8 @@ pnfs_update_layout(struct inode *ino,
> {
> struct nfs4_pnfs_layout_segment arg = {
> .iomode = iomode,
> - .offset = pos,
> - .length = countg
> + .offset = 0,
> + .length = ~0
let's use NFS4_MAX_UINT64 rather than counting on the compiler for promoting ~0
to u64.
> };
> struct nfs_inode *nfsi = NFS_I(ino);
> struct pnfs_layout_type *lo;
> @@ -1159,7 +1153,6 @@ out_put:
> void
> pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status)
> {
> - struct nfs4_pnfs_layoutget_res *res = &lgp->res;
> struct pnfs_layout_segment *lseg = NULL;
> struct nfs_inode *nfsi = PNFS_NFS_INODE(lgp->lo);
> time_t suspend = 0;
> @@ -1167,15 +1160,8 @@ pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status)
> dprintk("-->%s\n", __func__);
>
> lgp->status = rpc_status;
> - if (likely(!rpc_status)) {
> - if (unlikely(res->layout.len <= 0)) {
> - printk(KERN_ERR
> - "%s: ERROR! Layout size is ZERO!\n", __func__);
> - lgp->status = -EIO;
> - goto get_out;
> - }
This is an orthogonal issue.
Why not verify the resulting layout we got?
Benny
> + if (likely(!rpc_status))
> goto out;
> - }
>
> dprintk("%s: ERROR retrieving layout %d\n", __func__, rpc_status);
> switch (rpc_status) {
> @@ -1250,7 +1236,6 @@ pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status)
> break;
> }
>
> -get_out:
> /* remember that get layout failed and suspend trying */
> nfsi->layout.pnfs_layout_suspend = suspend;
> set_bit(lo_fail_bit(lgp->args.lseg.iomode),
next prev parent reply other threads:[~2010-05-26 8:42 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-17 17:56 [PATCH 0/8] pnfs-submit: Forgetful cleint and some layout cleanups Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 1/8] pnfs-submit: clean struct nfs_inode Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 2/8] pnfs-submit: clean locking infrastructure Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 3/8] pnfs-submit: remove lgetcount, lretcount (outstanding LAYOUTGETs/LAYOUTRETUNs) Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 4/8] pnfs-submit: change stateid to be a union Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 5/8] pnfs-submit: request whole file layouts only Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 6/8] pnfs-submit: change layouts list to be similar to the other state list management Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 7/8] pnfs-submit: forgetful client model Alexandros Batsakis
2010-05-17 17:56 ` [PATCH 8/8] pnfs-submit: support for cb_recall_any (layouts) Alexandros Batsakis
2010-05-26 10:48 ` Benny Halevy
2010-05-17 20:38 ` [PATCH 7/8] pnfs-submit: forgetful client model J. Bruce Fields
2010-05-18 0:06 ` Alexandros Batsakis
2010-05-18 14:16 ` J. Bruce Fields
2010-05-18 17:33 ` Alexandros Batsakis
2010-05-18 18:22 ` J. Bruce Fields
2010-05-26 9:20 ` Benny Halevy
2010-05-27 18:38 ` Batsakis, Alexandros
2010-05-26 8:49 ` [PATCH 6/8] pnfs-submit: change layouts list to be similar to the other state list management Benny Halevy
2010-05-26 8:42 ` Benny Halevy [this message]
2010-05-26 8:26 ` [PATCH 4/8] pnfs-submit: change stateid to be a union Benny Halevy
2010-05-26 8:28 ` [PATCH 2/8] pnfs-submit: clean locking infrastructure Benny Halevy
2010-05-28 17:27 ` Fred Isaman
[not found] ` <AANLkTinsHI0fHYdpUlq-MsMX0BmsLGvdAbrKx7M5ydjw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-05-28 18:27 ` Alexandros Batsakis
-- strict thread matches above, loose matches on Subject: below --
2010-05-05 17:00 [PATCH 0/8] pnfs-submit: forgetful client v2 Alexandros Batsakis
2010-05-05 17:00 ` [PATCH 1/8] pnfs-submit: clean struct nfs_inode Alexandros Batsakis
2010-05-05 17:00 ` [PATCH 2/8] pnfs-submit: clean locking infrastructure Alexandros Batsakis
2010-05-05 17:00 ` [PATCH 3/8] pnfs-submit: remove lgetcount, lretcount (outstanding LAYOUTGETs/LAYOUTRETUNs) Alexandros Batsakis
2010-05-05 17:00 ` [PATCH 4/8] pnfs-submit: change stateid to be a union Alexandros Batsakis
2010-05-05 17:00 ` [PATCH 5/8] pnfs-submit: request whole file layouts only Alexandros Batsakis
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=4BFCDEE4.1060303@panasas.com \
--to=bhalevy@panasas.com \
--cc=batsakis@netapp.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.