NFS: Fix a preemption count leak in nfs_update_request
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 5 Jun 2008 19:17:39 +0000 (15:17 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 9 Jul 2008 16:08:39 +0000 (12:08 -0400)
The commit 2785259631697ebb0749a3782cca206e2e542939 (nfs: use GFP_NOFS
preloads for radix-tree insertion) appears to have introduced a bug:
We only want to call radix_tree_preload() once after creating a request.
Calling it every time we loop after we created the request, will cause
preemption count leaks.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: Nick Piggin <npiggin@suse.de>
fs/nfs/write.c

index f333848..dc62bc5 100644 (file)
@@ -584,13 +584,6 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
                /* Loop over all inode entries and see if we find
                 * A request for the page we wish to update
                 */
-               if (new) {
-                       if (radix_tree_preload(GFP_NOFS)) {
-                               nfs_release_request(new);
-                               return ERR_PTR(-ENOMEM);
-                       }
-               }
-
                spin_lock(&inode->i_lock);
                req = nfs_page_find_request_locked(page);
                if (req) {
@@ -630,6 +623,10 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
                new = nfs_create_request(ctx, inode, page, offset, bytes);
                if (IS_ERR(new))
                        return new;
+               if (radix_tree_preload(GFP_NOFS)) {
+                       nfs_release_request(new);
+                       return ERR_PTR(-ENOMEM);
+               }
        }
 
        /* We have a request for our page.