+ .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,
+};
+
+/**
+ * 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;