From: tianying Date: Tue, 13 Jan 2004 06:11:27 +0000 (+0000) Subject: 1. fix llog_origin_handle_cancel - down semaphore of llog ctxt after X-Git-Tag: v1_7_70~2^33~49 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=d1b5a5302eb2f8f1d75727e8034791c86052b856;p=fs%2Flustre-release.git 1. fix llog_origin_handle_cancel - down semaphore of llog ctxt after getting journal handle for fsfilt_ext3_write_record, that is the same sequence to mds_reint_unlink 2. remove #ifdef ENABLE_ORPHANS - need not add enable-orphans for configure to use llog --- diff --git a/lustre/ptlrpc/llog_server.c b/lustre/ptlrpc/llog_server.c index f77f92d5..4674f72 100644 --- a/lustre/ptlrpc/llog_server.c +++ b/lustre/ptlrpc/llog_server.c @@ -34,6 +34,7 @@ #include #include #include +#include int llog_origin_handle_create(struct ptlrpc_request *req) { @@ -238,16 +239,17 @@ int llog_origin_handle_close(struct ptlrpc_request *req) RETURN(rc); } -#ifdef ENABLE_ORPHANS int llog_origin_handle_cancel(struct ptlrpc_request *req) { struct obd_device *obd = req->rq_export->exp_obd; struct obd_device *disk_obd; struct llog_cookie *logcookies; struct llog_ctxt *ctxt; - int num_cookies, rc = 0; + int num_cookies, rc = 0, err, i; struct obd_run_ctxt saved; struct llog_handle *cathandle; + struct inode *inode; + void *handle; ENTRY; logcookies = lustre_msg_buf(req->rq_reqmsg, 0, sizeof(*logcookies)); @@ -262,25 +264,61 @@ int llog_origin_handle_cancel(struct ptlrpc_request *req) CWARN("llog subsys not setup or already cleanup\n"); RETURN(-ENOENT); } + down(&ctxt->loc_sem); disk_obd = ctxt->loc_exp->exp_obd; - cathandle = ctxt->loc_handle; - LASSERT(cathandle); + up(&ctxt->loc_sem); push_ctxt(&saved, &disk_obd->obd_ctxt, NULL); - rc = llog_cat_cancel_records(cathandle, num_cookies, logcookies); + for (i = 0; i < num_cookies; i++, logcookies++) { + ctxt = llog_get_context(obd, logcookies->lgc_subsys); + if (ctxt == NULL) { + CWARN("llog subsys already cleanup\n"); + GOTO(pop_ctxt, rc = -ENOENT); + } + + down(&ctxt->loc_sem); + cathandle = ctxt->loc_handle; + LASSERT(cathandle != NULL); + inode = cathandle->lgh_file->f_dentry->d_inode; + up(&ctxt->loc_sem); + + handle = fsfilt_start(disk_obd, inode, + FSFILT_OP_CANCEL_UNLINK_LOG, NULL); + if (IS_ERR(handle)) { + CERROR("fsfilt_start failed: %ld\n", PTR_ERR(handle)); + GOTO(pop_ctxt, rc = PTR_ERR(handle)); + } + + ctxt = llog_get_context(obd, logcookies->lgc_subsys); + if (ctxt == NULL) { + CWARN("llog subsys already cleanup\n"); + GOTO(pop_ctxt, rc = -ENOENT); + } + down(&ctxt->loc_sem); + cathandle = ctxt->loc_handle; + LASSERT(cathandle); + rc = llog_cat_cancel_records(cathandle, 1, logcookies); + up(&ctxt->loc_sem); + + err = fsfilt_commit(disk_obd, inode, handle, 0); + if (err) { + CERROR("error committing transaction: %d\n", err); + if (!rc) + rc = err; + GOTO(pop_ctxt, rc); + } + } +pop_ctxt: + pop_ctxt(&saved, &disk_obd->obd_ctxt, NULL); if (rc) CERROR("cancel %d llog-records failed: %d\n", num_cookies, rc); else CWARN("cancel %d llog-records\n", num_cookies); - pop_ctxt(&saved, &disk_obd->obd_ctxt, NULL); - up(&ctxt->loc_sem); - RETURN(rc); } EXPORT_SYMBOL(llog_origin_handle_cancel); -#endif static int llog_catinfo_config(struct obd_device *obd, char *buf, int buf_len, char *client)