lop_cancel: mds_llog_repl_cancel,
};
-static struct llog_operations changelog_orig_logops;
-
-static int llog_changelog_cancel_cb(const struct lu_env *env,
- struct llog_handle *llh,
- struct llog_rec_hdr *hdr, void *data)
-{
- struct llog_changelog_rec *rec = (struct llog_changelog_rec *)hdr;
- struct llog_cookie cookie;
- long long endrec = *(long long *)data;
- int rc, err;
- struct obd_device *obd;
- void *trans_h;
- struct inode *inode;
- ENTRY;
-
- /* This is always a (sub)log, not the catalog */
- LASSERT(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN);
-
- if (rec->cr.cr_index > endrec)
- /* records are in order, so we're done */
- RETURN(LLOG_PROC_BREAK);
-
- cookie.lgc_lgl = llh->lgh_id;
- cookie.lgc_index = hdr->lrh_index;
- obd = llh->lgh_ctxt->loc_exp->exp_obd;
- inode = llh->lgh_file->f_dentry->d_inode;
-
- /* XXX This is a workaround for the deadlock of changelog adding vs.
- * changelog cancelling. Changelog adding always start transaction
- * before acquiring the catlog lock (lgh_lock), whereas, changelog
- * cancelling do start transaction after holding catlog lock.
- *
- * We start the transaction earlier here to keep the locking ordering:
- * 'start transaction -> catlog lock'. LU-81. */
- trans_h = fsfilt_start_log(obd, inode, FSFILT_OP_CANCEL_UNLINK,
- NULL, 1);
- if (IS_ERR(trans_h)) {
- CERROR("fsfilt_start_log failed: %ld\n", PTR_ERR(trans_h));
- RETURN(PTR_ERR(trans_h));
- }
-
- /* cancel them one at a time. I suppose we could store up the cookies
- and cancel them all at once; probably more efficient, but this is
- done as a user call, so who cares... */
- rc = llog_cat_cancel_records(env, llh->u.phd.phd_cat_handle, 1,
- &cookie);
-
- err = fsfilt_commit(obd, inode, trans_h, 0);
- if (err) {
- CERROR("fsfilt_commit failed: %d\n", err);
- rc = (rc >= 0) ? err : rc;
- }
-
- RETURN(rc < 0 ? rc : 0);
-}
-
-static int llog_changelog_cancel(const struct lu_env *env,
- struct llog_ctxt *ctxt,
- struct lov_stripe_md *lsm, int count,
- struct llog_cookie *cookies, int flags)
-{
- struct llog_handle *cathandle = ctxt->loc_handle;
- int rc;
- ENTRY;
-
- /* This should only be called with the catalog handle */
- LASSERT(cathandle->lgh_hdr->llh_flags & LLOG_F_IS_CAT);
-
- rc = llog_cat_process(env, cathandle, llog_changelog_cancel_cb,
- (void *)cookies, 0, 0);
- if (rc >= 0)
- /* 0 or 1 means we're done */
- rc = 0;
- else
- CERROR("cancel idx %u of catalog "LPX64" rc=%d\n",
- cathandle->lgh_last_idx, cathandle->lgh_id.lgl_oid, rc);
-
- RETURN(rc);
-}
-
-int mds_changelog_llog_init(struct obd_device *obd, struct obd_device *tgt)
-{
- struct llog_ctxt *ctxt = NULL, *uctxt = NULL;
- int rc;
-
- /* see osc_llog_init */
- changelog_orig_logops = llog_lvfs_ops;
- changelog_orig_logops.lop_obd_add = llog_obd_origin_add;
- changelog_orig_logops.lop_cancel = llog_changelog_cancel;
-
- rc = llog_setup(NULL, obd, &obd->obd_olg, LLOG_CHANGELOG_ORIG_CTXT,
- tgt, &changelog_orig_logops);
- if (rc) {
- CERROR("%s: changelog llog setup failed: rc = %d\n",
- obd->obd_name, rc);
- RETURN(rc);
- }
-
- ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
- LASSERT(ctxt);
-
- rc = llog_open_create(NULL, ctxt, &ctxt->loc_handle, NULL,
- CHANGELOG_CATALOG);
- if (rc)
- GOTO(out_cleanup, rc);
-
- rc = llog_cat_init_and_process(NULL, ctxt->loc_handle);
- if (rc)
- GOTO(out_close, rc);
-
- /* setup user changelog */
- rc = llog_setup(NULL, obd, &obd->obd_olg,
- LLOG_CHANGELOG_USER_ORIG_CTXT, tgt,
- &changelog_orig_logops);
- if (rc) {
- CERROR("%s: changelog users llog setup failed: rc = %d\n",
- obd->obd_name, rc);
- GOTO(out_close, rc);
- }
-
- uctxt = llog_get_context(obd, LLOG_CHANGELOG_USER_ORIG_CTXT);
- LASSERT(uctxt);
-
- rc = llog_open_create(NULL, uctxt, &uctxt->loc_handle, NULL,
- CHANGELOG_USERS);
- if (rc)
- GOTO(out_ucleanup, rc);
-
- rc = llog_cat_init_and_process(NULL, uctxt->loc_handle);
- if (rc)
- GOTO(out_uclose, rc);
-
- llog_ctxt_put(ctxt);
- llog_ctxt_put(uctxt);
- RETURN(0);
-out_uclose:
- llog_cat_close(NULL, uctxt->loc_handle);
-out_ucleanup:
- llog_cleanup(NULL, uctxt);
-out_close:
- llog_cat_close(NULL, ctxt->loc_handle);
-out_cleanup:
- llog_cleanup(NULL, ctxt);
- return rc;
-}
-EXPORT_SYMBOL(mds_changelog_llog_init);
-
int mds_llog_init(struct obd_device *obd, struct obd_llog_group *olg,
struct obd_device *disk_obd, int *index)
{
if (ctxt)
llog_cleanup(NULL, ctxt);
- ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT);
- if (ctxt) {
- llog_cat_close(NULL, ctxt->loc_handle);
- llog_cleanup(NULL, ctxt);
- }
-
- ctxt = llog_get_context(obd, LLOG_CHANGELOG_USER_ORIG_CTXT);
- if (ctxt) {
- llog_cat_close(NULL, ctxt->loc_handle);
- llog_cleanup(NULL, ctxt);
- }
RETURN(0);
}