linux/drivers/staging/lustre/lustre/obdclass/debug.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.gnu.org/licenses/gpl-2.0.html
  19 *
  20 * GPL HEADER END
  21 */
  22/*
  23 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  24 * Use is subject to license terms.
  25 *
  26 * Copyright (c) 2011, 2012, Intel Corporation.
  27 */
  28/*
  29 * This file is part of Lustre, http://www.lustre.org/
  30 * Lustre is a trademark of Sun Microsystems, Inc.
  31 *
  32 * lustre/obdclass/debug.c
  33 *
  34 * Helper routines for dumping data structs for debugging.
  35 */
  36
  37#define DEBUG_SUBSYSTEM D_OTHER
  38
  39#include <asm/unaligned.h>
  40
  41#include <obd_support.h>
  42#include <lustre_debug.h>
  43#include <lustre_net.h>
  44
  45#define LPDS sizeof(__u64)
  46int block_debug_setup(void *addr, int len, __u64 off, __u64 id)
  47{
  48        LASSERT(addr);
  49
  50        put_unaligned_le64(off, addr);
  51        put_unaligned_le64(id, addr + LPDS);
  52        addr += len - LPDS - LPDS;
  53        put_unaligned_le64(off, addr);
  54        put_unaligned_le64(id, addr + LPDS);
  55
  56        return 0;
  57}
  58EXPORT_SYMBOL(block_debug_setup);
  59
  60int block_debug_check(char *who, void *addr, int end, __u64 off, __u64 id)
  61{
  62        __u64 ne_off;
  63        int err = 0;
  64
  65        LASSERT(addr);
  66
  67        ne_off = le64_to_cpu(off);
  68        id = le64_to_cpu(id);
  69        if (memcmp(addr, (char *)&ne_off, LPDS)) {
  70                CDEBUG(D_ERROR, "%s: id %#llx offset %llu off: %#llx != %#llx\n",
  71                       who, id, off, *(__u64 *)addr, ne_off);
  72                err = -EINVAL;
  73        }
  74        if (memcmp(addr + LPDS, (char *)&id, LPDS)) {
  75                CDEBUG(D_ERROR, "%s: id %#llx offset %llu id: %#llx != %#llx\n",
  76                       who, id, off, *(__u64 *)(addr + LPDS), id);
  77                err = -EINVAL;
  78        }
  79
  80        addr += end - LPDS - LPDS;
  81        if (memcmp(addr, (char *)&ne_off, LPDS)) {
  82                CDEBUG(D_ERROR, "%s: id %#llx offset %llu end off: %#llx != %#llx\n",
  83                       who, id, off, *(__u64 *)addr, ne_off);
  84                err = -EINVAL;
  85        }
  86        if (memcmp(addr + LPDS, (char *)&id, LPDS)) {
  87                CDEBUG(D_ERROR, "%s: id %#llx offset %llu end id: %#llx != %#llx\n",
  88                       who, id, off, *(__u64 *)(addr + LPDS), id);
  89                err = -EINVAL;
  90        }
  91
  92        return err;
  93}
  94EXPORT_SYMBOL(block_debug_check);
  95#undef LPDS
  96