X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fllog_reader.c;h=cf84329551278250e3ad29f02f02d2f7e7e18b0b;hb=4c25ec609bc2ecc31d014689c2498c4df60dddd2;hp=ae62a3989c32746aba61b0dbd42421a3c64b49c3;hpb=9edebe083264464d2692da446f68483e3e45a80d;p=fs%2Flustre-release.git diff --git a/lustre/utils/llog_reader.c b/lustre/utils/llog_reader.c index ae62a39..cf84329 100644 --- a/lustre/utils/llog_reader.c +++ b/lustre/utils/llog_reader.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -39,11 +39,30 @@ #include #include #include +#ifdef HAVE_ENDIAN_H +# include +#endif +#include #include #include -#include +#include +#include #include +#include +#include + +static inline int ext2_test_bit(int nr, const void *addr) +{ +#if __BYTE_ORDER == __BIG_ENDIAN + const unsigned char *tmp = addr; + return (tmp[nr >> 3] >> (nr & 7)) & 1; +#else + const unsigned long *tmp = addr; + return ((1UL << (nr & (BITS_PER_LONG - 1))) & + ((tmp)[nr / BITS_PER_LONG])) != 0; +#endif +} int llog_pack_buffer(int fd, struct llog_log_hdr **llog_buf, struct llog_rec_hdr ***recs, int *recs_number); @@ -93,12 +112,14 @@ int main(int argc, char **argv) fd = open(argv[1],O_RDONLY); if (fd < 0){ - printf("Could not open the file %s\n", argv[1]); + rc = -errno; + llapi_error(LLAPI_MSG_ERROR, rc, "Could not open the file %s.", + argv[1]); goto out; } rc = llog_pack_buffer(fd, &llog_buf, &recs_buf, &rec_number); if (rc < 0) { - printf("Could not pack buffer; rc=%d\n", rc); + llapi_error(LLAPI_MSG_ERROR, rc, "Could not pack buffer."); goto out_fd; } @@ -127,23 +148,29 @@ int llog_pack_buffer(int fd, struct llog_log_hdr **llog, rc = fstat(fd,&st); if (rc < 0){ - printf("Get file stat error.\n"); + rc = -errno; + llapi_error(LLAPI_MSG_ERROR, rc, "Got file stat error."); goto out; } file_size = st.st_size; + if (file_size == 0) { + rc = -1; + llapi_error(LLAPI_MSG_ERROR, rc, "File is empty."); + goto out; + } file_buf = malloc(file_size); if (file_buf == NULL){ - printf("Memory Alloc for file_buf error.\n"); rc = -ENOMEM; + llapi_error(LLAPI_MSG_ERROR, rc, "Memory Alloc for file_buf."); goto out; } *llog = (struct llog_log_hdr*)file_buf; rd = read(fd,file_buf,file_size); if (rd < file_size){ - printf("Read file error.\n"); rc = -EIO; /*FIXME*/ + llapi_error(LLAPI_MSG_ERROR, rc, "Read file error."); goto clear_file_buf; } @@ -152,8 +179,8 @@ int llog_pack_buffer(int fd, struct llog_log_hdr **llog, recs_buf = malloc(recs_num * sizeof(struct llog_rec_hdr *)); if (recs_buf == NULL){ - printf("Memory Alloc for recs_buf error.\n"); rc = -ENOMEM; + llapi_error(LLAPI_MSG_ERROR, rc, "Memory Alloc for recs_buf."); goto clear_file_buf; } recs_pr = (struct llog_rec_hdr **)recs_buf; @@ -162,21 +189,32 @@ int llog_pack_buffer(int fd, struct llog_log_hdr **llog, i = 0; while (i < recs_num){ - struct llog_rec_hdr *cur_rec = (struct llog_rec_hdr*)ptr; - int idx = le32_to_cpu(cur_rec->lrh_index); - recs_pr[i] = cur_rec; - - if (ext2_test_bit(idx, (*llog)->llh_bitmap)) { - if (le32_to_cpu(cur_rec->lrh_type) != OBD_CFG_REC) - printf("rec #%d type=%x len=%u\n", idx, - cur_rec->lrh_type, cur_rec->lrh_len); - } else { - printf("Bit %d of %d not set\n", idx, recs_num); - cur_rec->padding = CANCELLED; - /* The header counts only set records */ - i--; - } - + struct llog_rec_hdr *cur_rec; + int idx; + + if (ptr + sizeof(struct llog_rec_hdr) > + file_buf + file_size) { + rc = -EINVAL; + llapi_error(LLAPI_MSG_ERROR, rc, + "The log is corrupt (too big at %d)", i); + goto clear_recs_buf; + } + + cur_rec = (struct llog_rec_hdr *)ptr; + idx = le32_to_cpu(cur_rec->lrh_index); + recs_pr[i] = cur_rec; + + if (ext2_test_bit(idx, LLOG_HDR_BITMAP(*llog))) { + if (le32_to_cpu(cur_rec->lrh_type) != OBD_CFG_REC) + printf("rec #%d type=%x len=%u\n", idx, + cur_rec->lrh_type, cur_rec->lrh_len); + } else { + printf("Bit %d of %d not set\n", idx, recs_num); + cur_rec->lrh_id = CANCELLED; + /* The header counts only set records */ + i--; + } + ptr += le32_to_cpu(cur_rec->lrh_len); if ((ptr - file_buf) > file_size) { printf("The log is corrupt (too big at %d)\n", i); @@ -350,19 +388,27 @@ void print_lustre_cfg(struct lustre_cfg *lcfg, int *skip) } case(LCFG_SET_TIMEOUT):{ printf("set_timeout=%d ", lcfg->lcfg_num); - print_1_cfg(lcfg); break; } - case(LCFG_SET_UPCALL):{ - printf("set_lustre_upcall "); - print_1_cfg(lcfg); + case(LCFG_SET_LDLM_TIMEOUT):{ + printf("set_ldlm_timeout=%d ", lcfg->lcfg_num); break; } - case(LCFG_PARAM):{ - printf("param "); + case(LCFG_SET_UPCALL):{ + printf("set_lustre_upcall "); print_1_cfg(lcfg); break; } + case(LCFG_PARAM):{ + printf("param "); + print_1_cfg(lcfg); + break; + } + case(LCFG_SET_PARAM):{ + printf("set_param "); + print_1_cfg(lcfg); + break; + } case(LCFG_SPTLRPC_CONF):{ printf("sptlrpc_conf "); print_1_cfg(lcfg); @@ -384,7 +430,7 @@ void print_lustre_cfg(struct lustre_cfg *lcfg, int *skip) } if (marker->cm_flags & CM_EXCLUDE) { - if (marker->cm_flags & CM_START) + if (marker->cm_flags & CM_START) printf("EXCLUDE START "); else printf("EXCLUDE END "); @@ -452,28 +498,72 @@ void print_lustre_cfg(struct lustre_cfg *lcfg, int *skip) return; } +static void print_logid(struct llog_logid_rec *lid) +{ + printf("ogen=%X name="DOSTID"\n", + lid->lid_id.lgl_ogen, + POSTID(&lid->lid_id.lgl_oi)); +} + +static void print_hsm_action(struct llog_agent_req_rec *larr) +{ + char buf[12]; + int sz; + + sz = larr->arr_hai.hai_len - sizeof(larr->arr_hai); + printf("lrh=[type=%X len=%d idx=%d] fid="DFID + " compound/cookie="LPX64"/"LPX64 + " status=%s action=%s archive#=%d flags="LPX64 + " create="LPU64" change="LPU64 + " extent="LPX64"-"LPX64" gid="LPX64" datalen=%d" + " data=[%s]\n", + larr->arr_hdr.lrh_type, + larr->arr_hdr.lrh_len, larr->arr_hdr.lrh_index, + PFID(&larr->arr_hai.hai_fid), + larr->arr_compound_id, larr->arr_hai.hai_cookie, + agent_req_status2name(larr->arr_status), + hsm_copytool_action2name(larr->arr_hai.hai_action), + larr->arr_archive_id, + larr->arr_flags, + larr->arr_req_create, larr->arr_req_change, + larr->arr_hai.hai_extent.offset, + larr->arr_hai.hai_extent.length, + larr->arr_hai.hai_gid, sz, + hai_dump_data_field(&larr->arr_hai, buf, sizeof(buf))); +} + void print_records(struct llog_rec_hdr **recs, int rec_number) { - __u32 lopt; - int i, skip = 0; - - for(i = 0; i < rec_number; i++) { - printf("#%.2d (%.3d)", le32_to_cpu(recs[i]->lrh_index), - le32_to_cpu(recs[i]->lrh_len)); - - lopt = le32_to_cpu(recs[i]->lrh_type); - - if (recs[i]->padding == CANCELLED) - printf("NOT SET "); - - if (lopt == OBD_CFG_REC) { - struct lustre_cfg *lcfg; - lcfg = (struct lustre_cfg *)((char*)(recs[i]) + - sizeof(struct llog_rec_hdr)); - print_lustre_cfg(lcfg, &skip); - } else if (lopt == LLOG_PAD_MAGIC) { - printf("padding\n"); - } else - printf("unknown type %x\n", lopt); - } + __u32 lopt; + int i, skip = 0; + + for (i = 0; i < rec_number; i++) { + printf("#%.2d (%.3d)", le32_to_cpu(recs[i]->lrh_index), + le32_to_cpu(recs[i]->lrh_len)); + + lopt = le32_to_cpu(recs[i]->lrh_type); + + if (recs[i]->lrh_id == CANCELLED) + printf("NOT SET "); + + switch (lopt) { + case OBD_CFG_REC: + print_lustre_cfg( + (struct lustre_cfg *)((char *)(recs[i]) + + sizeof(struct llog_rec_hdr)), &skip); + break; + case LLOG_PAD_MAGIC: + printf("padding\n"); + break; + case LLOG_LOGID_MAGIC: + print_logid((struct llog_logid_rec *)recs[i]); + break; + case HSM_AGENT_REC: + print_hsm_action((struct llog_agent_req_rec *)recs[i]); + break; + default: + printf("unknown type %x\n", lopt); + break; + } + } }