Whamcloud - gitweb
LU-3540 lod: update recovery thread
[fs/lustre-release.git] / lustre / fid / fid_request.c
index a929833..528bed7 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 
 #define DEBUG_SUBSYSTEM S_FID
 
-#ifdef __KERNEL__
-# include <libcfs/libcfs.h>
-# include <linux/module.h>
-#else /* __KERNEL__ */
-# include <liblustre.h>
-#endif
-
+#include <linux/module.h>
+#include <libcfs/libcfs.h>
 #include <obd.h>
 #include <obd_class.h>
-#include <dt_object.h>
-#include <md_object.h>
 #include <obd_support.h>
-#include <lustre_req_layout.h>
 #include <lustre_fid.h>
 /* mdc RPC locks */
 #include <lustre_mdc.h>
@@ -72,6 +64,7 @@ static int seq_client_rpc(struct lu_client_seq *seq,
        int                    rc;
        ENTRY;
 
+       LASSERT(exp != NULL && !IS_ERR(exp));
        req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp), &RQF_SEQ_QUERY,
                                        LUSTRE_MDS_VERSION, SEQ_QUERY);
        if (req == NULL)
@@ -106,19 +99,28 @@ static int seq_client_rpc(struct lu_client_seq *seq,
                        req->rq_no_delay = req->rq_no_resend = 1;
                debug_mask = D_CONSOLE;
        } else {
-               if (seq->lcs_type == LUSTRE_SEQ_METADATA)
+               if (seq->lcs_type == LUSTRE_SEQ_METADATA) {
+                       req->rq_reply_portal = MDC_REPLY_PORTAL;
                        req->rq_request_portal = SEQ_METADATA_PORTAL;
-               else
+               } else {
+                       req->rq_reply_portal = OSC_REPLY_PORTAL;
                        req->rq_request_portal = SEQ_DATA_PORTAL;
+               }
+
                debug_mask = D_INFO;
        }
 
+       /* Allow seq client RPC during recovery time. */
+       req->rq_allow_replay = 1;
+
        ptlrpc_at_set_req_timeout(req);
 
-       if (seq->lcs_type == LUSTRE_SEQ_METADATA)
+       if (opc != SEQ_ALLOC_SUPER && seq->lcs_type == LUSTRE_SEQ_METADATA)
                mdc_get_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
+
        rc = ptlrpc_queue_wait(req);
-       if (seq->lcs_type == LUSTRE_SEQ_METADATA)
+
+       if (opc != SEQ_ALLOC_SUPER && seq->lcs_type == LUSTRE_SEQ_METADATA)
                mdc_put_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
        if (rc)
                GOTO(out_req, rc);
@@ -156,13 +158,15 @@ int seq_client_alloc_super(struct lu_client_seq *seq,
 
        mutex_lock(&seq->lcs_mutex);
 
-#ifdef __KERNEL__
         if (seq->lcs_srv) {
+#ifdef HAVE_SEQ_SERVER
                 LASSERT(env != NULL);
                 rc = seq_server_alloc_super(seq->lcs_srv, &seq->lcs_space,
                                             env);
-        } else {
+#else
+               rc = 0;
 #endif
+       } else {
                /* Check whether the connection to seq controller has been
                 * setup (lcs_exp != NULL) */
                if (seq->lcs_exp == NULL) {
@@ -172,9 +176,7 @@ int seq_client_alloc_super(struct lu_client_seq *seq,
 
                rc = seq_client_rpc(seq, &seq->lcs_space,
                                     SEQ_ALLOC_SUPER, "super");
-#ifdef __KERNEL__
         }
-#endif
        mutex_unlock(&seq->lcs_mutex);
         RETURN(rc);
 }
@@ -186,12 +188,14 @@ static int seq_client_alloc_meta(const struct lu_env *env,
         int rc;
         ENTRY;
 
-#ifdef __KERNEL__
         if (seq->lcs_srv) {
+#ifdef HAVE_SEQ_SERVER
                 LASSERT(env != NULL);
                 rc = seq_server_alloc_meta(seq->lcs_srv, &seq->lcs_space, env);
-        } else {
+#else
+               rc = 0;
 #endif
+       } else {
                do {
                        /* If meta server return -EINPROGRESS or EAGAIN,
                         * it means meta server might not be ready to
@@ -200,15 +204,14 @@ static int seq_client_alloc_meta(const struct lu_env *env,
                        rc = seq_client_rpc(seq, &seq->lcs_space,
                                            SEQ_ALLOC_META, "meta");
                } while (rc == -EINPROGRESS || rc == -EAGAIN);
-#ifdef __KERNEL__
         }
-#endif
+
         RETURN(rc);
 }
 
 /* Allocate new sequence for client. */
 static int seq_client_alloc_seq(const struct lu_env *env,
-                                struct lu_client_seq *seq, seqno_t *seqnr)
+                               struct lu_client_seq *seq, u64 *seqnr)
 {
         int rc;
         ENTRY;
@@ -240,45 +243,45 @@ static int seq_client_alloc_seq(const struct lu_env *env,
 }
 
 static int seq_fid_alloc_prep(struct lu_client_seq *seq,
-                              cfs_waitlink_t *link)
+                             wait_queue_t *link)
 {
-        if (seq->lcs_update) {
-                cfs_waitq_add(&seq->lcs_waitq, link);
-                cfs_set_current_state(CFS_TASK_UNINT);
+       if (seq->lcs_update) {
+               add_wait_queue(&seq->lcs_waitq, link);
+               set_current_state(TASK_UNINTERRUPTIBLE);
                mutex_unlock(&seq->lcs_mutex);
 
-                cfs_waitq_wait(link, CFS_TASK_UNINT);
+               schedule();
 
                mutex_lock(&seq->lcs_mutex);
-                cfs_waitq_del(&seq->lcs_waitq, link);
-                cfs_set_current_state(CFS_TASK_RUNNING);
-                return -EAGAIN;
-        }
-        ++seq->lcs_update;
+               remove_wait_queue(&seq->lcs_waitq, link);
+               set_current_state(TASK_RUNNING);
+               return -EAGAIN;
+       }
+       ++seq->lcs_update;
        mutex_unlock(&seq->lcs_mutex);
-        return 0;
+       return 0;
 }
 
 static void seq_fid_alloc_fini(struct lu_client_seq *seq)
 {
-        LASSERT(seq->lcs_update == 1);
+       LASSERT(seq->lcs_update == 1);
        mutex_lock(&seq->lcs_mutex);
-        --seq->lcs_update;
-        cfs_waitq_signal(&seq->lcs_waitq);
+       --seq->lcs_update;
+       wake_up(&seq->lcs_waitq);
 }
 
 /**
  * Allocate the whole seq to the caller.
  **/
 int seq_client_get_seq(const struct lu_env *env,
-                       struct lu_client_seq *seq, seqno_t *seqnr)
+                      struct lu_client_seq *seq, u64 *seqnr)
 {
-        cfs_waitlink_t link;
-        int rc;
+       wait_queue_t link;
+       int rc;
 
-        LASSERT(seqnr != NULL);
+       LASSERT(seqnr != NULL);
        mutex_lock(&seq->lcs_mutex);
-        cfs_waitlink_init(&link);
+       init_waitqueue_entry(&link, current);
 
         while (1) {
                 rc = seq_fid_alloc_prep(seq, &link);
@@ -320,23 +323,23 @@ EXPORT_SYMBOL(seq_client_get_seq);
 
 /* Allocate new fid on passed client @seq and save it to @fid. */
 int seq_client_alloc_fid(const struct lu_env *env,
-                         struct lu_client_seq *seq, struct lu_fid *fid)
+                        struct lu_client_seq *seq, struct lu_fid *fid)
 {
-        cfs_waitlink_t link;
-        int rc;
-        ENTRY;
+       wait_queue_t link;
+       int rc;
+       ENTRY;
 
-        LASSERT(seq != NULL);
-        LASSERT(fid != NULL);
+       LASSERT(seq != NULL);
+       LASSERT(fid != NULL);
 
-        cfs_waitlink_init(&link);
+       init_waitqueue_entry(&link, current);
        mutex_lock(&seq->lcs_mutex);
 
        if (OBD_FAIL_CHECK(OBD_FAIL_SEQ_EXHAUST))
                seq->lcs_fid.f_oid = seq->lcs_width;
 
         while (1) {
-                seqno_t seqnr;
+               u64 seqnr;
 
                 if (!fid_is_zero(&seq->lcs_fid) &&
                     fid_oid(&seq->lcs_fid) < seq->lcs_width) {
@@ -390,23 +393,23 @@ EXPORT_SYMBOL(seq_client_alloc_fid);
  */
 void seq_client_flush(struct lu_client_seq *seq)
 {
-        cfs_waitlink_t link;
+       wait_queue_t link;
 
-        LASSERT(seq != NULL);
-        cfs_waitlink_init(&link);
+       LASSERT(seq != NULL);
+       init_waitqueue_entry(&link, current);
        mutex_lock(&seq->lcs_mutex);
 
-        while (seq->lcs_update) {
-                cfs_waitq_add(&seq->lcs_waitq, &link);
-                cfs_set_current_state(CFS_TASK_UNINT);
+       while (seq->lcs_update) {
+               add_wait_queue(&seq->lcs_waitq, &link);
+               set_current_state(TASK_UNINTERRUPTIBLE);
                mutex_unlock(&seq->lcs_mutex);
 
-                cfs_waitq_wait(&link, CFS_TASK_UNINT);
+               schedule();
 
                mutex_lock(&seq->lcs_mutex);
-                cfs_waitq_del(&seq->lcs_waitq, &link);
-                cfs_set_current_state(CFS_TASK_RUNNING);
-        }
+               remove_wait_queue(&seq->lcs_waitq, &link);
+               set_current_state(TASK_RUNNING);
+       }
 
         fid_zero(&seq->lcs_fid);
         /**
@@ -421,18 +424,27 @@ void seq_client_flush(struct lu_client_seq *seq)
 }
 EXPORT_SYMBOL(seq_client_flush);
 
-static void seq_client_proc_fini(struct lu_client_seq *seq);
+static void seq_client_proc_fini(struct lu_client_seq *seq)
+{
+#ifdef CONFIG_PROC_FS
+       ENTRY;
+       if (seq->lcs_proc_dir) {
+               if (!IS_ERR(seq->lcs_proc_dir))
+                       lprocfs_remove(&seq->lcs_proc_dir);
+               seq->lcs_proc_dir = NULL;
+       }
+       EXIT;
+#endif /* CONFIG_PROC_FS */
+}
 
-#ifdef LPROCFS
 static int seq_client_proc_init(struct lu_client_seq *seq)
 {
+#ifdef CONFIG_PROC_FS
         int rc;
         ENTRY;
 
-        seq->lcs_proc_dir = lprocfs_register(seq->lcs_name,
-                                             seq_type_proc_dir,
-                                             NULL, NULL);
-
+       seq->lcs_proc_dir = lprocfs_register(seq->lcs_name, seq_type_proc_dir,
+                                            NULL, NULL);
         if (IS_ERR(seq->lcs_proc_dir)) {
                 CERROR("%s: LProcFS failed in seq-init\n",
                        seq->lcs_name);
@@ -440,8 +452,7 @@ static int seq_client_proc_init(struct lu_client_seq *seq)
                 RETURN(rc);
         }
 
-        rc = lprocfs_add_vars(seq->lcs_proc_dir,
-                              seq_client_proc_list, seq);
+       rc = lprocfs_add_vars(seq->lcs_proc_dir, seq_client_proc_list, seq);
         if (rc) {
                 CERROR("%s: Can't init sequence manager "
                        "proc, rc %d\n", seq->lcs_name, rc);
@@ -453,29 +464,11 @@ static int seq_client_proc_init(struct lu_client_seq *seq)
 out_cleanup:
         seq_client_proc_fini(seq);
         return rc;
-}
-
-static void seq_client_proc_fini(struct lu_client_seq *seq)
-{
-        ENTRY;
-        if (seq->lcs_proc_dir) {
-                if (!IS_ERR(seq->lcs_proc_dir))
-                        lprocfs_remove(&seq->lcs_proc_dir);
-                seq->lcs_proc_dir = NULL;
-        }
-        EXIT;
-}
-#else
-static int seq_client_proc_init(struct lu_client_seq *seq)
-{
-        return 0;
-}
 
-static void seq_client_proc_fini(struct lu_client_seq *seq)
-{
-        return;
+#else /* !CONFIG_PROC_FS */
+       return 0;
+#endif /* CONFIG_PROC_FS */
 }
-#endif
 
 int seq_client_init(struct lu_client_seq *seq,
                     struct obd_export *exp,
@@ -498,14 +491,12 @@ int seq_client_init(struct lu_client_seq *seq,
        else
                seq->lcs_width = LUSTRE_DATA_SEQ_MAX_WIDTH;
 
-       cfs_waitq_init(&seq->lcs_waitq);
+       init_waitqueue_head(&seq->lcs_waitq);
        /* Make sure that things are clear before work is started. */
        seq_client_flush(seq);
 
        if (exp != NULL)
                seq->lcs_exp = class_export_get(exp);
-       else if (type == LUSTRE_SEQ_METADATA)
-               LASSERT(seq->lcs_srv != NULL);
 
        snprintf(seq->lcs_name, sizeof(seq->lcs_name),
                 "cli-%s", prefix);
@@ -532,3 +523,87 @@ void seq_client_fini(struct lu_client_seq *seq)
         EXIT;
 }
 EXPORT_SYMBOL(seq_client_fini);
+
+int client_fid_init(struct obd_device *obd,
+                   struct obd_export *exp, enum lu_cli_type type)
+{
+       struct client_obd *cli = &obd->u.cli;
+       char *prefix;
+       int rc;
+       ENTRY;
+
+       OBD_ALLOC_PTR(cli->cl_seq);
+       if (cli->cl_seq == NULL)
+               RETURN(-ENOMEM);
+
+       OBD_ALLOC(prefix, MAX_OBD_NAME + 5);
+       if (prefix == NULL)
+               GOTO(out_free_seq, rc = -ENOMEM);
+
+       snprintf(prefix, MAX_OBD_NAME + 5, "cli-%s", obd->obd_name);
+
+       /* Init client side sequence-manager */
+       rc = seq_client_init(cli->cl_seq, exp, type, prefix, NULL);
+       OBD_FREE(prefix, MAX_OBD_NAME + 5);
+       if (rc)
+               GOTO(out_free_seq, rc);
+
+       RETURN(rc);
+out_free_seq:
+       OBD_FREE_PTR(cli->cl_seq);
+       cli->cl_seq = NULL;
+       return rc;
+}
+EXPORT_SYMBOL(client_fid_init);
+
+int client_fid_fini(struct obd_device *obd)
+{
+       struct client_obd *cli = &obd->u.cli;
+       ENTRY;
+
+       if (cli->cl_seq != NULL) {
+               seq_client_fini(cli->cl_seq);
+               OBD_FREE_PTR(cli->cl_seq);
+               cli->cl_seq = NULL;
+       }
+
+       RETURN(0);
+}
+EXPORT_SYMBOL(client_fid_fini);
+
+struct proc_dir_entry *seq_type_proc_dir;
+
+static int __init fid_mod_init(void)
+{
+       seq_type_proc_dir = lprocfs_register(LUSTRE_SEQ_NAME,
+                                            proc_lustre_root,
+                                            NULL, NULL);
+       if (IS_ERR(seq_type_proc_dir))
+               return PTR_ERR(seq_type_proc_dir);
+
+# ifdef HAVE_SERVER_SUPPORT
+       fid_server_mod_init();
+# endif
+
+       return 0;
+}
+
+static void __exit fid_mod_exit(void)
+{
+# ifdef HAVE_SERVER_SUPPORT
+       fid_server_mod_exit();
+# endif
+
+       if (seq_type_proc_dir != NULL && !IS_ERR(seq_type_proc_dir)) {
+               lprocfs_remove(&seq_type_proc_dir);
+               seq_type_proc_dir = NULL;
+       }
+}
+
+MODULE_AUTHOR("Sun Microsystems, Inc. <http://www.lustre.org/>");
+MODULE_DESCRIPTION("Lustre FID Module");
+MODULE_VERSION(LUSTRE_VERSION_STRING);
+MODULE_LICENSE("GPL");
+
+module_init(fid_mod_init);
+module_exit(fid_mod_exit);