Skip to content
Snippets Groups Projects
Commit 44c5f234 authored by Alexey Lyashkov's avatar Alexey Lyashkov
Browse files

revert bug 15575 from HEAD also.

parent 56fca674
No related branches found
No related tags found
No related merge requests found
......@@ -29,11 +29,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
......
......@@ -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;
......@@ -277,7 +268,7 @@ static int llog_process_thread(void *arg)
CDEBUG(D_OTHER, "after swabbing, type=%#x idx=%d\n",
rec->lrh_type, rec->lrh_index);
if (rec->lrh_index == 0)
GOTO(out, 0); /* no more records */
......@@ -301,11 +292,11 @@ static int llog_process_thread(void *arg)
loghandle->lgh_cur_idx = rec->lrh_index;
loghandle->lgh_cur_offset = (char *)rec - (char *)buf +
last_offset;
last_offset;
/* 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
......@@ -314,8 +305,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)
......@@ -336,44 +326,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);
......
#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,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment