From cfc88944a50739998be8d3f3b892bbd8d93da474 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Tue, 19 Oct 2004 18:23:47 -0700 Subject: [PATCH] [PATCH] nfsd4: nfsd oopsed when encountering a conflict with a local lock Bug Fix: Non NFSD conflicting byte-range locks were causing an Oops. Encode a zero length owner and zero clientid for non NFSD conflicting locks in the lock_denied response. Signed-off-by: Andy Adamson Signed-off-by: J. Bruce Fields Signed-off-by: Neil Brown Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- fs/nfsd/nfs4xdr.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 1d2eb8f19625b..17a7dd9b22626 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -1995,13 +1995,18 @@ nfsd4_encode_lock_denied(struct nfsd4_compoundres *resp, struct nfsd4_lock_denie { ENCODE_HEAD; - RESERVE_SPACE(32 + XDR_LEN(ld->ld_sop->so_owner.len)); + RESERVE_SPACE(32 + XDR_LEN(ld->ld_sop ? ld->ld_sop->so_owner.len : 0)); WRITE64(ld->ld_start); WRITE64(ld->ld_length); WRITE32(ld->ld_type); - WRITEMEM(&ld->ld_sop->so_client->cl_clientid, 8); - WRITE32(ld->ld_sop->so_owner.len); - WRITEMEM(ld->ld_sop->so_owner.data, ld->ld_sop->so_owner.len); + if (ld->ld_sop) { + WRITEMEM(&ld->ld_sop->so_client->cl_clientid, 8); + WRITE32(ld->ld_sop->so_owner.len); + WRITEMEM(ld->ld_sop->so_owner.data, ld->ld_sop->so_owner.len); + } else { /* non - nfsv4 lock in conflict, no clientid nor owner */ + WRITE64((u64)0); /* clientid */ + WRITE32(0); /* length of owner name */ + } ADJUST_ARGS(); } -- 2.53.0