From patchwork Mon Dec 20 11:54:34 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kirill A . Shutemov" X-Patchwork-Id: 420521 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oBKBwuFh007745 for ; Mon, 20 Dec 2010 11:58:57 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757366Ab0LTL6L (ORCPT ); Mon, 20 Dec 2010 06:58:11 -0500 Received: from shutemov.name ([188.40.19.243]:38465 "EHLO shutemov.name" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757347Ab0LTLyn (ORCPT ); Mon, 20 Dec 2010 06:54:43 -0500 Received: by shutemov.name (Postfix, from userid 500) id 31BC3D421A; Mon, 20 Dec 2010 13:54:41 +0200 (EET) From: "Kirill A. Shutsemov" To: Trond Myklebust , "J. Bruce Fields" , Neil Brown Cc: Pavel Emelyanov , linux-nfs@vger.kernel.org, "David S. Miller" , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" Subject: [PATCH 08/12] sunrpc: tag pipefs field of cache_detail with rpc_pipefs mount point Date: Mon, 20 Dec 2010 13:54:34 +0200 Message-Id: <1292846078-31793-9-git-send-email-kirill@shutemov.name> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292846078-31793-1-git-send-email-kirill@shutemov.name> References: <1292846078-31793-1-git-send-email-kirill@shutemov.name> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 20 Dec 2010 11:58:57 +0000 (UTC) diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index dd7ca5f..0944d4e 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c @@ -123,7 +123,7 @@ int nfs_cache_register(struct cache_detail *cd) ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &nd); if (ret) goto err; - ret = sunrpc_cache_register_pipefs(nd.path.dentry, + ret = sunrpc_cache_register_pipefs(mnt, nd.path.dentry, cd->name, 0600, cd); path_put(&nd.path); if (!ret) @@ -136,6 +136,5 @@ err: void nfs_cache_unregister(struct cache_detail *cd) { sunrpc_cache_unregister_pipefs(cd); - mntput(init_rpc_pipefs); } diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 6950c98..d34a621 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h @@ -64,10 +64,6 @@ struct cache_detail_procfs { struct proc_dir_entry *flush_ent, *channel_ent, *content_ent; }; -struct cache_detail_pipefs { - struct dentry *dir; -}; - struct cache_detail { struct module * owner; int hash_size; @@ -114,7 +110,7 @@ struct cache_detail { union { struct cache_detail_procfs procfs; - struct cache_detail_pipefs pipefs; + struct path pipefs; } u; }; @@ -201,7 +197,8 @@ extern int cache_register_net(struct cache_detail *cd, struct net *net); extern void cache_unregister(struct cache_detail *cd); extern void cache_unregister_net(struct cache_detail *cd, struct net *net); -extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *, +extern int sunrpc_cache_register_pipefs(struct vfsmount *rpcmount, + struct dentry *parent, const char *, mode_t, struct cache_detail *); extern void sunrpc_cache_unregister_pipefs(struct cache_detail *); diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index e433e75..ed50d49 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -1753,7 +1754,8 @@ const struct file_operations cache_flush_operations_pipefs = { .llseek = no_llseek, }; -int sunrpc_cache_register_pipefs(struct dentry *parent, +int sunrpc_cache_register_pipefs(struct vfsmount *rpcmount, + struct dentry *parent, const char *name, mode_t umode, struct cache_detail *cd) { @@ -1766,9 +1768,10 @@ int sunrpc_cache_register_pipefs(struct dentry *parent, q.len = strlen(name); q.hash = full_name_hash(q.name, q.len); dir = rpc_create_cache_dir(parent, &q, umode, cd); - if (!IS_ERR(dir)) - cd->u.pipefs.dir = dir; - else { + if (!IS_ERR(dir)) { + cd->u.pipefs.mnt = mntget(rpcmount); + cd->u.pipefs.dentry = dir; + } else { sunrpc_destroy_cache_detail(cd); ret = PTR_ERR(dir); } @@ -1778,8 +1781,9 @@ EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs); void sunrpc_cache_unregister_pipefs(struct cache_detail *cd) { - rpc_remove_cache_dir(cd->u.pipefs.dir); - cd->u.pipefs.dir = NULL; + rpc_remove_cache_dir(cd->u.pipefs.dentry); + cd->u.pipefs.dentry = NULL; + mntput(cd->u.pipefs.mnt); sunrpc_destroy_cache_detail(cd); } EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs);