* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2012, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#define DEBUG_SUBSYSTEM S_LOG
#include <obd_class.h>
+#include <lustre_ioctl.h>
#include <lustre_log.h>
#include "llog_internal.h"
static int str2logid(struct llog_logid *logid, char *str, int len)
{
char *start, *end, *endp;
+ __u64 id, seq;
ENTRY;
start = str;
RETURN(-EINVAL);
*end = '\0';
- logid->lgl_oid = simple_strtoull(start, &endp, 0);
+ id = simple_strtoull(start, &endp, 0);
if (endp != end)
RETURN(-EINVAL);
RETURN(-EINVAL);
*end = '\0';
- logid->lgl_oseq = simple_strtoull(start, &endp, 0);
+ seq = simple_strtoull(start, &endp, 0);
if (endp != end)
RETURN(-EINVAL);
- start = ++end;
+ ostid_set_seq(&logid->lgl_oi, seq);
+ ostid_set_id(&logid->lgl_oi, id);
+
+ start = ++end;
if (start - str >= len - 1)
RETURN(-EINVAL);
logid->lgl_ogen = simple_strtoul(start, &endp, 16);
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 int l, remains;
+ static long from, to;
static char *out;
char *endp;
int cur_index, rc = 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 *log_handle;
+ 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]: "
}
if (handle->lgh_ctxt == NULL)
RETURN(-EOPNOTSUPP);
- rc = llog_cat_id2handle(env, handle, &log_handle, &lir->lid_id);
- if (rc) {
- CDEBUG(D_IOCTL,
- "cannot find log #"LPX64"#"LPX64"#%08x\n",
- lir->lid_id.lgl_oid, lir->lid_id.lgl_oseq,
- lir->lid_id.lgl_ogen);
- RETURN(rc);
- }
- rc = llog_process(env, log_handle, llog_check_cb, NULL, NULL);
- llog_close(env, log_handle);
- } else {
+ 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) {
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 int l, remains;
+ static long from, to;
static char *out;
char *endp;
int cur_index;
RETURN(-EINVAL);
}
- l = snprintf(out, remains,
- "[index]: %05d [logid]: #"LPX64"#"LPX64"#%08x\n",
- cur_index, lir->lid_id.lgl_oid,
- lir->lid_id.lgl_oseq, lir->lid_id.lgl_ogen);
+ l = snprintf(out, remains,
+ "[index]: %05d [logid]: #"DOSTID"#%08x\n",
+ cur_index, POSTID(&lir->lid_id.lgl_oi),
+ lir->lid_id.lgl_ogen);
} else if (rec->lrh_type == OBD_CFG_REC) {
int rc;
- rc = class_config_parse_rec(rec, out, remains);
+ rc = class_config_yaml_output(rec, out, remains);
if (rc < 0)
RETURN(rc);
l = rc;
static int llog_remove_log(const struct lu_env *env, struct llog_handle *cat,
struct llog_logid *logid)
{
- struct llog_handle *log;
- int rc, index = 0;
+ struct llog_handle *log;
+ int rc;
- ENTRY;
+ ENTRY;
rc = llog_cat_id2handle(env, cat, &log, logid);
- if (rc) {
- CDEBUG(D_IOCTL, "cannot find log #"LPX64"#"LPX64"#%08x\n",
- logid->lgl_oid, logid->lgl_oseq, logid->lgl_ogen);
- GOTO(out, rc = -ENOENT);
- }
+ if (rc) {
+ CDEBUG(D_IOCTL, "cannot find log #"DOSTID"#%08x\n",
+ POSTID(&logid->lgl_oi), logid->lgl_ogen);
+ RETURN(-ENOENT);
+ }
- index = log->u.phd.phd_cookie.lgc_index;
- LASSERT(index);
rc = llog_destroy(env, log);
if (rc) {
CDEBUG(D_IOCTL, "cannot destroy log\n");
GOTO(out, rc);
}
- down_write(&cat->lgh_lock);
- if (cat->u.chd.chd_current_log == log)
- cat->u.chd.chd_current_log = NULL;
- up_write(&cat->lgh_lock);
- llog_cat_set_first_idx(cat, index);
- rc = llog_cancel_rec(env, cat, index);
+ llog_cat_cleanup(env, cat, log, log->u.phd.phd_cookie.lgc_index);
out:
- llog_close(env, log);
+ llog_handle_put(log);
RETURN(rc);
}
cfs_size_round(data->ioc_inllen1);
char *out = data->ioc_bulk;
- l = snprintf(out, remains,
- "logid: #"LPX64"#"LPX64"#%08x\n"
- "flags: %x (%s)\n"
- "records count: %d\n"
- "last index: %d\n",
- handle->lgh_id.lgl_oid, handle->lgh_id.lgl_oseq,
- handle->lgh_id.lgl_ogen,
- handle->lgh_hdr->llh_flags,
- handle->lgh_hdr->llh_flags &
- LLOG_F_IS_CAT ? "cat" : "plain",
- handle->lgh_hdr->llh_count,
- handle->lgh_last_idx);
+ l = snprintf(out, remains,
+ "logid: #"DOSTID"#%08x\n"
+ "flags: %x (%s)\n"
+ "records count: %d\n"
+ "last index: %d\n",
+ POSTID(&handle->lgh_id.lgl_oi),
+ handle->lgh_id.lgl_ogen,
+ handle->lgh_hdr->llh_flags,
+ handle->lgh_hdr->llh_flags &
+ LLOG_F_IS_CAT ? "cat" : "plain",
+ handle->lgh_hdr->llh_count,
+ handle->lgh_last_idx);
out += l;
remains -= l;
if (remains <= 0) {
GOTO(out_close, rc = -EINVAL);
if (handle->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN) {
- rc = llog_cancel_rec(NULL, handle, cookie.lgc_index);
+ rc = llog_cancel_rec(env, handle, cookie.lgc_index);
GOTO(out_close, rc);
} else if (!(handle->lgh_hdr->llh_flags & LLOG_F_IS_CAT)) {
GOTO(out_close, rc = -EINVAL);
}
EXPORT_SYMBOL(llog_ioctl);
-#ifdef HAVE_LDISKFS_OSD
-int llog_catalog_list(struct obd_device *obd, int count,
- struct obd_ioctl_data *data)
+int llog_catalog_list(const struct lu_env *env, struct dt_device *d,
+ int count, struct obd_ioctl_data *data,
+ const struct lu_fid *fid)
{
- int size, i;
- struct llog_catid *idarray;
- struct llog_logid *id;
- char name[32] = CATLIST;
- char *out;
- int l, remains, rc = 0;
+ int size, i;
+ struct llog_catid *idarray;
+ struct llog_logid *id;
+ char *out;
+ int l, remains, rc = 0;
- ENTRY;
- size = sizeof(*idarray) * count;
-
- OBD_ALLOC_LARGE(idarray, size);
- if (!idarray)
- RETURN(-ENOMEM);
-
- mutex_lock(&obd->obd_olg.olg_cat_processing);
- rc = llog_get_cat_list(obd, name, 0, count, idarray);
- if (rc)
- GOTO(out, rc);
-
- out = data->ioc_bulk;
- remains = data->ioc_inllen1;
- for (i = 0; i < count; i++) {
- id = &idarray[i].lci_logid;
- l = snprintf(out, remains,
- "catalog log: #"LPX64"#"LPX64"#%08x\n",
- id->lgl_oid, id->lgl_oseq, id->lgl_ogen);
- out += l;
- remains -= l;
- if (remains <= 0) {
- CWARN("not enough memory for catlog list\n");
- break;
- }
- }
-out:
- /* release semaphore */
- mutex_unlock(&obd->obd_olg.olg_cat_processing);
+ ENTRY;
+
+ if (count == 0) { /* get total number of logs */
+ rc = llog_osd_get_cat_list(env, d, 0, 0, NULL, fid);
+ if (rc < 0)
+ RETURN(rc);
+ count = rc;
+ }
- OBD_FREE_LARGE(idarray, size);
- RETURN(rc);
+ size = sizeof(*idarray) * count;
+ OBD_ALLOC_LARGE(idarray, size);
+ if (!idarray)
+ RETURN(-ENOMEM);
+
+ rc = llog_osd_get_cat_list(env, d, 0, count, idarray, fid);
+ if (rc)
+ GOTO(out, rc);
+
+ out = data->ioc_bulk;
+ remains = data->ioc_inllen1;
+ for (i = 0; i < count; i++) {
+ id = &idarray[i].lci_logid;
+ l = snprintf(out, remains,
+ "catalog log: #"DOSTID"#%08x\n",
+ POSTID(&id->lgl_oi),
+ id->lgl_ogen);
+ out += l;
+ remains -= l;
+ if (remains <= 0)
+ break;
+ }
+out:
+ OBD_FREE_LARGE(idarray, size);
+ RETURN(rc);
}
EXPORT_SYMBOL(llog_catalog_list);
-#endif