Whamcloud - gitweb
LU-4357 libcfs: restore __GFP_WAIT flag to memalloc calls
[fs/lustre-release.git] / lustre / quota / qsd_writeback.c
index f9af987..13f07fd 100644 (file)
  * Author: Niu    Yawei    <yawei.niu@intel.com>
  */
 
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
-
 #define DEBUG_SUBSYSTEM S_LQUOTA
 
 #include "qsd_internal.h"
 
-extern cfs_mem_cache_t *upd_kmem;
+extern struct kmem_cache *upd_kmem;
 
 /*
  * Allocate and fill an qsd_upd_rec structure to be processed by the writeback
@@ -58,7 +54,7 @@ static struct qsd_upd_rec *qsd_upd_alloc(struct qsd_qtype_info *qqi,
 {
        struct qsd_upd_rec      *upd;
 
-       OBD_SLAB_ALLOC_PTR_GFP(upd, upd_kmem, CFS_ALLOC_IO);
+       OBD_SLAB_ALLOC_PTR_GFP(upd, upd_kmem, GFP_NOFS);
        if (upd == NULL) {
                CERROR("Failed to allocate upd");
                return NULL;
@@ -91,20 +87,29 @@ static void qsd_upd_add(struct qsd_instance *qsd, struct qsd_upd_rec *upd)
        if (!qsd->qsd_stopping) {
                list_add_tail(&upd->qur_link, &qsd->qsd_upd_list);
                /* wake up the upd thread */
-               cfs_waitq_signal(&qsd->qsd_upd_thread.t_ctl_waitq);
+               wake_up(&qsd->qsd_upd_thread.t_ctl_waitq);
        } else {
-               CWARN("%s: discard deferred update.\n", qsd->qsd_svname);
+               CWARN("%s: discard update.\n", qsd->qsd_svname);
                if (upd->qur_lqe)
-                       LQUOTA_WARN(upd->qur_lqe, "discard deferred update.");
+                       LQUOTA_WARN(upd->qur_lqe, "discard update.");
                qsd_upd_free(upd);
        }
 }
 
 /* must hold the qsd_lock */
-static void qsd_add_deferred(cfs_list_t *list, struct qsd_upd_rec *upd)
+static void qsd_add_deferred(struct qsd_instance *qsd, cfs_list_t *list,
+                            struct qsd_upd_rec *upd)
 {
        struct qsd_upd_rec      *tmp, *n;
 
+       if (qsd->qsd_stopping) {
+               CWARN("%s: discard deferred udpate.\n", qsd->qsd_svname);
+               if (upd->qur_lqe)
+                       LQUOTA_WARN(upd->qur_lqe, "discard deferred update.");
+               qsd_upd_free(upd);
+               return;
+       }
+
        /* Sort the updates in ascending order */
        cfs_list_for_each_entry_safe_reverse(tmp, n, list, qur_link) {
 
@@ -121,9 +126,7 @@ static void qsd_add_deferred(cfs_list_t *list, struct qsd_upd_rec *upd)
                                     "with ver:"LPU64"", tmp->qur_ver);
                        cfs_list_del_init(&tmp->qur_link);
                        qsd_upd_free(tmp);
-               }
-
-               if (upd->qur_ver < tmp->qur_ver) {
+               } else if (upd->qur_ver < tmp->qur_ver) {
                        continue;
                } else {
                        cfs_list_add_tail(&upd->qur_link, &tmp->qur_link);
@@ -261,7 +264,7 @@ void qsd_upd_schedule(struct qsd_qtype_info *qqi, struct lquota_entry *lqe,
                 * the reintegration is in progress. Defer the update. */
                cfs_list_t *list = global ? &qqi->qqi_deferred_glb :
                                            &qqi->qqi_deferred_slv;
-               qsd_add_deferred(list, upd);
+               qsd_add_deferred(qsd, list, upd);
        }
 
        write_unlock(&qsd->qsd_lock);
@@ -311,6 +314,13 @@ void qsd_adjust_schedule(struct lquota_entry *lqe, bool defer, bool cancel)
        struct qsd_instance     *qsd = lqe2qqi(lqe)->qqi_qsd;
        bool                     added = false;
 
+       read_lock(&qsd->qsd_lock);
+       if (qsd->qsd_stopping) {
+               read_unlock(&qsd->qsd_lock);
+               return;
+       }
+       read_unlock(&qsd->qsd_lock);
+
        lqe_getref(lqe);
        spin_lock(&qsd->qsd_adjust_lock);
 
@@ -340,7 +350,7 @@ void qsd_adjust_schedule(struct lquota_entry *lqe, bool defer, bool cancel)
        spin_unlock(&qsd->qsd_adjust_lock);
 
        if (added)
-               cfs_waitq_signal(&qsd->qsd_upd_thread.t_ctl_waitq);
+               wake_up(&qsd->qsd_upd_thread.t_ctl_waitq);
        else
                lqe_putref(lqe);
 }
@@ -423,7 +433,7 @@ static int qsd_upd_thread(void *arg)
        }
 
        thread_set_flags(thread, SVC_RUNNING);
-       cfs_waitq_signal(&thread->t_ctl_waitq);
+       wake_up(&thread->t_ctl_waitq);
 
        CFS_INIT_LIST_HEAD(&queue);
        lwi = LWI_TIMEOUT(cfs_time_seconds(QSD_WB_INTERVAL), NULL, NULL);
@@ -475,7 +485,7 @@ static int qsd_upd_thread(void *arg)
        lu_env_fini(env);
        OBD_FREE_PTR(env);
        thread_set_flags(thread, SVC_STOPPED);
-       cfs_waitq_signal(&thread->t_ctl_waitq);
+       wake_up(&thread->t_ctl_waitq);
        RETURN(rc);
 }
 
@@ -483,7 +493,7 @@ int qsd_start_upd_thread(struct qsd_instance *qsd)
 {
        struct ptlrpc_thread    *thread = &qsd->qsd_upd_thread;
        struct l_wait_info       lwi = { 0 };
-       cfs_task_t              *task;
+       struct task_struct              *task;
        ENTRY;
 
        task = kthread_run(qsd_upd_thread, (void *)qsd,
@@ -556,7 +566,7 @@ void qsd_stop_upd_thread(struct qsd_instance *qsd)
 
        if (!thread_is_stopped(thread)) {
                thread_set_flags(thread, SVC_STOPPING);
-               cfs_waitq_signal(&thread->t_ctl_waitq);
+               wake_up(&thread->t_ctl_waitq);
 
                l_wait_event(thread->t_ctl_waitq, thread_is_stopped(thread),
                             &lwi);