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 bdi_unregister is called on mount failure.
NFS: Avoid a deadlock in nfs_release_page
NFSv4: Don't ignore the NFS_INO_REVAL_FORCED flag in nfs_revalidate_inode()
nfs4: Make the v4 callback service hidden
nfs: fix unlikely memory leak
rpc client can not deal with ENOSOCK, so translate it into ENOCONN

+45 -23
+1
fs/nfs/callback_xdr.c
··· 782 782 .vs_proc = nfs4_callback_procedures1, 783 783 .vs_xdrsize = NFS4_CALLBACK_XDRSIZE, 784 784 .vs_dispatch = NULL, 785 + .vs_hidden = 1, 785 786 }; 786 787 787 788 struct svc_version nfs4_callback_version4 = {
+6
fs/nfs/delegation.h
··· 71 71 } 72 72 #endif 73 73 74 + static inline int nfs_have_delegated_attributes(struct inode *inode) 75 + { 76 + return nfs_have_delegation(inode, FMODE_READ) && 77 + !(NFS_I(inode)->cache_validity & NFS_INO_REVAL_FORCED); 78 + } 79 + 74 80 #endif
+1 -1
fs/nfs/dir.c
··· 1789 1789 cache = nfs_access_search_rbtree(inode, cred); 1790 1790 if (cache == NULL) 1791 1791 goto out; 1792 - if (!nfs_have_delegation(inode, FMODE_READ) && 1792 + if (!nfs_have_delegated_attributes(inode) && 1793 1793 !time_in_range_open(jiffies, cache->jiffies, cache->jiffies + nfsi->attrtimeo)) 1794 1794 goto out_stale; 1795 1795 res->jiffies = cache->jiffies;
+1 -1
fs/nfs/inode.c
··· 729 729 { 730 730 struct nfs_inode *nfsi = NFS_I(inode); 731 731 732 - if (nfs_have_delegation(inode, FMODE_READ)) 732 + if (nfs_have_delegated_attributes(inode)) 733 733 return 0; 734 734 return !time_in_range_open(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo); 735 735 }
+1
fs/nfs/nfs4proc.c
··· 5107 5107 res = kzalloc(sizeof(*res), GFP_KERNEL); 5108 5108 if (!args || !res) { 5109 5109 kfree(args); 5110 + kfree(res); 5110 5111 nfs_put_client(clp); 5111 5112 return -ENOMEM; 5112 5113 }
+13 -10
fs/nfs/pagelist.c
··· 112 112 */ 113 113 int nfs_set_page_tag_locked(struct nfs_page *req) 114 114 { 115 - struct nfs_inode *nfsi = NFS_I(req->wb_context->path.dentry->d_inode); 116 - 117 115 if (!nfs_lock_request_dontget(req)) 118 116 return 0; 119 117 if (req->wb_page != NULL) 120 - radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); 118 + radix_tree_tag_set(&NFS_I(req->wb_context->path.dentry->d_inode)->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); 121 119 return 1; 122 120 } 123 121 ··· 124 126 */ 125 127 void nfs_clear_page_tag_locked(struct nfs_page *req) 126 128 { 127 - struct inode *inode = req->wb_context->path.dentry->d_inode; 128 - struct nfs_inode *nfsi = NFS_I(inode); 129 - 130 129 if (req->wb_page != NULL) { 130 + struct inode *inode = req->wb_context->path.dentry->d_inode; 131 + struct nfs_inode *nfsi = NFS_I(inode); 132 + 131 133 spin_lock(&inode->i_lock); 132 134 radix_tree_tag_clear(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); 133 135 nfs_unlock_request(req); ··· 140 142 * nfs_clear_request - Free up all resources allocated to the request 141 143 * @req: 142 144 * 143 - * Release page resources associated with a write request after it 144 - * has completed. 145 + * Release page and open context resources associated with a read/write 146 + * request after it has completed. 145 147 */ 146 148 void nfs_clear_request(struct nfs_page *req) 147 149 { 148 150 struct page *page = req->wb_page; 151 + struct nfs_open_context *ctx = req->wb_context; 152 + 149 153 if (page != NULL) { 150 154 page_cache_release(page); 151 155 req->wb_page = NULL; 156 + } 157 + if (ctx != NULL) { 158 + put_nfs_open_context(ctx); 159 + req->wb_context = NULL; 152 160 } 153 161 } 154 162 ··· 169 165 { 170 166 struct nfs_page *req = container_of(kref, struct nfs_page, wb_kref); 171 167 172 - /* Release struct file or cached credential */ 168 + /* Release struct file and open context */ 173 169 nfs_clear_request(req); 174 - put_nfs_open_context(req->wb_context); 175 170 nfs_page_free(req); 176 171 } 177 172
+20 -5
fs/nfs/super.c
··· 2214 2214 } else { 2215 2215 error = nfs_bdi_register(server); 2216 2216 if (error) 2217 - goto error_splat_super; 2217 + goto error_splat_bdi; 2218 2218 } 2219 2219 2220 2220 if (!s->s_root) { ··· 2256 2256 error_splat_root: 2257 2257 dput(mntroot); 2258 2258 error_splat_super: 2259 + if (server && !s->s_root) 2260 + bdi_unregister(&server->backing_dev_info); 2261 + error_splat_bdi: 2259 2262 deactivate_locked_super(s); 2260 2263 goto out; 2261 2264 } ··· 2329 2326 } else { 2330 2327 error = nfs_bdi_register(server); 2331 2328 if (error) 2332 - goto error_splat_super; 2329 + goto error_splat_bdi; 2333 2330 } 2334 2331 2335 2332 if (!s->s_root) { ··· 2366 2363 return error; 2367 2364 2368 2365 error_splat_super: 2366 + if (server && !s->s_root) 2367 + bdi_unregister(&server->backing_dev_info); 2368 + error_splat_bdi: 2369 2369 deactivate_locked_super(s); 2370 2370 dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error); 2371 2371 return error; ··· 2584 2578 } else { 2585 2579 error = nfs_bdi_register(server); 2586 2580 if (error) 2587 - goto error_splat_super; 2581 + goto error_splat_bdi; 2588 2582 } 2589 2583 2590 2584 if (!s->s_root) { ··· 2622 2616 error_splat_root: 2623 2617 dput(mntroot); 2624 2618 error_splat_super: 2619 + if (server && !s->s_root) 2620 + bdi_unregister(&server->backing_dev_info); 2621 + error_splat_bdi: 2625 2622 deactivate_locked_super(s); 2626 2623 goto out; 2627 2624 } ··· 2820 2811 } else { 2821 2812 error = nfs_bdi_register(server); 2822 2813 if (error) 2823 - goto error_splat_super; 2814 + goto error_splat_bdi; 2824 2815 } 2825 2816 2826 2817 if (!s->s_root) { ··· 2856 2847 return error; 2857 2848 2858 2849 error_splat_super: 2850 + if (server && !s->s_root) 2851 + bdi_unregister(&server->backing_dev_info); 2852 + error_splat_bdi: 2859 2853 deactivate_locked_super(s); 2860 2854 dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error); 2861 2855 return error; ··· 2905 2893 } else { 2906 2894 error = nfs_bdi_register(server); 2907 2895 if (error) 2908 - goto error_splat_super; 2896 + goto error_splat_bdi; 2909 2897 } 2910 2898 2911 2899 if (!s->s_root) { ··· 2941 2929 return error; 2942 2930 2943 2931 error_splat_super: 2932 + if (server && !s->s_root) 2933 + bdi_unregister(&server->backing_dev_info); 2934 + error_splat_bdi: 2944 2935 deactivate_locked_super(s); 2945 2936 dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); 2946 2937 return error;
+2 -6
net/sunrpc/xprtsock.c
··· 548 548 /* Still some bytes left; set up for a retry later. */ 549 549 status = -EAGAIN; 550 550 } 551 - if (!transport->sock) 552 - goto out; 553 551 554 552 switch (status) { 555 553 case -ENOTSOCK: ··· 567 569 * prompts ECONNREFUSED. */ 568 570 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); 569 571 } 570 - out: 572 + 571 573 return status; 572 574 } 573 575 ··· 649 651 status = -EAGAIN; 650 652 break; 651 653 } 652 - if (!transport->sock) 653 - goto out; 654 654 655 655 switch (status) { 656 656 case -ENOTSOCK: ··· 668 672 case -ENOTCONN: 669 673 clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); 670 674 } 671 - out: 675 + 672 676 return status; 673 677 } 674 678