nfs: handle lock context allocation failures in nfs_create_request
authorJeff Layton <jlayton@redhat.com>
Thu, 28 Oct 2010 14:10:37 +0000 (10:10 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 28 Oct 2010 15:17:25 +0000 (11:17 -0400)
nfs_get_lock_context can return NULL on an allocation failure.
Regression introduced by commit f11ac8db.

Reported-by: Steve Dickson <steved@redhat.com>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Cc: stable@kernel.org
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/pagelist.c

index 919490232e17ea887fd96b50f0b709e12b5f0520..137b549e63dbcfa3971aac43091eb91a29a7b69f 100644 (file)
@@ -65,6 +65,13 @@ nfs_create_request(struct nfs_open_context *ctx, struct inode *inode,
        if (req == NULL)
                return ERR_PTR(-ENOMEM);
 
+       /* get lock context early so we can deal with alloc failures */
+       req->wb_lock_context = nfs_get_lock_context(ctx);
+       if (req->wb_lock_context == NULL) {
+               nfs_page_free(req);
+               return ERR_PTR(-ENOMEM);
+       }
+
        /* Initialize the request struct. Initially, we assume a
         * long write-back delay. This will be adjusted in
         * update_nfs_request below if the region is not locked. */
@@ -79,7 +86,6 @@ nfs_create_request(struct nfs_open_context *ctx, struct inode *inode,
        req->wb_pgbase  = offset;
        req->wb_bytes   = count;
        req->wb_context = get_nfs_open_context(ctx);
-       req->wb_lock_context = nfs_get_lock_context(ctx);
        kref_init(&req->wb_kref);
        return req;
 }