2011-06-14 13:57:01

by Fred Isaman

[permalink] [raw]
Subject: [PATCH 1/1] nfs4.1: pnfs_find_lseg only looks at first element in list

The break condition to skip out of the loop if we've gone too far was
reversed, causing the function to abort after looking at the first
list entry.

Reported-by: Peng Tao <[email protected]>
Signed-off-by: Fred Isaman <[email protected]>
---
fs/nfs/pnfs.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 1abb300..c640f91 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -895,7 +895,7 @@ pnfs_find_lseg(struct pnfs_layout_hdr *lo,
ret = get_lseg(lseg);
break;
}
- if (cmp_layout(range, &lseg->pls_range) > 0)
+ if (cmp_layout(range, &lseg->pls_range) < 0)
break;
}

--
1.7.2.1



2011-06-14 14:38:14

by Benny Halevy

[permalink] [raw]
Subject: Re: [PATCH 1/1] nfs4.1: pnfs_find_lseg only looks at first element in list

On 2011-06-14 09:56, Fred Isaman wrote:
> The break condition to skip out of the loop if we've gone too far was
> reversed, causing the function to abort after looking at the first
> list entry.
>
> Reported-by: Peng Tao <[email protected]>
> Signed-off-by: Fred Isaman <[email protected]>
> ---
> fs/nfs/pnfs.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 1abb300..c640f91 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -895,7 +895,7 @@ pnfs_find_lseg(struct pnfs_layout_hdr *lo,
> ret = get_lseg(lseg);
> break;
> }
> - if (cmp_layout(range, &lseg->pls_range) > 0)
> + if (cmp_layout(range, &lseg->pls_range) < 0)

Fred, this is too harsh since we might break if range->offset == lseg->pls_range.offset
&& range->length > lseg->pls_range.length.

The simplest condition is just:
if (lseg->pls_range.offset > range->offset)

Benny

> break;
> }
>

2011-06-14 20:30:18

by Benny Halevy

[permalink] [raw]
Subject: [PATCH] NFSv4.1: fix break condition in pnfs_find_lseg

The break condition to skip out of the loop got broken when cmp_layout
was change. Essentially, we want to stop looking once we know no layout
on the remainder of the list can match the first byte of the looked-up
range.

Reported-by: Peng Tao <[email protected]>
Signed-off-by: Benny Halevy <[email protected]>
---
fs/nfs/pnfs.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 08c115d..b3994e1 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -895,7 +895,7 @@ pnfs_find_lseg(struct pnfs_layout_hdr *lo,
ret = get_lseg(lseg);
break;
}
- if (cmp_layout(range, &lseg->pls_range) > 0)
+ if (lseg->pls_range.offset > range->offset)
break;
}

--
1.7.4.4