static int llog_remove_log(const struct lu_env *env, struct llog_handle *cat, struct llog_logid *logid) { struct llog_handle *log; int rc; ENTRY; rc = llog_cat_id2handle(env, cat, &log, logid); if (rc) { CDEBUG(D_IOCTL, "cannot find log #"DOSTID"#%08x\n", POSTID(&logid->lgl_oi), logid->lgl_ogen); RETURN(-ENOENT); } rc = llog_destroy(env, log); if (rc) { CDEBUG(D_IOCTL, "cannot destroy log\n"); GOTO(out, rc); } llog_cat_cleanup(env, cat, log, log->u.phd.phd_cookie.lgc_index); out: llog_handle_put(log); RETURN(rc); }
int llog_close(const struct lu_env *env, struct llog_handle *loghandle) { struct llog_operations *lop; int rc; rc = llog_handle2ops(loghandle, &lop); if (rc) GOTO(out, rc); if (lop->lop_close == NULL) GOTO(out, rc = -EOPNOTSUPP); rc = lop->lop_close(env, loghandle); out: llog_handle_put(loghandle); return rc; }
int llog_close(const struct lu_env *env, struct llog_handle *loghandle) { struct llog_operations *lop; int rc; rc = llog_handle2ops(loghandle, &lop); if (rc) goto out; if (!lop->lop_close) { rc = -EOPNOTSUPP; goto out; } rc = lop->lop_close(env, loghandle); out: llog_handle_put(loghandle); return rc; }
static int llog_check_cb(const struct lu_env *env, struct llog_handle *handle, struct llog_rec_hdr *rec, void *data) { struct obd_ioctl_data *ioc_data = (struct obd_ioctl_data *)data; static int l, remains, from, to; static char *out; char *endp; int cur_index, rc = 0; if (ioc_data && ioc_data->ioc_inllen1 > 0) { l = 0; remains = ioc_data->ioc_inllen4 + cfs_size_round(ioc_data->ioc_inllen1) + cfs_size_round(ioc_data->ioc_inllen2) + cfs_size_round(ioc_data->ioc_inllen3); from = simple_strtol(ioc_data->ioc_inlbuf2, &endp, 0); if (*endp != '\0') return -EINVAL; to = simple_strtol(ioc_data->ioc_inlbuf3, &endp, 0); if (*endp != '\0') return -EINVAL; ioc_data->ioc_inllen1 = 0; out = ioc_data->ioc_bulk; } cur_index = rec->lrh_index; if (cur_index < from) return 0; if (to > 0 && cur_index > to) return -LLOG_EEMPTY; if (handle->lgh_hdr->llh_flags & LLOG_F_IS_CAT) { struct llog_logid_rec *lir = (struct llog_logid_rec *)rec; struct llog_handle *loghandle; if (rec->lrh_type != LLOG_LOGID_MAGIC) { l = snprintf(out, remains, "[index]: %05d [type]: " "%02x [len]: %04d failed\n", cur_index, rec->lrh_type, rec->lrh_len); } if (handle->lgh_ctxt == NULL) return -EOPNOTSUPP; rc = llog_cat_id2handle(env, handle, &loghandle, &lir->lid_id); if (rc) { CDEBUG(D_IOCTL, "cannot find log #"DOSTID"#%08x\n", POSTID(&lir->lid_id.lgl_oi), lir->lid_id.lgl_ogen); return rc; } rc = llog_process(env, loghandle, llog_check_cb, NULL, NULL); llog_handle_put(loghandle); } else { bool ok; switch (rec->lrh_type) { case OST_SZ_REC: case MDS_UNLINK_REC: case MDS_UNLINK64_REC: case MDS_SETATTR64_REC: case OBD_CFG_REC: case LLOG_GEN_REC: case LLOG_HDR_MAGIC: ok = true; break; default: ok = false; } l = snprintf(out, remains, "[index]: %05d [type]: " "%02x [len]: %04d %s\n", cur_index, rec->lrh_type, rec->lrh_len, ok ? "ok" : "failed"); out += l; remains -= l; if (remains <= 0) { CERROR("%s: no space to print log records\n", handle->lgh_ctxt->loc_obd->obd_name); return -LLOG_EEMPTY; } } return rc; }