Whamcloud - gitweb
land v0.9.1 on HEAD, in preparation for a 1.0.x branch
[fs/lustre-release.git] / lustre / liblustre / libtest.c
index 1d523a6..87dba3d 100644 (file)
 #include <liblustre.h>
 #include <linux/obd.h>
 #include <linux/obd_class.h>
-#include <portals/procbridge.h>
+#include <procbridge.h>
+
+#define LIBLUSTRE_TEST 1
+#include "../utils/lctl.c"
 
 struct ldlm_namespace;
 struct ldlm_res_id;
 struct obd_import;
 
-extern int ldlm_cli_cancel_unused(struct ldlm_namespace *ns, struct ldlm_res_id *res_id, int flags);
-extern int ldlm_namespace_cleanup(struct ldlm_namespace *ns, int local_only);
-extern int ldlm_replay_locks(struct obd_import *imp);
-
 void *inter_module_get(char *arg)
 {
         if (!strcmp(arg, "tcpnal_ni"))
@@ -34,6 +33,29 @@ void *inter_module_get(char *arg)
                 return NULL;
 }
 
+/* XXX move to proper place */
+char *portals_nid2str(int nal, ptl_nid_t nid, char *str)
+{
+        switch(nal){
+        case TCPNAL:
+                /* userspace NAL */
+        case SOCKNAL:
+                sprintf(str, "%u:%d.%d.%d.%d", (__u32)(nid >> 32),
+                        HIPQUAD(nid));
+                break;
+        case QSWNAL:
+        case GMNAL:
+        case IBNAL:
+        case TOENAL:
+        case SCIMACNAL:
+                sprintf(str, "%u:%u", (__u32)(nid >> 32), (__u32)nid);
+                break;
+        default:
+                return NULL;
+        }
+        return str;
+}
+
 ptl_handle_ni_t         tcpnal_ni;
 
 struct pingcli_args {
@@ -52,7 +74,13 @@ struct obd_class_user_state ocus;
 ptl_handle_ni_t *
 kportal_get_ni (int nal)
 {
-        return &tcpnal_ni;
+        switch (nal)
+        {
+        case SOCKNAL:
+                return &tcpnal_ni;
+        default:
+                return NULL;
+        }
 }
 
 inline void
@@ -61,22 +89,44 @@ kportal_put_ni (int nal)
         return;
 }
 
-void init_current(int argc, char **argv)
+int
+kportal_nal_cmd(struct portals_cfg *pcfg)
+{
+#if 0
+        __u32 nal = pcfg->pcfg_nal;
+        int rc = -EINVAL;
+
+        ENTRY;
+
+        down(&nal_cmd_sem);
+        if (nal > 0 && nal <= NAL_MAX_NR && nal_cmd[nal].nch_handler) {
+                CDEBUG(D_IOCTL, "calling handler nal: %d, cmd: %d\n", nal, 
+                       pcfg->pcfg_command);
+                rc = nal_cmd[nal].nch_handler(pcfg, nal_cmd[nal].nch_private);
+        }
+        up(&nal_cmd_sem);
+        RETURN(rc);
+#else
+        CERROR("empty function!!!\n");
+        return 0;
+#endif
+}
+
+int init_current(int argc, char **argv)
 { 
         current = malloc(sizeof(*current));
         strncpy(current->comm, argv[0], sizeof(current->comm));
         current->pid = getpid();
-
+       return 0;
 }
 
 ptl_nid_t tcpnal_mynid;
 
-int init_lib_portals(struct pingcli_args *args)
+int init_lib_portals()
 {
         int rc;
 
         PtlInit();
-        tcpnal_mynid = args->mynid;
         rc = PtlNIInit(procbridge_interface, 0, 0, 0, &tcpnal_ni);
         if (rc != 0) {
                 CERROR("ksocknal: PtlNIInit failed: error %d\n", rc);
@@ -90,47 +140,108 @@ int init_lib_portals(struct pingcli_args *args)
 extern int class_handle_ioctl(struct obd_class_user_state *ocus, unsigned int cmd, unsigned long arg);
 
 
+int lib_ioctl_nalcmd(int dev_id, int opc, void * ptr)
+{
+        struct portal_ioctl_data *ptldata;
+
+        if (opc == IOC_PORTAL_NAL_CMD) {
+                ptldata = (struct portal_ioctl_data *) ptr;
+
+                if (ptldata->ioc_nal_cmd == NAL_CMD_REGISTER_MYNID) {
+                        tcpnal_mynid = ptldata->ioc_nid;
+                        printf("mynid: %u.%u.%u.%u\n",
+                                (unsigned)(tcpnal_mynid>>24) & 0xFF,
+                                (unsigned)(tcpnal_mynid>>16) & 0xFF,
+                                (unsigned)(tcpnal_mynid>>8) & 0xFF,
+                                (unsigned)(tcpnal_mynid) & 0xFF);
+                }
+        }
+
+       return (0);
+}
+
 int lib_ioctl(int dev_id, int opc, void * ptr)
 {
 
        if (dev_id == OBD_DEV_ID) {
-                struct obd_ioctl_data *ioc = ptr;
                class_handle_ioctl(&ocus, opc, (unsigned long)ptr);
 
                /* you _may_ need to call obd_ioctl_unpack or some
                   other verification function if you want to use ioc
                   directly here */
+#if 0
                printf ("processing ioctl cmd: %x buf len: %d\n", 
                        opc,  ioc->ioc_len);
+#endif
        }
        return (0);
 }
 
+int liblustre_ioctl(int dev_id, int opc, void *ptr)
+{
+       int   rc = -EINVAL;
+       
+       switch (dev_id) {
+       default:
+               fprintf(stderr, "Unexpected device id %d\n", dev_id);
+               abort();
+               break;
+               
+       case OBD_DEV_ID:
+               rc = class_handle_ioctl(&ocus, opc, (unsigned long)ptr);
+               break;
+       }
+
+       return rc;
+}
+
+extern int time_ptlwait1;
+extern int time_ptlwait2;
+extern int time_ptlselect;
 int main(int argc, char **argv) 
 {
-        struct pingcli_args *args;
-       args= malloc(sizeof(*args));
-        if (!args) { 
-                printf("Malloc error\n");
-                exit(1);
+        char *config_file;
+
+        if (argc > 2) {
+                printf("Usage: %s [config_file]\n", argv[0]);
+                return 1;
         }
 
-       args->mynid   = ntohl (inet_addr (argv[1]));
-        INIT_LIST_HEAD(&ocus.ocus_conns);
+        if (argc == 2) {
+                config_file = argv[1];
+               argc--;
+               argv++;
+       } else
+                config_file = "/tmp/DUMP_FILE";
 
-        init_current(argc, argv);
-        init_obdclass();
-        init_lib_portals(args);
-        ptlrpc_init();
-        ldlm_init();
-        mdc_init();
-        lov_init();
-        osc_init();
-        echo_client_init();
+        srand(time(NULL));
 
-       parse_dump("/tmp/DUMP_FILE", lib_ioctl);
+        INIT_LIST_HEAD(&ocus.ocus_conns);
+#if 1
+       portal_debug = 0;
+       portal_subsystem_debug = 0;
+#endif
+       parse_dump(config_file, lib_ioctl_nalcmd);
+
+        if (init_current(argc, argv) ||
+           init_obdclass() || init_lib_portals() ||
+           ptlrpc_init() ||
+           ldlm_init() ||
+           mdc_init() ||
+           lov_init() ||
+           osc_init() ||
+           echo_client_init()) {
+               printf("error\n");
+               return 1;
+       }
 
-        printf("Hello\n");
-        return 0;
+       parse_dump(config_file, lib_ioctl);
+
+       set_ioc_handler(liblustre_ioctl);
+#if 0  
+       portal_debug = -1;
+       portal_subsystem_debug = -1;
+#endif
+       return lctl_main(argc, argv);
 }