Whamcloud - gitweb
- more LDLM refcount locking infrastructure
[fs/lustre-release.git] / lustre / ldlm / ldlm_lockd.c
index bf70eb0..4f778df 100644 (file)
@@ -21,10 +21,9 @@ extern kmem_cache_t *ldlm_lock_slab;
 extern int (*mds_reint_p)(int offset, struct ptlrpc_request *req);
 extern int (*mds_getattr_name_p)(int offset, struct ptlrpc_request *req);
 
-static int ldlm_handle_enqueue(struct obd_device *obddev,
-                               struct ptlrpc_service *svc,
-                               struct ptlrpc_request *req)
+static int ldlm_handle_enqueue(struct ptlrpc_request *req)
 {
+        struct obd_device *obddev = req->rq_export->export_obd;
         struct ldlm_reply *dlm_rep;
         struct ldlm_request *dlm_req;
         int rc, size = sizeof(*dlm_rep), cookielen = 0;
@@ -87,26 +86,24 @@ static int ldlm_handle_enqueue(struct obd_device *obddev,
         lock->l_connection = ptlrpc_connection_addref(req->rq_connection);
         EXIT;
  out:
-        if (lock)
+        if (lock) {
+                LDLM_DEBUG(lock, "server-side enqueue handler, sending reply");
                 ldlm_lock_put(lock);
+        }
         req->rq_status = err;
         CDEBUG(D_INFO, "err = %d\n", err);
 
-        if (ptlrpc_reply(svc, req))
+        if (ptlrpc_reply(req->rq_svc, req))
                 LBUG();
 
-        if (err)
-                LDLM_DEBUG_NOLOCK("server-side enqueue handler END");
-        else {
+        if (!err)
                 ldlm_reprocess_all(lock->l_resource);
-                LDLM_DEBUG(lock, "server-side enqueue handler END");
-        }
+        LDLM_DEBUG_NOLOCK("server-side enqueue handler END");
 
         return 0;
 }
 
-static int ldlm_handle_convert(struct ptlrpc_service *svc,
-                               struct ptlrpc_request *req)
+static int ldlm_handle_convert(struct ptlrpc_request *req)
 {
         struct ldlm_request *dlm_req;
         struct ldlm_reply *dlm_rep;
@@ -132,7 +129,7 @@ static int ldlm_handle_convert(struct ptlrpc_service *svc,
                                   &dlm_rep->lock_flags);
                 req->rq_status = 0;
         }
-        if (ptlrpc_reply(svc, req) != 0)
+        if (ptlrpc_reply(req->rq_svc, req) != 0)
                 LBUG();
 
         ldlm_reprocess_all(lock->l_resource);
@@ -142,8 +139,7 @@ static int ldlm_handle_convert(struct ptlrpc_service *svc,
         RETURN(0);
 }
 
-static int ldlm_handle_cancel(struct ptlrpc_service *svc,
-                              struct ptlrpc_request *req)
+static int ldlm_handle_cancel(struct ptlrpc_request *req)
 {
         struct ldlm_request *dlm_req;
         struct ldlm_lock *lock;
@@ -166,7 +162,7 @@ static int ldlm_handle_cancel(struct ptlrpc_service *svc,
                 req->rq_status = 0;
         }
 
-        if (ptlrpc_reply(svc, req) != 0)
+        if (ptlrpc_reply(req->rq_svc, req) != 0)
                 LBUG();
 
         ldlm_reprocess_all(lock->l_resource);
@@ -176,8 +172,7 @@ static int ldlm_handle_cancel(struct ptlrpc_service *svc,
         RETURN(0);
 }
 
-static int ldlm_handle_callback(struct ptlrpc_service *svc,
-                                struct ptlrpc_request *req)
+static int ldlm_handle_callback(struct ptlrpc_request *req)
 {
         struct ldlm_request *dlm_req;
         struct ldlm_lock_desc *descp = NULL; 
@@ -195,7 +190,7 @@ static int ldlm_handle_callback(struct ptlrpc_service *svc,
 
         /* We must send the reply first, so that the thread is free to handle
          * any requests made in common_callback() */
-        rc = ptlrpc_reply(svc, req);
+        rc = ptlrpc_reply(req->rq_svc, req);
         if (rc != 0)
                 RETURN(rc);
         
@@ -224,8 +219,8 @@ static int ldlm_handle_callback(struct ptlrpc_service *svc,
                 l_unlock(&lock->l_resource->lr_namespace->ns_lock);
                 
                 if (do_ast) {
-                        CDEBUG(D_INFO, "Lock already unused, calling "
-                               "callback (%p).\n", lock->l_blocking_ast);
+                        LDLM_DEBUG(lock, "already unused, calling "
+                                   "callback (%p)", lock->l_blocking_ast);
                         if (lock->l_blocking_ast != NULL) {
                                 struct lustre_handle lockh;
                                 ldlm_lock2handle(lock, &lockh);
@@ -269,11 +264,9 @@ static int ldlm_handle_callback(struct ptlrpc_service *svc,
         RETURN(0);
 }
 
-static int lustre_handle(struct ptlrpc_request *req)
+static int ldlm_handle(struct ptlrpc_request *req)
 {
-        struct ptlrpc_service *svc = req->rq_svc;
-        struct obd_device *req_dev;
-        int id, rc;
+        int rc;
         ENTRY;
 
         rc = lustre_unpack_msg(req->rq_reqmsg, req->rq_reqlen);
@@ -288,52 +281,52 @@ static int lustre_handle(struct ptlrpc_request *req)
                 GOTO(out, rc = -EINVAL);
         }
 
-        id = req->rq_reqmsg->target_id;
-        if (id < 0 || id > MAX_OBD_DEVICES)
-                GOTO(out, rc = -ENODEV);
-        req_dev = req->rq_obd = &obd_dev[id];
-
+        if (!req->rq_export && 
+            req->rq_reqmsg->opc == LDLM_ENQUEUE) { 
+                CERROR("No export handle for enqueue request.\n");
+                GOTO(out, rc = -ENOTCONN);
+        }
         switch (req->rq_reqmsg->opc) {
         case LDLM_ENQUEUE:
                 CDEBUG(D_INODE, "enqueue\n");
                 OBD_FAIL_RETURN(OBD_FAIL_LDLM_ENQUEUE, 0);
-                rc = ldlm_handle_enqueue(req_dev, svc, req);
+                rc = ldlm_handle_enqueue(req);
                 break;
 
         case LDLM_CONVERT:
                 CDEBUG(D_INODE, "convert\n");
                 OBD_FAIL_RETURN(OBD_FAIL_LDLM_CONVERT, 0);
-                rc = ldlm_handle_convert(svc, req);
+                rc = ldlm_handle_convert(req);
                 break;
 
         case LDLM_CANCEL:
                 CDEBUG(D_INODE, "cancel\n");
                 OBD_FAIL_RETURN(OBD_FAIL_LDLM_CANCEL, 0);
-                rc = ldlm_handle_cancel(svc, req);
+                rc = ldlm_handle_cancel(req);
                 break;
 
         case LDLM_CALLBACK:
                 CDEBUG(D_INODE, "callback\n");
                 OBD_FAIL_RETURN(OBD_FAIL_LDLM_CALLBACK, 0);
-                rc = ldlm_handle_callback(svc, req);
+                rc = ldlm_handle_callback(req);
                 break;
 
         default:
-                rc = ptlrpc_error(svc, req);
+                rc = ptlrpc_error(req->rq_svc, req);
                 RETURN(rc);
         }
 
         EXIT;
 out:
         if (rc)
-                RETURN(ptlrpc_error(svc, req));
+                RETURN(ptlrpc_error(req->rq_svc, req));
         return 0;
 }
 
-static int ldlm_iocontrol(long cmd, struct obd_conn *conn, int len, void *karg,
+static int ldlm_iocontrol(long cmd, struct lustre_handle *conn, int len, void *karg,
                           void *uarg)
 {
-        struct obd_device *obddev = gen_conn2obd(conn);
+        struct obd_device *obddev = class_conn2obd(conn);
         struct ptlrpc_connection *connection;
         int err;
         ENTRY;
@@ -384,7 +377,7 @@ static int ldlm_setup(struct obd_device *obddev, obd_count len, void *buf)
         MOD_INC_USE_COUNT;
         ldlm->ldlm_service =
                 ptlrpc_init_svc(64 * 1024, LDLM_REQUEST_PORTAL,
-                                LDLM_REPLY_PORTAL, "self", lustre_handle);
+                                LDLM_REPLY_PORTAL, "self", ldlm_handle);
         if (!ldlm->ldlm_service) {
                 LBUG();
                 GOTO(out_dec, rc = -ENOMEM);
@@ -393,9 +386,6 @@ static int ldlm_setup(struct obd_device *obddev, obd_count len, void *buf)
         for (i = 0; i < LDLM_NUM_THREADS; i++) {
                 rc = ptlrpc_start_thread(obddev, ldlm->ldlm_service,
                                          "lustre_dlm");
-                /* XXX We could just continue if we had started at least
-                 *     a few threads here.
-                 */
                 if (rc) {
                         CERROR("cannot start LDLM thread #%d: rc %d\n", i, rc);
                         LBUG();
@@ -434,14 +424,14 @@ struct obd_ops ldlm_obd_ops = {
         o_iocontrol:   ldlm_iocontrol,
         o_setup:       ldlm_setup,
         o_cleanup:     ldlm_cleanup,
-        o_connect:     gen_connect,
-        o_disconnect:  gen_disconnect
+        o_connect:     class_connect,
+        o_disconnect:  class_disconnect
 };
 
 
 static int __init ldlm_init(void)
 {
-        int rc = obd_register_type(&ldlm_obd_ops, OBD_LDLM_DEVICENAME);
+        int rc = class_register_type(&ldlm_obd_ops, OBD_LDLM_DEVICENAME);
         if (rc != 0)
                 return rc;
 
@@ -464,7 +454,7 @@ static int __init ldlm_init(void)
 
 static void __exit ldlm_exit(void)
 {
-        obd_unregister_type(OBD_LDLM_DEVICENAME);
+        class_unregister_type(OBD_LDLM_DEVICENAME);
         if (kmem_cache_destroy(ldlm_resource_slab) != 0)
                 CERROR("couldn't free ldlm resource slab\n");
         if (kmem_cache_destroy(ldlm_lock_slab) != 0)