diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-06-05 15:17:39 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-07-09 12:08:39 -0400 |
commit | f3d47a3a6a1484a93c8cfe1e8c8d4399c95199c7 (patch) | |
tree | 639d104b0e66dc3bf143bf0010fb5954dc3e7b37 /fs/nfs/write.c | |
parent | 0b4aae7aad162ad175ba8a65708332f888066b26 (diff) | |
download | kernel_goldelico_gta04-f3d47a3a6a1484a93c8cfe1e8c8d4399c95199c7.zip kernel_goldelico_gta04-f3d47a3a6a1484a93c8cfe1e8c8d4399c95199c7.tar.gz kernel_goldelico_gta04-f3d47a3a6a1484a93c8cfe1e8c8d4399c95199c7.tar.bz2 |
NFS: Fix a preemption count leak in nfs_update_request
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>
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r-- | fs/nfs/write.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index f333848..dc62bc5 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -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. |