+ request_module("lquota");
+ mds_quota_interface_ref = PORTAL_SYMBOL_GET(mds_quota_interface);
+ rc = lquota_init(mds_quota_interface_ref);
+ if (rc) {
+ if (mds_quota_interface_ref)
+ PORTAL_SYMBOL_PUT(mds_quota_interface);
+ return rc;
+ }
+ init_obd_quota_ops(mds_quota_interface_ref, &mds_obd_ops);
+
+ lprocfs_mds_init_vars(&lvars);
+ class_register_type(&mds_obd_ops, NULL,
+ lvars.module_vars, LUSTRE_MDS_NAME, NULL);
+ lprocfs_mds_init_vars(&lvars);
+ mdt_obd_ops = mdt_obd_ops; //make compiler happy
+// class_register_type(&mdt_obd_ops, NULL,
+// lvars.module_vars, LUSTRE_MDT_NAME, NULL);
+
+ return 0;
+}
+
+static __attribute__((unused)) void /*__exit*/ mds_exit(void)
+{
+ lquota_exit(mds_quota_interface_ref);
+ if (mds_quota_interface_ref)
+ PORTAL_SYMBOL_PUT(mds_quota_interface);
+
+ class_unregister_type(LUSTRE_MDS_NAME);
+// class_unregister_type(LUSTRE_MDT_NAME);
+}
+/*mds still need lov setup here*/
+static int mds_cmd_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
+{
+ struct mds_obd *mds = &obd->u.mds;
+ struct lvfs_run_ctxt saved;
+ const char *dev;
+ struct vfsmount *mnt;
+ struct lustre_sb_info *lsi;
+ struct lustre_mount_info *lmi;
+ struct dentry *dentry;
+ int rc = 0;
+ ENTRY;
+
+ CDEBUG(D_INFO, "obd %s setup \n", obd->obd_name);
+ if (strncmp(obd->obd_name, MDD_OBD_NAME, strlen(MDD_OBD_NAME)))
+ RETURN(0);
+
+ if (lcfg->lcfg_bufcount < 5) {
+ CERROR("invalid arg for setup %s\n", MDD_OBD_NAME);
+ RETURN(-EINVAL);
+ }
+ dev = lustre_cfg_string(lcfg, 4);
+ lmi = server_get_mount(dev);
+ LASSERT(lmi != NULL);
+
+ lsi = s2lsi(lmi->lmi_sb);
+ mnt = lmi->lmi_mnt;
+ /* FIXME: MDD LOV initialize objects.
+ * we need only lmi here but not get mount
+ * OSD did mount already, so put mount back
+ */
+ atomic_dec(&lsi->lsi_mounts);
+ mntput(mnt);
+
+ obd->obd_fsops = fsfilt_get_ops(MT_STR(lsi->lsi_ldd));
+ mds_init_ctxt(obd, mnt);
+
+ push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
+ dentry = simple_mkdir(current->fs->pwd, "OBJECTS", 0777, 1);
+ if (IS_ERR(dentry)) {
+ rc = PTR_ERR(dentry);
+ CERROR("cannot create OBJECTS directory: rc = %d\n", rc);
+ GOTO(err_putfs, rc);
+ }
+ mds->mds_objects_dir = dentry;
+
+ dentry = lookup_one_len("__iopen__", current->fs->pwd,
+ strlen("__iopen__"));
+ if (IS_ERR(dentry)) {
+ rc = PTR_ERR(dentry);
+ CERROR("cannot lookup __iopen__ directory: rc = %d\n", rc);
+ GOTO(err_objects, rc);
+ }
+
+ mds->mds_fid_de = dentry;
+ if (!dentry->d_inode || is_bad_inode(dentry->d_inode)) {
+ rc = -ENOENT;
+ CERROR("__iopen__ directory has no inode? rc = %d\n", rc);
+ GOTO(err_fid, rc);
+ }
+ rc = mds_lov_init_objids(obd);
+ if (rc != 0) {
+ CERROR("cannot init lov objid rc = %d\n", rc);
+ GOTO(err_fid, rc );
+ }
+
+ rc = mds_lov_presetup(mds, lcfg);
+ if (rc < 0)
+ GOTO(err_objects, rc);
+
+ /* Don't wait for mds_postrecov trying to clear orphans */
+ obd->obd_async_recov = 1;
+ rc = mds_postsetup(obd);
+ /* Bug 11557 - allow async abort_recov start
+ FIXME can remove most of this obd_async_recov plumbing
+ obd->obd_async_recov = 0;
+ */
+
+ if (rc)
+ GOTO(err_objects, rc);
+
+ mds->mds_max_mdsize = sizeof(struct lov_mds_md);
+ mds->mds_max_cookiesize = sizeof(struct llog_cookie);
+
+err_pop:
+ pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
+ RETURN(rc);
+err_fid:
+ dput(mds->mds_fid_de);
+err_objects:
+ dput(mds->mds_objects_dir);
+err_putfs:
+ fsfilt_put_ops(obd->obd_fsops);
+ goto err_pop;
+}
+
+static int mds_cmd_cleanup(struct obd_device *obd)
+{
+ struct mds_obd *mds = &obd->u.mds;
+ struct lvfs_run_ctxt saved;
+ int rc = 0;
+ ENTRY;
+
+ if (obd->obd_fail)
+ LCONSOLE_WARN("%s: shutting down for failover; client state "
+ "will be preserved.\n", obd->obd_name);
+
+ push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
+
+ mds_lov_destroy_objids(obd);