2013-01-15 03:17:26

by Yanchuan Nian

[permalink] [raw]
Subject: [PATCH] pnfsd: Fix unlock bug on error path

From: Yanchuan Nian <[email protected]>

LAYOUTGET procedure fails if the layout requested conflicts with the recalled.
It needs to put the reference and unlock the state before exiting.

Signed-off-by: Yanchuan Nian <[email protected]>
---
fs/nfsd/nfs4pnfsd.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfsd/nfs4pnfsd.c b/fs/nfsd/nfs4pnfsd.c
index dd7856c..4a1e17b 100644
--- a/fs/nfsd/nfs4pnfsd.c
+++ b/fs/nfsd/nfs4pnfsd.c
@@ -760,7 +760,7 @@ nfs4_pnfs_get_layout(struct nfsd4_pnfs_layoutget *lgp,

if (is_layout_recalled(clp, lgp->lg_fhp, &lgp->lg_seg)) {
nfserr = nfserr_recallconflict;
- goto out;
+ goto out_unlock;
}

/* pre-alloc layout in case we can't merge after we call
--
1.7.4.4



2013-01-21 14:43:33

by Benny Halevy

[permalink] [raw]
Subject: Re: [PATCH] pnfsd: Fix unlock bug on error path

On 2013-01-15 05:07, [email protected] wrote:
> From: Yanchuan Nian <[email protected]>
>
> LAYOUTGET procedure fails if the layout requested conflicts with the recalled.
> It needs to put the reference and unlock the state before exiting.
>
> Signed-off-by: Yanchuan Nian <[email protected]>

Good catch. Thanks.
Committing for pnfs-all-3.7 and latest.

Benny

> ---
> fs/nfsd/nfs4pnfsd.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/fs/nfsd/nfs4pnfsd.c b/fs/nfsd/nfs4pnfsd.c
> index dd7856c..4a1e17b 100644
> --- a/fs/nfsd/nfs4pnfsd.c
> +++ b/fs/nfsd/nfs4pnfsd.c
> @@ -760,7 +760,7 @@ nfs4_pnfs_get_layout(struct nfsd4_pnfs_layoutget *lgp,
>
> if (is_layout_recalled(clp, lgp->lg_fhp, &lgp->lg_seg)) {
> nfserr = nfserr_recallconflict;
> - goto out;
> + goto out_unlock;
> }
>
> /* pre-alloc layout in case we can't merge after we call
>