diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index 7c9826709c2e932b911cd81d10fedd99db5353ff..b45b51cfb054d73d47ad322cba1142f7c59f2903 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -31,11 +31,6 @@ Description: don't panic with use echo client
 Details    : echo client pass NULL as client nid pointer and this produce null
              pointer dereference.
 
-Severity   : major
-Bugzilla   : 15575
-Description: Stack overflow during MDS log replay
-Details    : ease stack pressure by using a thread dealing llog_process.
-
 Severity   : normal
 Bugzilla   : 15278
 Description: fix build on ppc32
diff --git a/lustre/obdclass/llog.c b/lustre/obdclass/llog.c
index ec44fde1fb876980b8f8f3a47492cad5e8799b1e..fb320198b595a011122267f3f49cc52d8f834cf7 100644
--- a/lustre/obdclass/llog.c
+++ b/lustre/obdclass/llog.c
@@ -42,7 +42,6 @@
 #include <obd_class.h>
 #include <lustre_log.h>
 #include <libcfs/list.h>
-#include "llog_internal.h"
 
 /* Allocate a new log or catalog handle */
 struct llog_handle *llog_alloc_handle(void)
@@ -205,30 +204,22 @@ int llog_close(struct llog_handle *loghandle)
 }
 EXPORT_SYMBOL(llog_close);
 
-static int llog_process_thread(void *arg)
+int llog_process(struct llog_handle *loghandle, llog_cb_t cb,
+              	 void *data, void *catdata)
 {
-        struct llog_process_info     *lpi = (struct llog_process_info *)arg;
-        struct llog_handle           *loghandle = lpi->lpi_loghandle;
-        struct llog_log_hdr          *llh = loghandle->lgh_hdr;
-        struct llog_process_cat_data *cd  = lpi->lpi_catdata;
-        char                         *buf;
-        __u64                         cur_offset = LLOG_CHUNK_SIZE;
-        __u64                         last_offset;
-        int                           rc = 0, index = 1, last_index;
-        int                           saved_index = 0, last_called_index = 0;
+        struct llog_log_hdr *llh = loghandle->lgh_hdr;
+        struct llog_process_cat_data *cd = catdata;
+        char *buf;
+        __u64 cur_offset = LLOG_CHUNK_SIZE, last_offset;
+        int rc = 0, index = 1, last_index;
+        int saved_index = 0, last_called_index = 0;
+        ENTRY;
 
         LASSERT(llh);
 
         OBD_ALLOC(buf, LLOG_CHUNK_SIZE);
-        if (!buf) {
-                lpi->lpi_rc = -ENOMEM;
-#ifdef __KERNEL__
-                complete(&lpi->lpi_completion);
-#endif
-                return 0;
-        }
-
-        cfs_daemonize("llog_process");
+        if (!buf)
+                RETURN(-ENOMEM);
 
         if (cd != NULL) {
                 last_called_index = cd->first_idx;
@@ -304,7 +295,7 @@ static int llog_process_thread(void *arg)
 
                         /* if set, process the callback on this record */
                         if (ext2_test_bit(index, llh->llh_bitmap)) {
-                                rc = lpi->lpi_cb(loghandle, rec, lpi->lpi_cbdata);
+                                rc = cb(loghandle, rec, data);
                                 last_called_index = index;
                                 if (rc == LLOG_PROC_BREAK) {
                                         CDEBUG(D_HA, "recovery from log: "LPX64
@@ -313,8 +304,7 @@ static int llog_process_thread(void *arg)
                                                loghandle->lgh_id.lgl_ogen);
                                         GOTO(out, rc);
                                 } else if (rc == LLOG_DEL_RECORD) {
-                                        llog_cancel_rec(loghandle,
-                                                        rec->lrh_index);
+                                        llog_cancel_rec(loghandle, rec->lrh_index);
                                         rc = 0;
                                 }
                                 if (rc)
@@ -335,44 +325,6 @@ static int llog_process_thread(void *arg)
                 cd->last_idx = last_called_index;
         if (buf)
                 OBD_FREE(buf, LLOG_CHUNK_SIZE);
-        lpi->lpi_rc = rc;
-#ifdef __KERNEL__
-        complete(&lpi->lpi_completion);
-#endif
-        return 0;
-}
-
-int llog_process(struct llog_handle *loghandle, llog_cb_t cb,
-                 void *data, void *catdata)
-{
-        struct llog_process_info *lpi;
-        int                      rc;
-        ENTRY;
-
-        OBD_ALLOC_PTR(lpi);
-        if (lpi == NULL) {
-                CERROR("cannot alloc pointer\n");
-                RETURN(-ENOMEM);
-        }
-        lpi->lpi_loghandle = loghandle;
-        lpi->lpi_cb        = cb;
-        lpi->lpi_cbdata    = data;
-        lpi->lpi_catdata   = catdata;
-
-#ifdef __KERNEL__
-        init_completion(&lpi->lpi_completion);
-        rc = cfs_kernel_thread(llog_process_thread, lpi, CLONE_VM | CLONE_FILES);
-        if (rc < 0) {
-                CERROR("cannot start thread: %d\n", rc);
-                OBD_FREE_PTR(lpi);
-                RETURN(rc);
-        }
-        wait_for_completion(&lpi->lpi_completion);
-#else
-        llog_process_thread(lpi);
-#endif
-        rc = lpi->lpi_rc;
-        OBD_FREE_PTR(lpi);
         RETURN(rc);
 }
 EXPORT_SYMBOL(llog_process);
diff --git a/lustre/obdclass/llog_internal.h b/lustre/obdclass/llog_internal.h
index 82bb2e3e992a1d034d34301938f761e0c90a4a18..d4be19c2820ce86cfe9d869b8c05fc53cf9d62b4 100644
--- a/lustre/obdclass/llog_internal.h
+++ b/lustre/obdclass/llog_internal.h
@@ -1,17 +1,6 @@
 #ifndef __LLOG_INTERNAL_H__
 #define __LLOG_INTERNAL_H__
 
-#include <lustre_log.h>
-
-struct llog_process_info {
-        struct llog_handle *lpi_loghandle;
-        llog_cb_t           lpi_cb;
-        void               *lpi_cbdata;
-        void               *lpi_catdata;
-        int                 lpi_rc;
-        struct completion   lpi_completion;
-};
-
 int llog_put_cat_list(struct obd_device *obd, struct obd_device *disk_obd,
                       char *name, int count, struct llog_catid *idarray);
 int llog_cat_id2handle(struct llog_handle *cathandle, struct llog_handle **res,