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,