#include "mds_internal.h"
-static int mds_llog_origin_add(struct llog_ctxt *ctxt,
- struct llog_rec_hdr *rec, struct lov_stripe_md *lsm,
- struct llog_cookie *logcookies, int numcookies)
+static int mds_llog_origin_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
+ void *buf, struct llog_cookie *logcookies,
+ int numcookies, void *data,
+ struct rw_semaphore **lock, int *lock_count)
{
struct obd_device *obd = ctxt->loc_obd;
struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
int rc;
ENTRY;
- lctxt = llog_get_context(lov_obd, ctxt->loc_idx);
- rc = llog_add(lctxt, rec, lsm, logcookies, numcookies);
+ lctxt = llog_get_context(&lov_obd->obd_llogs, ctxt->loc_idx);
+ rc = llog_add(lctxt, rec, buf, logcookies, numcookies, data,
+ lock, lock_count);
RETURN(rc);
}
static int mds_llog_origin_connect(struct llog_ctxt *ctxt, int count,
struct llog_logid *logid,
- struct llog_ctxt_gen *gen)
+ struct llog_gen *gen, struct obd_uuid *uuid)
{
struct obd_device *obd = ctxt->loc_obd;
struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
int rc;
ENTRY;
- lctxt = llog_get_context(lov_obd, ctxt->loc_idx);
- rc = llog_connect(lctxt, count, logid, gen);
+ lctxt = llog_get_context(&lov_obd->obd_llogs, ctxt->loc_idx);
+ rc = llog_connect(lctxt, count, logid, gen, uuid);
RETURN(rc);
}
-static int mds_llog_repl_cancel(struct llog_ctxt *ctxt, struct lov_stripe_md *lsm,
- int count, struct llog_cookie *cookies, int flags)
+static int mds_llog_repl_cancel(struct llog_ctxt *ctxt, int count,
+ struct llog_cookie *cookies, int flags,
+ void *data)
{
struct obd_device *obd = ctxt->loc_obd;
struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
int rc;
ENTRY;
- lctxt = llog_get_context(lov_obd, ctxt->loc_idx);
- rc = llog_cancel(lctxt, lsm, count, cookies,flags);
+ lctxt = llog_get_context(&lov_obd->obd_llogs, ctxt->loc_idx);
+ rc = llog_cancel(lctxt, count, cookies, flags, data);
RETURN(rc);
}
int mds_log_op_unlink(struct obd_device *obd, struct inode *inode,
- struct lustre_msg *repmsg, int offset)
+ struct lov_mds_md *lmm, int lmm_size,
+ struct llog_cookie *logcookies, int cookies_size,
+ struct llog_create_locks **res)
{
struct mds_obd *mds = &obd->u.mds;
struct lov_stripe_md *lsm = NULL;
-#ifdef ENABLE_ORPHANS
struct llog_ctxt *ctxt;
-#endif
- int rc;
+ struct llog_create_locks *lcl = NULL;
+ int rc, size = 0,offset = offsetof(struct llog_create_locks, lcl_locks);
+ int lock_count = 0;
ENTRY;
if (IS_ERR(mds->mds_osc_obd))
RETURN(PTR_ERR(mds->mds_osc_obd));
+ RETURN(0);
+
rc = obd_unpackmd(mds->mds_osc_exp, &lsm,
- lustre_msg_buf(repmsg, offset, 0),
- repmsg->buflens[offset]);
+ lmm, lmm_size);
if (rc < 0)
RETURN(rc);
-#ifdef ENABLE_ORPHANS
- ctxt = llog_get_context(obd, LLOG_UNLINK_ORIG_CTXT);
- rc = llog_add(ctxt, NULL, lsm, lustre_msg_buf(repmsg, offset + 1, 0),
- repmsg->buflens[offset + 1] / sizeof(struct llog_cookie));
-#endif
+ if (res != NULL) {
+ size = offset +
+ sizeof(struct rw_semaphore *) * lsm->lsm_stripe_count;
+ OBD_ALLOC(lcl, size);
+ if (lcl == NULL)
+ RETURN(-ENOMEM);
+
+ lcl->lcl_count = lsm->lsm_stripe_count;
+ *res = lcl;
+ }
+
+ ctxt = llog_get_context(&obd->obd_llogs, LLOG_UNLINK_ORIG_CTXT);
+ rc = llog_add(ctxt, NULL, lsm, logcookies,
+ cookies_size / sizeof(struct llog_cookie), NULL,
+ res ? &lcl->lcl_locks[0] : NULL, &lock_count);
obd_free_memmd(mds->mds_osc_exp, &lsm);
+ if (res && (rc <= 0 || lock_count == 0)) {
+ OBD_FREE(lcl, size);
+ *res = NULL;
+ }
+
RETURN(rc);
}
};
static struct llog_operations mds_size_repl_logops = {
- lop_cancel: mds_llog_repl_cancel
+ lop_cancel: mds_llog_repl_cancel,
};
-int mds_llog_init(struct obd_device *obd, struct obd_device *tgt,
- int count, struct llog_logid *logid)
+int mds_llog_init(struct obd_device *obd, struct obd_llogs *llogs,
+ struct obd_device *tgt, int count, struct llog_catid *logid)
{
struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
int rc;
ENTRY;
-
- rc = llog_setup(obd, LLOG_UNLINK_ORIG_CTXT, tgt, 0, NULL,
- &mds_unlink_orig_logops);
+
+ rc = obd_llog_setup(obd, llogs, LLOG_UNLINK_ORIG_CTXT, tgt, 0, NULL,
+ &mds_unlink_orig_logops);
if (rc)
RETURN(rc);
- rc = llog_setup(obd, LLOG_SIZE_REPL_CTXT, tgt, 0, NULL,
- &mds_size_repl_logops);
+ rc = obd_llog_setup(obd, llogs, LLOG_SIZE_REPL_CTXT, tgt, 0, NULL,
+ &mds_size_repl_logops);
if (rc)
RETURN(rc);
- rc = obd_llog_init(lov_obd, tgt, count, logid);
- if (rc)
- CERROR("error lov_llog_init\n");
+ rc = obd_llog_init(lov_obd, &lov_obd->obd_llogs, tgt, count, logid);
+ if (rc)
+ CERROR("error lov_llog_init\n");
RETURN(rc);
}
-int mds_llog_finish(struct obd_device *obd, int count)
+int mds_llog_finish(struct obd_device *obd, struct obd_llogs *llogs, int count)
{
struct obd_device *lov_obd = obd->u.mds.mds_osc_obd;
int rc;
ENTRY;
-
- rc = llog_cleanup(llog_get_context(obd, LLOG_UNLINK_ORIG_CTXT));
+
+ rc = obd_llog_cleanup(llog_get_context(llogs, LLOG_UNLINK_ORIG_CTXT));
if (rc)
RETURN(rc);
- rc = llog_cleanup(llog_get_context(obd, LLOG_SIZE_REPL_CTXT));
+ rc = obd_llog_cleanup(llog_get_context(llogs, LLOG_SIZE_REPL_CTXT));
if (rc)
RETURN(rc);
- rc = obd_llog_finish(lov_obd, count);
- if (rc)
- CERROR("error lov_llog_finish\n");
+ rc = obd_llog_finish(lov_obd, &lov_obd->obd_llogs, count);
+ if (rc)
+ CERROR("error lov_llog_finish\n");
RETURN(rc);
}