X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fsuper25.c;h=5c5b9db613d6c23b548e2eda0d3914d634d0f660;hb=3973cf8dc955c773a5f9da13216252644aa3949f;hp=f63472bf9999674b988ff90dab54128bbd89d247;hpb=e3457782b1fa1bdc6d5170f20774112113dcab50;p=fs%2Flustre-release.git diff --git a/lustre/llite/super25.c b/lustre/llite/super25.c index f63472b..5c5b9db 100644 --- a/lustre/llite/super25.c +++ b/lustre/llite/super25.c @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,7 @@ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel Corporation. + * Copyright (c) 2011, 2016, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -39,20 +35,20 @@ #include #include #include -#include #include #include #include #include +#include #include #include "llite_internal.h" +#include "vvp_internal.h" static struct kmem_cache *ll_inode_cachep; static struct inode *ll_alloc_inode(struct super_block *sb) { struct ll_inode_info *lli; - ll_stats_ops_tally(ll_s2sbi(sb), LPROC_LL_ALLOC_INODE, 1); OBD_SLAB_ALLOC_PTR_GFP(lli, ll_inode_cachep, GFP_NOFS); if (lli == NULL) return NULL; @@ -61,11 +57,11 @@ static struct inode *ll_alloc_inode(struct super_block *sb) return &lli->lli_vfs_inode; } -#ifdef HAVE_INODE_I_RCU static void ll_inode_destroy_callback(struct rcu_head *head) { struct inode *inode = container_of(head, struct inode, i_rcu); struct ll_inode_info *ptr = ll_i2info(inode); + llcrypt_free_inode(inode); OBD_SLAB_FREE_PTR(ptr, ll_inode_cachep); } @@ -73,57 +69,39 @@ static void ll_destroy_inode(struct inode *inode) { call_rcu(&inode->i_rcu, ll_inode_destroy_callback); } -#else -static void ll_destroy_inode(struct inode *inode) -{ - struct ll_inode_info *ptr = ll_i2info(inode); - OBD_SLAB_FREE_PTR(ptr, ll_inode_cachep); -} -#endif -static int ll_init_inodecache(void) +static int ll_drop_inode(struct inode *inode) { - ll_inode_cachep = kmem_cache_create("lustre_inode_cache", - sizeof(struct ll_inode_info), - 0, SLAB_HWCACHE_ALIGN, NULL); - if (ll_inode_cachep == NULL) - return -ENOMEM; - return 0; -} + int drop = generic_drop_inode(inode); -static void ll_destroy_inodecache(void) -{ - kmem_cache_destroy(ll_inode_cachep); + if (!drop) + drop = llcrypt_drop_inode(inode); + + return drop; } /* exported operations */ struct super_operations lustre_super_operations = { - .alloc_inode = ll_alloc_inode, - .destroy_inode = ll_destroy_inode, -#ifdef HAVE_SBOPS_EVICT_INODE - .evict_inode = ll_delete_inode, -#else - .clear_inode = ll_clear_inode, - .delete_inode = ll_delete_inode, -#endif - .put_super = ll_put_super, - .statfs = ll_statfs, - .umount_begin = ll_umount_begin, - .remount_fs = ll_remount_fs, - .show_options = ll_show_options, + .alloc_inode = ll_alloc_inode, + .destroy_inode = ll_destroy_inode, + .drop_inode = ll_drop_inode, + .evict_inode = ll_delete_inode, + .put_super = ll_put_super, + .statfs = ll_statfs, + .umount_begin = ll_umount_begin, + .remount_fs = ll_remount_fs, + .show_options = ll_show_options, }; - -void lustre_register_client_process_config(int (*cpc)(struct lustre_cfg *lcfg)); - -static int __init init_lustre_lite(void) +static int __init lustre_init(void) { - int i, rc, seed[2]; - struct timeval tv; - lnet_process_id_t lnet_id; + struct lnet_process_id lnet_id; + int i, rc; + unsigned long lustre_inode_cache_flags; - CLASSERT(sizeof(LUSTRE_VOLATILE_HDR) == LUSTRE_VOLATILE_HDR_LEN + 1); + BUILD_BUG_ON(sizeof(LUSTRE_VOLATILE_HDR) != + LUSTRE_VOLATILE_HDR_LEN + 1); /* print an address of _any_ initialized kernel symbol from this * module, to allow debugging with gdb that doesn't support data @@ -131,111 +109,100 @@ static int __init init_lustre_lite(void) CDEBUG(D_INFO, "Lustre client module (%p).\n", &lustre_super_operations); - rc = ll_init_inodecache(); - if (rc) - return -ENOMEM; + lustre_inode_cache_flags = SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT | + SLAB_MEM_SPREAD; +#ifdef SLAB_ACCOUNT + lustre_inode_cache_flags |= SLAB_ACCOUNT; +#endif + + ll_inode_cachep = kmem_cache_create("lustre_inode_cache", + sizeof(struct ll_inode_info), + 0, lustre_inode_cache_flags, NULL); + if (ll_inode_cachep == NULL) + GOTO(out_cache, rc = -ENOMEM); + ll_file_data_slab = kmem_cache_create("ll_file_data", sizeof(struct ll_file_data), 0, SLAB_HWCACHE_ALIGN, NULL); - if (ll_file_data_slab == NULL) { - ll_destroy_inodecache(); - return -ENOMEM; - } - - ll_remote_perm_cachep = kmem_cache_create("ll_remote_perm_cache", - sizeof(struct ll_remote_perm), - 0, 0, NULL); - if (ll_remote_perm_cachep == NULL) { - kmem_cache_destroy(ll_file_data_slab); - ll_file_data_slab = NULL; - ll_destroy_inodecache(); - return -ENOMEM; - } - - ll_rmtperm_hash_cachep = kmem_cache_create("ll_rmtperm_hash_cache", - REMOTE_PERM_HASHSIZE * - sizeof(struct list_head), - 0, 0, NULL); - if (ll_rmtperm_hash_cachep == NULL) { - kmem_cache_destroy(ll_remote_perm_cachep); - ll_remote_perm_cachep = NULL; - kmem_cache_destroy(ll_file_data_slab); - ll_file_data_slab = NULL; - ll_destroy_inodecache(); - return -ENOMEM; + if (ll_file_data_slab == NULL) + GOTO(out_cache, rc = -ENOMEM); + + pcc_inode_slab = kmem_cache_create("ll_pcc_inode", + sizeof(struct pcc_inode), 0, + SLAB_HWCACHE_ALIGN, NULL); + if (pcc_inode_slab == NULL) + GOTO(out_cache, rc = -ENOMEM); + + rc = llite_tunables_register(); + if (rc) + GOTO(out_cache, rc); + + /* Nodes with small feet have little entropy. The NID for this + * node gives the most entropy in the low bits. */ + for (i = 0;; i++) { + if (LNetGetId(i, &lnet_id) == -ENOENT) + break; + + add_device_randomness(&lnet_id.nid, sizeof(lnet_id.nid)); } - proc_lustre_fs_root = proc_lustre_root ? - lprocfs_seq_register("llite", proc_lustre_root, - NULL, NULL) : NULL; + rc = vvp_global_init(); + if (rc != 0) + GOTO(out_tunables, rc); - lustre_register_client_fill_super(ll_fill_super); - lustre_register_kill_super_cb(ll_kill_super); + cl_inode_fini_env = cl_env_alloc(&cl_inode_fini_refcheck, + LCT_REMEMBER | LCT_NOREF); + if (IS_ERR(cl_inode_fini_env)) + GOTO(out_vvp, rc = PTR_ERR(cl_inode_fini_env)); - lustre_register_client_process_config(ll_process_config); + cl_inode_fini_env->le_ctx.lc_cookie = 0x4; - cfs_get_random_bytes(seed, sizeof(seed)); + rc = ll_xattr_init(); + if (rc != 0) + GOTO(out_inode_fini_env, rc); - /* Nodes with small feet have little entropy - * the NID for this node gives the most entropy in the low bits */ - for (i=0; ; i++) { - if (LNetGetId(i, &lnet_id) == -ENOENT) { - break; - } - if (LNET_NETTYP(LNET_NIDNET(lnet_id.nid)) != LOLND) { - seed[0] ^= LNET_NIDADDR(lnet_id.nid); - } - } + lustre_register_super_ops(THIS_MODULE, ll_fill_super, ll_kill_super); - do_gettimeofday(&tv); - cfs_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]); + RETURN(0); - init_timer(&ll_capa_timer); - ll_capa_timer.function = ll_capa_timer_callback; - rc = ll_capa_thread_start(); - /* - * XXX normal cleanup is needed here. - */ - if (rc == 0) - rc = vvp_global_init(); - - if (rc == 0) - rc = ll_xattr_init(); - - return rc; +out_inode_fini_env: + cl_env_put(cl_inode_fini_env, &cl_inode_fini_refcheck); +out_vvp: + vvp_global_fini(); +out_tunables: + llite_tunables_unregister(); +out_cache: + kmem_cache_destroy(ll_inode_cachep); + kmem_cache_destroy(ll_file_data_slab); + kmem_cache_destroy(pcc_inode_slab); + return rc; } -static void __exit exit_lustre_lite(void) +static void __exit lustre_exit(void) { - ll_xattr_fini(); - vvp_global_fini(); - del_timer(&ll_capa_timer); - ll_capa_thread_stop(); - LASSERTF(capa_count[CAPA_SITE_CLIENT] == 0, - "client remaining capa count %d\n", - capa_count[CAPA_SITE_CLIENT]); + lustre_register_super_ops(NULL, NULL, NULL); - lustre_register_client_fill_super(NULL); - lustre_register_kill_super_cb(NULL); + llite_tunables_unregister(); - lustre_register_client_process_config(NULL); - - ll_destroy_inodecache(); - - kmem_cache_destroy(ll_rmtperm_hash_cachep); - ll_rmtperm_hash_cachep = NULL; + ll_xattr_fini(); + cl_env_put(cl_inode_fini_env, &cl_inode_fini_refcheck); + vvp_global_fini(); - kmem_cache_destroy(ll_remote_perm_cachep); - ll_remote_perm_cachep = NULL; + /* + * Make sure all delayed rcu free inodes are flushed before we + * destroy cache. + */ + rcu_barrier(); + kmem_cache_destroy(ll_inode_cachep); kmem_cache_destroy(ll_file_data_slab); - if (proc_lustre_fs_root) - lprocfs_remove(&proc_lustre_fs_root); + kmem_cache_destroy(pcc_inode_slab); } -MODULE_AUTHOR("Sun Microsystems, Inc. "); -MODULE_DESCRIPTION("Lustre Lite Client File System"); +MODULE_AUTHOR("OpenSFS, Inc. "); +MODULE_DESCRIPTION("Lustre Client File System"); +MODULE_VERSION(LUSTRE_VERSION_STRING); MODULE_LICENSE("GPL"); -module_init(init_lustre_lite); -module_exit(exit_lustre_lite); +module_init(lustre_init); +module_exit(lustre_exit);