]> git.hungrycats.org Git - linux/commitdiff
[PATCH] nfsd4: nfsd oopsed when encountering a conflict with a local lock
authorNeil Brown <neilb@cse.unsw.edu.au>
Wed, 20 Oct 2004 01:23:47 +0000 (18:23 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 20 Oct 2004 01:23:47 +0000 (18:23 -0700)
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 <andros@umich.edu>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/nfsd/nfs4xdr.c

index 1d2eb8f19625b2106fefea20d8131c6d2e998d2a..17a7dd9b22626d8669c30962c9607b9837c5fa30 100644 (file)
@@ -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();
 }