-static void mds_start_srv_thread(struct mds_obd *mds)
-{
- init_waitqueue_head(&mds->mds_waitq);
- init_waitqueue_head(&mds->mds_done_waitq);
- kernel_thread(mds_main, (void *)mds,
- CLONE_VM | CLONE_FS | CLONE_FILES);
- while (!mds->mds_thread)
- sleep_on(&mds->mds_done_waitq);
+ push_ctxt(&saved, &mds->mds_ctxt);
+ err = simple_mkdir(current->fs->pwd, "ROOT", 0700);
+ if (err && err != -EEXIST) {
+ CERROR("cannot create ROOT directory\n");
+ GOTO(err_svc, err);
+ }
+ err = simple_mkdir(current->fs->pwd, "FH", 0700);
+ if (err && err != -EEXIST) {
+ CERROR("cannot create FH directory\n");
+ GOTO(err_svc, err);
+ }
+ f = filp_open("last_rcvd", O_RDWR | O_CREAT, 0644);
+ if (IS_ERR(f)) {
+ CERROR("cannot open/create last_rcvd file\n");
+ GOTO(err_svc, err = PTR_ERR(f));
+ }
+ mds->last_rcvd = f;
+ pop_ctxt(&saved);
+
+ /*
+ * Replace the client filesystem delete_inode method with our own,
+ * so that we can clear the object ID before the inode is deleted.
+ * The fs_delete_inode method will call cl_delete_inode for us.
+ *
+ * We need to do this for the MDS superblock only, hence we install
+ * a modified copy of the original superblock method table.
+ *
+ * We still assume that there is only a single MDS client filesystem
+ * type, as we don't have access to the mds struct in * delete_inode.
+ */
+ OBD_ALLOC(s_ops, sizeof(*s_ops));
+ memcpy(s_ops, mds->mds_sb->s_op, sizeof(*s_ops));
+ mds->mds_fsops->cl_delete_inode = s_ops->delete_inode;
+ s_ops->delete_inode = mds->mds_fsops->fs_delete_inode;
+ mds->mds_sb->s_op = s_ops;
+
+ RETURN(0);
+
+err_svc:
+ rpc_unregister_service(mds->mds_service);
+ OBD_FREE(mds->mds_service, sizeof(*mds->mds_service));
+
+ return(err);