Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6

* 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6:
NFS: Ensure that rpc_release_resources_task() can be called twice.
NFS: Don't leak RPC clients in NFSv4 secinfo negotiation
NFS: Fix a hang in the writeback path

+11 -15
+3 -1
fs/nfs/namespace.c
··· 192 192 auth = rpcauth_create(flavor, clone); 193 193 if (!auth) { 194 194 flavor = -EIO; 195 - goto out; 195 + goto out_shutdown; 196 196 } 197 197 err = server->nfs_client->rpc_ops->lookup(clone, parent->d_inode, 198 198 &path->dentry->d_name, 199 199 fh, fattr); 200 200 if (err < 0) 201 201 flavor = err; 202 + out_shutdown: 203 + rpc_shutdown_client(clone); 202 204 out: 203 205 return flavor; 204 206 }
+2 -2
fs/nfs/pagelist.c
··· 135 135 nfs_unlock_request(req); 136 136 } 137 137 138 - /** 138 + /* 139 139 * nfs_clear_request - Free up all resources allocated to the request 140 140 * @req: 141 141 * 142 142 * Release page and open context resources associated with a read/write 143 143 * request after it has completed. 144 144 */ 145 - void nfs_clear_request(struct nfs_page *req) 145 + static void nfs_clear_request(struct nfs_page *req) 146 146 { 147 147 struct page *page = req->wb_page; 148 148 struct nfs_open_context *ctx = req->wb_context;
+3 -10
fs/nfs/write.c
··· 389 389 spin_lock(&inode->i_lock); 390 390 error = radix_tree_insert(&nfsi->nfs_page_tree, req->wb_index, req); 391 391 BUG_ON(error); 392 - if (!nfsi->npages) { 393 - igrab(inode); 394 - if (nfs_have_delegation(inode, FMODE_WRITE)) 395 - nfsi->change_attr++; 396 - } 392 + if (!nfsi->npages && nfs_have_delegation(inode, FMODE_WRITE)) 393 + nfsi->change_attr++; 397 394 set_bit(PG_MAPPED, &req->wb_flags); 398 395 SetPagePrivate(req->wb_page); 399 396 set_page_private(req->wb_page, (unsigned long)req); ··· 420 423 clear_bit(PG_MAPPED, &req->wb_flags); 421 424 radix_tree_delete(&nfsi->nfs_page_tree, req->wb_index); 422 425 nfsi->npages--; 423 - if (!nfsi->npages) { 424 - spin_unlock(&inode->i_lock); 425 - iput(inode); 426 - } else 427 - spin_unlock(&inode->i_lock); 426 + spin_unlock(&inode->i_lock); 428 427 nfs_release_request(req); 429 428 } 430 429
-1
include/linux/nfs_page.h
··· 78 78 struct page *page, 79 79 unsigned int offset, 80 80 unsigned int count); 81 - extern void nfs_clear_request(struct nfs_page *req); 82 81 extern void nfs_release_request(struct nfs_page *req); 83 82 84 83
+3 -1
net/sunrpc/sched.c
··· 860 860 { 861 861 if (task->tk_rqstp) 862 862 xprt_release(task); 863 - if (task->tk_msg.rpc_cred) 863 + if (task->tk_msg.rpc_cred) { 864 864 put_rpccred(task->tk_msg.rpc_cred); 865 + task->tk_msg.rpc_cred = NULL; 866 + } 865 867 rpc_task_release_client(task); 866 868 } 867 869