- struct mds_obd *mds = (struct mds_obd *) arg;
- struct timer_list timer;
-
- lock_kernel();
- daemonize();
- spin_lock_irq(¤t->sigmask_lock);
- sigfillset(¤t->blocked);
- recalc_sigpending(current);
- spin_unlock_irq(¤t->sigmask_lock);
-
- sprintf(current->comm, "lustre_mds");
-
- /* Set up an interval timer which can be used to trigger a
- wakeup after the interval expires */
- init_timer(&timer);
- timer.data = (unsigned long) current;
- timer.function = mds_timer_run;
- mds->mds_timer = &timer;
-
- /* Record that the thread is running */
- mds->mds_thread = current;
- wake_up(&mds->mds_done_waitq);
-
- printk(KERN_INFO "lustre_mds starting. Commit interval %d seconds\n",
- mds->mds_interval / HZ);
-
- /* XXX maintain a list of all managed devices: insert here */
-
- /* And now, wait forever for commit wakeup events. */
- while (1) {
- int rc;
-
- if (mds->mds_flags & MDS_UNMOUNT)
- break;
-
- wake_up(&mds->mds_done_waitq);
- interruptible_sleep_on(&mds->mds_waitq);
-
- CDEBUG(D_INODE, "lustre_mds wakes\n");
- CDEBUG(D_INODE, "pick up req here and continue\n");
-
- if (mds->mds_service != NULL) {
- ptl_event_t ev;
-
- while (1) {
- struct ptlrpc_request request;
- struct ptlrpc_service *service;
-
- rc = PtlEQGet(mds->mds_service->srv_eq_h, &ev);
- if (rc != PTL_OK && rc != PTL_EQ_DROPPED)
- break;
-
- service = (struct ptlrpc_service *)ev.mem_desc.user_ptr;
-
- /* FIXME: If we move to an event-driven model,
- * we should put the request on the stack of
- * mds_handle instead. */
- memset(&request, 0, sizeof(request));
- request.rq_reqbuf = ev.mem_desc.start +
- ev.offset;
- request.rq_reqlen = ev.mem_desc.length;
- request.rq_obd = MDS;
- request.rq_xid = ev.match_bits;
-
- request.rq_peer.peer_nid = ev.initiator.nid;
- /* FIXME: this NI should be the incoming NI.
- * We don't know how to find that from here. */
- request.rq_peer.peer_ni =
- mds->mds_service->srv_self.peer_ni;
- rc = mds_handle(&request);
-
- /* Inform the rpc layer the event has been handled */
- ptl_received_rpc(service);
- }
- } else {
- struct ptlrpc_request *request;
-
- if (list_empty(&mds->mds_reqs)) {
- CDEBUG(D_INODE, "woke because of timer\n");
- } else {
- request = list_entry(mds->mds_reqs.next,
- struct ptlrpc_request,
- rq_list);
- list_del(&request->rq_list);
- rc = mds_handle(request);
- }
- }
- }
-
- del_timer_sync(mds->mds_timer);
-
- /* XXX maintain a list of all managed devices: cleanup here */
-
- mds->mds_thread = NULL;
- wake_up(&mds->mds_done_waitq);
- printk("lustre_mds: exiting\n");
- return 0;