linux/drivers/staging/lustre/lustre/obdclass/llog_swab.c
<<
>>
Prefs
   1/*
   2 * GPL HEADER START
   3 *
   4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 only,
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License version 2 for more details (a copy is included
  14 * in the LICENSE file that accompanied this code).
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * version 2 along with this program; If not, see
  18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2012, Intel Corporation.
  31 */
  32/*
  33 * This file is part of Lustre, http://www.lustre.org/
  34 * Lustre is a trademark of Sun Microsystems, Inc.
  35 *
  36 * lustre/obdclass/llog_swab.c
  37 *
  38 * Swabbing of llog datatypes (from disk or over the wire).
  39 *
  40 * Author: jacob berkman  <jacob@clusterfs.com>
  41 */
  42
  43#define DEBUG_SUBSYSTEM S_LOG
  44
  45
  46#include "../include/lustre_log.h"
  47
  48static void print_llogd_body(struct llogd_body *d)
  49{
  50        CDEBUG(D_OTHER, "llogd body: %p\n", d);
  51        CDEBUG(D_OTHER, "\tlgd_logid.lgl_oi: "DOSTID"\n",
  52               POSTID(&d->lgd_logid.lgl_oi));
  53        CDEBUG(D_OTHER, "\tlgd_logid.lgl_ogen: %#x\n", d->lgd_logid.lgl_ogen);
  54        CDEBUG(D_OTHER, "\tlgd_ctxt_idx: %#x\n", d->lgd_ctxt_idx);
  55        CDEBUG(D_OTHER, "\tlgd_llh_flags: %#x\n", d->lgd_llh_flags);
  56        CDEBUG(D_OTHER, "\tlgd_index: %#x\n", d->lgd_index);
  57        CDEBUG(D_OTHER, "\tlgd_saved_index: %#x\n", d->lgd_saved_index);
  58        CDEBUG(D_OTHER, "\tlgd_len: %#x\n", d->lgd_len);
  59        CDEBUG(D_OTHER, "\tlgd_cur_offset: %#llx\n", d->lgd_cur_offset);
  60}
  61
  62void lustre_swab_lu_fid(struct lu_fid *fid)
  63{
  64        __swab64s(&fid->f_seq);
  65        __swab32s(&fid->f_oid);
  66        __swab32s(&fid->f_ver);
  67}
  68EXPORT_SYMBOL(lustre_swab_lu_fid);
  69
  70void lustre_swab_ost_id(struct ost_id *oid)
  71{
  72        if (fid_seq_is_mdt0(oid->oi.oi_seq)) {
  73                __swab64s(&oid->oi.oi_id);
  74                __swab64s(&oid->oi.oi_seq);
  75        } else {
  76                lustre_swab_lu_fid(&oid->oi_fid);
  77        }
  78}
  79EXPORT_SYMBOL(lustre_swab_ost_id);
  80
  81void lustre_swab_llog_id(struct llog_logid *log_id)
  82{
  83        __swab64s(&log_id->lgl_oi.oi.oi_id);
  84        __swab64s(&log_id->lgl_oi.oi.oi_seq);
  85        __swab32s(&log_id->lgl_ogen);
  86}
  87EXPORT_SYMBOL(lustre_swab_llog_id);
  88
  89void lustre_swab_llogd_body(struct llogd_body *d)
  90{
  91        print_llogd_body(d);
  92        lustre_swab_llog_id(&d->lgd_logid);
  93        __swab32s(&d->lgd_ctxt_idx);
  94        __swab32s(&d->lgd_llh_flags);
  95        __swab32s(&d->lgd_index);
  96        __swab32s(&d->lgd_saved_index);
  97        __swab32s(&d->lgd_len);
  98        __swab64s(&d->lgd_cur_offset);
  99        print_llogd_body(d);
 100}
 101EXPORT_SYMBOL(lustre_swab_llogd_body);
 102
 103void lustre_swab_llogd_conn_body(struct llogd_conn_body *d)
 104{
 105        __swab64s(&d->lgdc_gen.mnt_cnt);
 106        __swab64s(&d->lgdc_gen.conn_cnt);
 107        lustre_swab_llog_id(&d->lgdc_logid);
 108        __swab32s(&d->lgdc_ctxt_idx);
 109}
 110EXPORT_SYMBOL(lustre_swab_llogd_conn_body);
 111
 112void lustre_swab_ll_fid(struct ll_fid *fid)
 113{
 114        __swab64s(&fid->id);
 115        __swab32s(&fid->generation);
 116        __swab32s(&fid->f_type);
 117}
 118EXPORT_SYMBOL(lustre_swab_ll_fid);
 119
 120void lustre_swab_lu_seq_range(struct lu_seq_range *range)
 121{
 122        __swab64s(&range->lsr_start);
 123        __swab64s(&range->lsr_end);
 124        __swab32s(&range->lsr_index);
 125        __swab32s(&range->lsr_flags);
 126}
 127EXPORT_SYMBOL(lustre_swab_lu_seq_range);
 128
 129void lustre_swab_llog_rec(struct llog_rec_hdr *rec)
 130{
 131        struct llog_rec_tail *tail = NULL;
 132
 133        __swab32s(&rec->lrh_len);
 134        __swab32s(&rec->lrh_index);
 135        __swab32s(&rec->lrh_type);
 136        __swab32s(&rec->lrh_id);
 137
 138        switch (rec->lrh_type) {
 139        case OST_SZ_REC:
 140        {
 141                struct llog_size_change_rec *lsc =
 142                        (struct llog_size_change_rec *)rec;
 143
 144                lustre_swab_ll_fid(&lsc->lsc_fid);
 145                __swab32s(&lsc->lsc_ioepoch);
 146                tail = &lsc->lsc_tail;
 147                break;
 148        }
 149        case MDS_UNLINK_REC:
 150        {
 151                struct llog_unlink_rec *lur = (struct llog_unlink_rec *)rec;
 152
 153                __swab64s(&lur->lur_oid);
 154                __swab32s(&lur->lur_oseq);
 155                __swab32s(&lur->lur_count);
 156                tail = &lur->lur_tail;
 157                break;
 158        }
 159        case MDS_UNLINK64_REC:
 160        {
 161                struct llog_unlink64_rec *lur =
 162                        (struct llog_unlink64_rec *)rec;
 163
 164                lustre_swab_lu_fid(&lur->lur_fid);
 165                __swab32s(&lur->lur_count);
 166                tail = &lur->lur_tail;
 167                break;
 168        }
 169        case CHANGELOG_REC:
 170        {
 171                struct llog_changelog_rec *cr = (struct llog_changelog_rec *)rec;
 172
 173                __swab16s(&cr->cr.cr_namelen);
 174                __swab16s(&cr->cr.cr_flags);
 175                __swab32s(&cr->cr.cr_type);
 176                __swab64s(&cr->cr.cr_index);
 177                __swab64s(&cr->cr.cr_prev);
 178                __swab64s(&cr->cr.cr_time);
 179                lustre_swab_lu_fid(&cr->cr.cr_tfid);
 180                lustre_swab_lu_fid(&cr->cr.cr_pfid);
 181                if (CHANGELOG_REC_EXTENDED(&cr->cr)) {
 182                        struct llog_changelog_ext_rec *ext =
 183                                (struct llog_changelog_ext_rec *)rec;
 184
 185                        lustre_swab_lu_fid(&ext->cr.cr_sfid);
 186                        lustre_swab_lu_fid(&ext->cr.cr_spfid);
 187                        tail = &ext->cr_tail;
 188                } else {
 189                        tail = &cr->cr_tail;
 190                }
 191                break;
 192        }
 193        case CHANGELOG_USER_REC:
 194        {
 195                struct llog_changelog_user_rec *cur =
 196                        (struct llog_changelog_user_rec *)rec;
 197
 198                __swab32s(&cur->cur_id);
 199                __swab64s(&cur->cur_endrec);
 200                tail = &cur->cur_tail;
 201                break;
 202        }
 203
 204        case HSM_AGENT_REC: {
 205                struct llog_agent_req_rec *arr =
 206                        (struct llog_agent_req_rec *)rec;
 207
 208                __swab32s(&arr->arr_hai.hai_len);
 209                __swab32s(&arr->arr_hai.hai_action);
 210                lustre_swab_lu_fid(&arr->arr_hai.hai_fid);
 211                lustre_swab_lu_fid(&arr->arr_hai.hai_dfid);
 212                __swab64s(&arr->arr_hai.hai_cookie);
 213                __swab64s(&arr->arr_hai.hai_extent.offset);
 214                __swab64s(&arr->arr_hai.hai_extent.length);
 215                __swab64s(&arr->arr_hai.hai_gid);
 216                /* no swabing for opaque data */
 217                /* hai_data[0]; */
 218                break;
 219        }
 220
 221        case MDS_SETATTR64_REC:
 222        {
 223                struct llog_setattr64_rec *lsr =
 224                        (struct llog_setattr64_rec *)rec;
 225
 226                lustre_swab_ost_id(&lsr->lsr_oi);
 227                __swab32s(&lsr->lsr_uid);
 228                __swab32s(&lsr->lsr_uid_h);
 229                __swab32s(&lsr->lsr_gid);
 230                __swab32s(&lsr->lsr_gid_h);
 231                tail = &lsr->lsr_tail;
 232                break;
 233        }
 234        case OBD_CFG_REC:
 235                /* these are swabbed as they are consumed */
 236                break;
 237        case LLOG_HDR_MAGIC:
 238        {
 239                struct llog_log_hdr *llh = (struct llog_log_hdr *)rec;
 240
 241                __swab64s(&llh->llh_timestamp);
 242                __swab32s(&llh->llh_count);
 243                __swab32s(&llh->llh_bitmap_offset);
 244                __swab32s(&llh->llh_flags);
 245                __swab32s(&llh->llh_size);
 246                __swab32s(&llh->llh_cat_idx);
 247                tail = &llh->llh_tail;
 248                break;
 249        }
 250        case LLOG_LOGID_MAGIC:
 251        {
 252                struct llog_logid_rec *lid = (struct llog_logid_rec *)rec;
 253
 254                lustre_swab_llog_id(&lid->lid_id);
 255                tail = &lid->lid_tail;
 256                break;
 257        }
 258        case LLOG_GEN_REC:
 259        {
 260                struct llog_gen_rec *lgr = (struct llog_gen_rec *)rec;
 261
 262                __swab64s(&lgr->lgr_gen.mnt_cnt);
 263                __swab64s(&lgr->lgr_gen.conn_cnt);
 264                tail = &lgr->lgr_tail;
 265                break;
 266        }
 267        case LLOG_PAD_MAGIC:
 268                break;
 269        default:
 270                CERROR("Unknown llog rec type %#x swabbing rec %p\n",
 271                       rec->lrh_type, rec);
 272        }
 273
 274        if (tail) {
 275                __swab32s(&tail->lrt_len);
 276                __swab32s(&tail->lrt_index);
 277        }
 278}
 279EXPORT_SYMBOL(lustre_swab_llog_rec);
 280
 281static void print_llog_hdr(struct llog_log_hdr *h)
 282{
 283        CDEBUG(D_OTHER, "llog header: %p\n", h);
 284        CDEBUG(D_OTHER, "\tllh_hdr.lrh_index: %#x\n", h->llh_hdr.lrh_index);
 285        CDEBUG(D_OTHER, "\tllh_hdr.lrh_len: %#x\n", h->llh_hdr.lrh_len);
 286        CDEBUG(D_OTHER, "\tllh_hdr.lrh_type: %#x\n", h->llh_hdr.lrh_type);
 287        CDEBUG(D_OTHER, "\tllh_timestamp: %#llx\n", h->llh_timestamp);
 288        CDEBUG(D_OTHER, "\tllh_count: %#x\n", h->llh_count);
 289        CDEBUG(D_OTHER, "\tllh_bitmap_offset: %#x\n", h->llh_bitmap_offset);
 290        CDEBUG(D_OTHER, "\tllh_flags: %#x\n", h->llh_flags);
 291        CDEBUG(D_OTHER, "\tllh_size: %#x\n", h->llh_size);
 292        CDEBUG(D_OTHER, "\tllh_cat_idx: %#x\n", h->llh_cat_idx);
 293        CDEBUG(D_OTHER, "\tllh_tail.lrt_index: %#x\n", h->llh_tail.lrt_index);
 294        CDEBUG(D_OTHER, "\tllh_tail.lrt_len: %#x\n", h->llh_tail.lrt_len);
 295}
 296
 297void lustre_swab_llog_hdr(struct llog_log_hdr *h)
 298{
 299        print_llog_hdr(h);
 300
 301        lustre_swab_llog_rec(&h->llh_hdr);
 302
 303        print_llog_hdr(h);
 304}
 305EXPORT_SYMBOL(lustre_swab_llog_hdr);
 306
 307static void print_lustre_cfg(struct lustre_cfg *lcfg)
 308{
 309        int i;
 310
 311        if (!(libcfs_debug & D_OTHER)) /* don't loop on nothing */
 312                return;
 313        CDEBUG(D_OTHER, "lustre_cfg: %p\n", lcfg);
 314        CDEBUG(D_OTHER, "\tlcfg->lcfg_version: %#x\n", lcfg->lcfg_version);
 315
 316        CDEBUG(D_OTHER, "\tlcfg->lcfg_command: %#x\n", lcfg->lcfg_command);
 317        CDEBUG(D_OTHER, "\tlcfg->lcfg_num: %#x\n", lcfg->lcfg_num);
 318        CDEBUG(D_OTHER, "\tlcfg->lcfg_flags: %#x\n", lcfg->lcfg_flags);
 319        CDEBUG(D_OTHER, "\tlcfg->lcfg_nid: %s\n", libcfs_nid2str(lcfg->lcfg_nid));
 320
 321        CDEBUG(D_OTHER, "\tlcfg->lcfg_bufcount: %d\n", lcfg->lcfg_bufcount);
 322        if (lcfg->lcfg_bufcount < LUSTRE_CFG_MAX_BUFCOUNT)
 323                for (i = 0; i < lcfg->lcfg_bufcount; i++)
 324                        CDEBUG(D_OTHER, "\tlcfg->lcfg_buflens[%d]: %d\n",
 325                               i, lcfg->lcfg_buflens[i]);
 326}
 327
 328void lustre_swab_lustre_cfg(struct lustre_cfg *lcfg)
 329{
 330        int i;
 331
 332        __swab32s(&lcfg->lcfg_version);
 333
 334        if (lcfg->lcfg_version != LUSTRE_CFG_VERSION) {
 335                CERROR("not swabbing lustre_cfg version %#x (expecting %#x)\n",
 336                       lcfg->lcfg_version, LUSTRE_CFG_VERSION);
 337                return;
 338        }
 339
 340        __swab32s(&lcfg->lcfg_command);
 341        __swab32s(&lcfg->lcfg_num);
 342        __swab32s(&lcfg->lcfg_flags);
 343        __swab64s(&lcfg->lcfg_nid);
 344        __swab32s(&lcfg->lcfg_bufcount);
 345        for (i = 0; i < lcfg->lcfg_bufcount && i < LUSTRE_CFG_MAX_BUFCOUNT; i++)
 346                __swab32s(&lcfg->lcfg_buflens[i]);
 347
 348        print_lustre_cfg(lcfg);
 349        return;
 350}
 351EXPORT_SYMBOL(lustre_swab_lustre_cfg);
 352
 353/* used only for compatibility with old on-disk cfg_marker data */
 354struct cfg_marker32 {
 355        __u32   cm_step;
 356        __u32   cm_flags;
 357        __u32   cm_vers;
 358        __u32   padding;
 359        __u32   cm_createtime;
 360        __u32   cm_canceltime;
 361        char    cm_tgtname[MTI_NAME_MAXLEN];
 362        char    cm_comment[MTI_NAME_MAXLEN];
 363};
 364
 365#define MTI_NAMELEN32    (MTI_NAME_MAXLEN - \
 366        (sizeof(struct cfg_marker) - sizeof(struct cfg_marker32)))
 367
 368void lustre_swab_cfg_marker(struct cfg_marker *marker, int swab, int size)
 369{
 370        struct cfg_marker32 *cm32 = (struct cfg_marker32 *)marker;
 371
 372        if (swab) {
 373                __swab32s(&marker->cm_step);
 374                __swab32s(&marker->cm_flags);
 375                __swab32s(&marker->cm_vers);
 376        }
 377        if (size == sizeof(*cm32)) {
 378                __u32 createtime, canceltime;
 379                /* There was a problem with the original declaration of
 380                 * cfg_marker on 32-bit systems because it used time_t as
 381                 * a wire protocol structure, and didn't verify this in
 382                 * wirecheck.  We now have to convert the offsets of the
 383                 * later fields in order to work on 32- and 64-bit systems.
 384                 *
 385                 * Fortunately, the cm_comment field has no functional use
 386                 * so can be sacrificed when converting the timestamp size.
 387                 *
 388                 * Overwrite fields from the end first, so they are not
 389                 * clobbered, and use memmove() instead of memcpy() because
 390                 * the source and target buffers overlap.  bug 16771 */
 391                createtime = cm32->cm_createtime;
 392                canceltime = cm32->cm_canceltime;
 393                memmove(marker->cm_comment, cm32->cm_comment, MTI_NAMELEN32);
 394                marker->cm_comment[MTI_NAMELEN32 - 1] = '\0';
 395                memmove(marker->cm_tgtname, cm32->cm_tgtname,
 396                        sizeof(marker->cm_tgtname));
 397                if (swab) {
 398                        __swab32s(&createtime);
 399                        __swab32s(&canceltime);
 400                }
 401                marker->cm_createtime = createtime;
 402                marker->cm_canceltime = canceltime;
 403                CDEBUG(D_CONFIG, "Find old cfg_marker(Srv32b,Clt64b) for target %s, converting\n",
 404                       marker->cm_tgtname);
 405        } else if (swab) {
 406                __swab64s(&marker->cm_createtime);
 407                __swab64s(&marker->cm_canceltime);
 408        }
 409
 410        return;
 411}
 412EXPORT_SYMBOL(lustre_swab_cfg_marker);
 413