-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#define DEBUG_SUBSYSTEM S_LOG
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
-
#ifdef __KERNEL__
# include <libcfs/libcfs.h>
#else
*/
size = CFS_PAGE_SIZE - lustre_msg_size(LUSTRE_MSG_MAGIC_V2, 1, NULL);
overhead = offsetof(struct llog_canceld_ctxt, llcd_cookies);
- OBD_SLAB_ALLOC(llcd, llcd_cache, CFS_ALLOC_STD, size + overhead);
+ OBD_SLAB_ALLOC_GFP(llcd, llcd_cache, size + overhead, CFS_ALLOC_STD);
if (!llcd)
return NULL;
llcd_print(llcd, __FUNCTION__, __LINE__);
LBUG();
}
- LASSERT_SEM_LOCKED(&ctxt->loc_sem);
+ LASSERT_MUTEX_LOCKED(&ctxt->loc_mutex);
if (llcd->llcd_cookiebytes == 0)
GOTO(exit, rc = 0);
* first from replay llog, second for resended rpc */
req->rq_no_delay = req->rq_no_resend = 1;
- rc = ptlrpc_set_add_new_req(&lcm->lcm_pc, req);
- if (rc) {
- ptlrpc_request_free(req);
- GOTO(exit, rc);
- }
+ ptlrpc_set_add_new_req(&lcm->lcm_pc, req);
RETURN(0);
exit:
CDEBUG(D_RPCTRACE, "Refused llcd %p\n", llcd);
llcd_attach(struct llog_ctxt *ctxt, struct llog_canceld_ctxt *llcd)
{
LASSERT(ctxt != NULL && llcd != NULL);
- LASSERT_SEM_LOCKED(&ctxt->loc_sem);
+ LASSERT_MUTEX_LOCKED(&ctxt->loc_mutex);
LASSERT(ctxt->loc_llcd == NULL);
llcd->llcd_ctxt = llog_ctxt_get(ctxt);
ctxt->loc_llcd = llcd;
struct llog_canceld_ctxt *llcd;
LASSERT(ctxt != NULL);
- LASSERT_SEM_LOCKED(&ctxt->loc_sem);
+ LASSERT_MUTEX_LOCKED(&ctxt->loc_mutex);
llcd = ctxt->loc_llcd;
if (!llcd)
int rc;
ENTRY;
- rc = ptlrpcd_start(lcm->lcm_name, &lcm->lcm_pc);
+ rc = ptlrpcd_start(-1, 1, lcm->lcm_name, &lcm->lcm_pc);
if (rc) {
CERROR("Error %d while starting recovery thread %s\n",
rc, lcm->lcm_name);
* Send back cached llcd from llog before recovery if we have any.
* This is void is nothing cached is found there.
*/
- llog_sync(ctxt, NULL);
+ llog_sync(ctxt, NULL, 0);
/*
* Start recovery in separate thread.
*/
- cfs_mutex_down(&ctxt->loc_sem);
+ cfs_mutex_lock(&ctxt->loc_mutex);
ctxt->loc_gen = *gen;
rc = llog_recov_thread_replay(ctxt, ctxt->llog_proc_cb, logid);
- cfs_mutex_up(&ctxt->loc_sem);
+ cfs_mutex_unlock(&ctxt->loc_mutex);
RETURN(rc);
}
LASSERT(ctxt != NULL);
- cfs_mutex_down(&ctxt->loc_sem);
+ cfs_mutex_lock(&ctxt->loc_mutex);
if (!ctxt->loc_lcm) {
CDEBUG(D_RPCTRACE, "No lcm for ctxt %p\n", ctxt);
GOTO(out, rc = -ENODEV);
* Let's check if we have all structures alive. We also check for
* possible shutdown. Do nothing if we're stopping.
*/
- if (ctxt->loc_imp == NULL) {
+ if (ctxt->loc_flags & LLOG_CTXT_FLAG_STOP) {
+ CDEBUG(D_RPCTRACE, "Last sync was done for ctxt %p\n", ctxt);
+ GOTO(out, rc = -ENODEV);
+ }
+
+ if (ctxt->loc_imp == NULL) {
CDEBUG(D_RPCTRACE, "No import for ctxt %p\n", ctxt);
GOTO(out, rc = -ENODEV);
}
out:
if (rc)
llcd_put(ctxt);
- cfs_mutex_up(&ctxt->loc_sem);
+
+ if (flags & OBD_LLOG_FL_EXIT)
+ ctxt->loc_flags = LLOG_CTXT_FLAG_STOP;
+
+ cfs_mutex_unlock(&ctxt->loc_mutex);
return rc;
}
EXPORT_SYMBOL(llog_obd_repl_cancel);
-int llog_obd_repl_sync(struct llog_ctxt *ctxt, struct obd_export *exp)
+int llog_obd_repl_sync(struct llog_ctxt *ctxt, struct obd_export *exp,
+ int flags)
{
int rc = 0;
ENTRY;
/*
* Flush any remaining llcd.
*/
- cfs_mutex_down(&ctxt->loc_sem);
+ cfs_mutex_lock(&ctxt->loc_mutex);
if (exp && (ctxt->loc_imp == exp->exp_imp_reverse)) {
/*
* This is ost->mds connection, we can't be sure that mds
*/
CDEBUG(D_RPCTRACE, "Kill cached llcd\n");
llcd_put(ctxt);
- cfs_mutex_up(&ctxt->loc_sem);
+
+ if (flags & OBD_LLOG_FL_EXIT)
+ ctxt->loc_flags = LLOG_CTXT_FLAG_STOP;
+
+ cfs_mutex_unlock(&ctxt->loc_mutex);
} else {
/*
* This is either llog_sync() from generic llog code or sync
* llcds to the target with waiting for completion.
*/
CDEBUG(D_RPCTRACE, "Sync cached llcd\n");
- cfs_mutex_up(&ctxt->loc_sem);
- rc = llog_cancel(ctxt, NULL, 0, NULL, OBD_LLOG_FL_SENDNOW);
+ cfs_mutex_unlock(&ctxt->loc_mutex);
+ rc = llog_cancel(ctxt, NULL, 0, NULL, OBD_LLOG_FL_SENDNOW |
+ flags);
}
RETURN(rc);
}