Whamcloud - gitweb
LU-12514 LNet: get entropy from nid when nid set.
[fs/lustre-release.git] / lustre / llite / super25.c
index 272cac9..4dc69e3 100644 (file)
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  */
 
 #define DEBUG_SUBSYSTEM S_LLITE
 
+#define D_MOUNT (D_SUPER | D_CONFIG/*|D_WARNING */)
+
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/version.h>
@@ -72,8 +73,13 @@ static void ll_destroy_inode(struct inode *inode)
 
 static int ll_drop_inode(struct inode *inode)
 {
-       int drop = generic_drop_inode(inode);
+       struct ll_sb_info *sbi = ll_i2sbi(inode);
+       int drop;
+
+       if (!sbi->ll_inode_cache_enabled)
+               return 1;
 
+       drop = generic_drop_inode(inode);
        if (!drop)
                drop = llcrypt_drop_inode(inode);
 
@@ -94,10 +100,126 @@ const struct super_operations lustre_super_operations =
        .show_options  = ll_show_options,
 };
 
+/**
+ * This is the entry point for the mount call into Lustre.
+ * This is called when a client is mounted, and this is
+ * where we start setting things up.
+ *
+ * @lmd2data data Mount options (e.g. -o flock,abort_recov)
+ */
+static int lustre_fill_super(struct super_block *sb, void *lmd2_data,
+                            int silent)
+{
+       struct lustre_mount_data *lmd;
+       struct lustre_sb_info *lsi;
+       int rc;
+
+       ENTRY;
+
+       CDEBUG(D_MOUNT|D_VFSTRACE, "VFS Op: sb %p\n", sb);
+
+       lsi = lustre_init_lsi(sb);
+       if (!lsi)
+               RETURN(-ENOMEM);
+       lmd = lsi->lsi_lmd;
+
+       /*
+        * Disable lockdep during mount, because mount locking patterns are
+        * 'special'.
+        */
+       lockdep_off();
+
+       /*
+        * LU-639: the OBD cleanup of last mount may not finish yet, wait here.
+        */
+       obd_zombie_barrier();
+
+       /* Figure out the lmd from the mount options */
+       if (lmd_parse(lmd2_data, lmd)) {
+               lustre_put_lsi(sb);
+               GOTO(out, rc = -EINVAL);
+       }
+
+       if (!lmd_is_client(lmd)) {
+#ifdef HAVE_SERVER_SUPPORT
+#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 15, 51, 0)
+               static bool printed;
+
+               if (!printed) {
+                       LCONSOLE_WARN("%s: mounting server target with '-t lustre' deprecated, use '-t lustre_tgt'\n",
+                                     lmd->lmd_profile);
+                       printed = true;
+               }
+#endif
+               rc = server_fill_super(sb);
+#else
+               rc = -ENODEV;
+               CERROR("%s: This is client-side-only module, cannot handle server mount: rc = %d\n",
+                      lmd->lmd_profile, rc);
+               lustre_put_lsi(sb);
+#endif
+               GOTO(out, rc);
+       }
+
+       CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
+       /* filename encryption is disabled by default */
+       lsi->lsi_flags &= ~LSI_FILENAME_ENC;
+       rc = lustre_start_mgc(sb);
+       if (rc) {
+               lustre_common_put_super(sb);
+               GOTO(out, rc);
+       }
+       /* Connect and start */
+       rc = ll_fill_super(sb);
+       /* ll_file_super will call lustre_common_put_super on failure,
+        * which takes care of the module reference.
+        *
+        * If error happens in fill_super() call, @lsi will be killed there.
+        * This is why we do not put it here.
+        */
+out:
+       if (rc) {
+               CERROR("llite: Unable to mount %s: rc = %d\n",
+                      s2lsi(sb) ? lmd->lmd_dev : "<unknown>", rc);
+       } else {
+               CDEBUG(D_SUPER, "%s: Mount complete\n",
+                      lmd->lmd_dev);
+       }
+       lockdep_on();
+       return rc;
+}
+
+/***************** FS registration ******************/
+static struct dentry *lustre_mount(struct file_system_type *fs_type, int flags,
+                                  const char *devname, void *data)
+{
+       return mount_nodev(fs_type, flags, data, lustre_fill_super);
+}
+
+static void lustre_kill_super(struct super_block *sb)
+{
+       struct lustre_sb_info *lsi = s2lsi(sb);
+
+       if (lsi && !IS_SERVER(lsi))
+               ll_kill_super(sb);
+
+       kill_anon_super(sb);
+}
+
+/** Register the "lustre" fs type
+ */
+static struct file_system_type lustre_fs_type = {
+       .owner          = THIS_MODULE,
+       .name           = "lustre",
+       .mount          = lustre_mount,
+       .kill_sb        = lustre_kill_super,
+       .fs_flags       = FS_RENAME_DOES_D_MOVE,
+};
+MODULE_ALIAS_FS("lustre");
+
 static int __init lustre_init(void)
 {
-       struct lnet_process_id lnet_id;
-       int i, rc;
+       int rc;
        unsigned long lustre_inode_cache_flags;
 
        BUILD_BUG_ON(sizeof(LUSTRE_VOLATILE_HDR) !=
@@ -137,15 +259,6 @@ static int __init lustre_init(void)
        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));
-       }
-
        rc = vvp_global_init();
        if (rc != 0)
                GOTO(out_tunables, rc);
@@ -161,10 +274,14 @@ static int __init lustre_init(void)
        if (rc != 0)
                GOTO(out_inode_fini_env, rc);
 
-       lustre_register_super_ops(THIS_MODULE, ll_fill_super, ll_kill_super);
+       rc = register_filesystem(&lustre_fs_type);
+       if (rc)
+               GOTO(out_xattr, rc);
 
        RETURN(0);
 
+out_xattr:
+       ll_xattr_fini();
 out_inode_fini_env:
        cl_env_put(cl_inode_fini_env, &cl_inode_fini_refcheck);
 out_vvp:
@@ -180,7 +297,7 @@ out_cache:
 
 static void __exit lustre_exit(void)
 {
-       lustre_register_super_ops(NULL, NULL, NULL);
+       unregister_filesystem(&lustre_fs_type);
 
        llite_tunables_unregister();