X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fllog_ioctl.c;h=bff97f3b9219e37e1d0309390cb8ab8282951bc4;hb=b5ff160e58b070c03290598914554a9ffecbea2e;hp=5a52065ad06582680313289bf32f88db56f209cf;hpb=f7d5a7441211570fab2489f6b72f5d6641228316;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/llog_ioctl.c b/lustre/obdclass/llog_ioctl.c index 5a52065..bff97f3 100644 --- a/lustre/obdclass/llog_ioctl.c +++ b/lustre/obdclass/llog_ioctl.c @@ -27,7 +27,7 @@ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -37,12 +37,14 @@ #define DEBUG_SUBSYSTEM S_LOG #include +#include #include #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; @@ -57,7 +59,7 @@ static int str2logid(struct llog_logid *logid, char *str, int len) RETURN(-EINVAL); *end = '\0'; - logid->lgl_oid = simple_strtoull(start, &endp, 0); + id = simple_strtoull(start, &endp, 0); if (endp != end) RETURN(-EINVAL); @@ -69,11 +71,14 @@ static int str2logid(struct llog_logid *logid, char *str, int len) 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); @@ -87,7 +92,8 @@ 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 int l, remains; + static long from, to; static char *out; char *endp; int cur_index, rc = 0; @@ -116,9 +122,9 @@ static int llog_check_cb(const struct lu_env *env, struct llog_handle *handle, 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]: " @@ -128,17 +134,16 @@ static int llog_check_cb(const struct lu_env *env, struct llog_handle *handle, } 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) { @@ -174,7 +179,8 @@ static int llog_print_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 int l, remains; + static long from, to; static char *out; char *endp; int cur_index; @@ -210,14 +216,14 @@ static int llog_print_cb(const struct lu_env *env, struct llog_handle *handle, 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; @@ -238,33 +244,26 @@ static int llog_print_cb(const struct lu_env *env, struct llog_handle *handle, 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); } - cfs_down_write(&cat->lgh_lock); - if (cat->u.chd.chd_current_log == log) - cat->u.chd.chd_current_log = NULL; - cfs_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); } @@ -323,18 +322,18 @@ int llog_ioctl(const struct lu_env *env, struct llog_ctxt *ctxt, int cmd, 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) { @@ -370,7 +369,7 @@ int llog_ioctl(const struct lu_env *env, struct llog_ctxt *ctxt, int cmd, 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); @@ -430,48 +429,50 @@ out_close: } EXPORT_SYMBOL(llog_ioctl); -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); - - cfs_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 */ - cfs_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);