X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flinux%2Fobd_support.h;h=94fb231e32f44d23fb1ab59dee990025e86a4b6d;hb=82905ab6f0e2dc2b229e49b601b5892daa2aa972;hp=abb64d25f06df87fd548a21bb5852e2b3d62c2e4;hpb=cca542d2fc35760f9c5e010fb7082d87e22a6536;p=fs%2Flustre-release.git diff --git a/lustre/include/linux/obd_support.h b/lustre/include/linux/obd_support.h index abb64d2..94fb231 100644 --- a/lustre/include/linux/obd_support.h +++ b/lustre/include/linux/obd_support.h @@ -1,154 +1,140 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2001, 2002 Cluster File Systems, Inc. + * + * This file is part of Lustre, http://www.lustre.org. + * + * Lustre is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * Lustre is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Lustre; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + #ifndef _OBD_SUPPORT #define _OBD_SUPPORT -#include -#include -#define MIN(a,b) (((a)<(b)) ? (a): (b)) -#define MAX(a,b) (((a)>(b)) ? (a): (b)) +#include +#include +#include -/* - * Debug code - */ /* global variables */ -extern int obd_debug_level; -extern int obd_print_entry; - -#define EXT2_OBD_DEBUG - -#ifdef EXT2_OBD_DEBUG -#define CMD(cmd) (( cmd == READ ) ? "read" : "write") - -/* debugging masks */ -#define D_PSDEV 1 /* debug information from psdev.c */ -#define D_INODE 2 -#define D_SUPER 4 -#define D_SNAP 8 -#define D_UNUSED 16 -#define D_WARNING 32 /* misc warnings */ -#define D_EXT2 64 /* anything from ext2_debug */ -#define D_MALLOC 128 /* print malloc, free information */ -#define D_CACHE 256 /* cache-related items */ -#define D_INFO 512 /* general information, especially from interface.c */ -#define D_IOCTL 1024 /* ioctl related information */ -#define D_BLOCKS 2048 /* ext2 block allocation */ -#define D_RPC 4096 /* rpc communications */ - -#define CDEBUG(mask, format, a...) \ - do { \ - if (obd_debug_level & mask) { \ - printk("(%s:%d):", __FUNCTION__, __LINE__); \ - printk(format, ## a); } \ - } while (0) - -#define ENTRY if (obd_print_entry) \ - printk(KERN_INFO "Process %d entered %s\n",\ - current->pid, __FUNCTION__) - -#define EXIT if (obd_print_entry) \ - printk(KERN_INFO "Process %d leaving %s [%d]\n",\ - current->pid, __FUNCTION__, __LINE__) - -/* Inode common information printed out (used by obdfs and ext2obd inodes) */ -#define ICDEBUG(inode) { \ - CDEBUG(D_INFO, "]]%s line %d[[ ino %ld, atm %ld, mtm %ld, ctm %ld, "\ - "size %Ld, blocks %ld\n", __FUNCTION__ , __LINE__,\ - inode->i_ino, inode->i_atime, inode->i_mtime, inode->i_ctime,\ - inode->i_size, inode->i_blocks);\ - CDEBUG(D_INFO,\ - "]]%s line %d[[ mode %o, uid %d, gid %d, nlnk %d, count %d\n",\ - __FUNCTION__, __LINE__, inode->i_mode, inode->i_uid,\ - inode->i_gid, inode->i_nlink, inode->i_count);\ -} - -/* Ext2 inode information */ -#define EXDEBUG(inode) { \ - ICDEBUG(inode);\ - CDEBUG(D_INFO, "ext2 blocks: %d %d %d %d %d %d %d %d\n",\ - inode->u.ext2_i.i_data[0], inode->u.ext2_i.i_data[1],\ - inode->u.ext2_i.i_data[2], inode->u.ext2_i.i_data[3],\ - inode->u.ext2_i.i_data[4], inode->u.ext2_i.i_data[5],\ - inode->u.ext2_i.i_data[6], inode->u.ext2_i.i_data[7]);\ -} - -/* OBDFS inode information */ -#define OIDEBUG(inode) { \ - ICDEBUG(inode);\ - CDEBUG(D_INFO,"oinfo: flags 0x%08x\n", obdfs_i2info(inode)->oi_flags);\ - /* obdfs_print_plist(inode); */\ -} - -#define ODEBUG(obdo) { \ - CDEBUG(D_INFO, "]]%s line %d[[ id %ld, atm %ld, mtm %ld, ctm %ld, "\ - "size %ld, blocks %ld\n", __FUNCTION__ , __LINE__,\ - (long)(obdo)->o_id, (long)(obdo)->o_atime,\ - (long)(obdo)->o_mtime, (long)(obdo)->o_ctime,\ - (long)(obdo)->o_size, (long)(obdo)->o_blocks);\ - CDEBUG(D_INFO, "]]%s line %d[[ mode %o, uid %d, gid %d, flg 0x%0x, "\ - "obdflg 0x%0x, nlnk %d, valid 0x%0x\n", __FUNCTION__ , __LINE__,\ - (obdo)->o_mode, (obdo)->o_uid, (obdo)->o_gid, (obdo)->o_flags,\ - (obdo)->o_obdflags, (obdo)->o_nlink, (obdo)->o_valid);\ -} - - -#define PDEBUG(page,cmd) { \ - if (page){\ - char *uptodate = (Page_Uptodate(page)) ? "yes" : "no";\ - char *locked = (PageLocked(page)) ? "yes" : "no";\ - int count = page->count.counter;\ - long index = page->index;\ - CDEBUG(D_CACHE, " ** %s, cmd: %s, off %ld, uptodate: %s, "\ - "locked: %s, cnt %d page %p pages %ld** \n",\ - __FUNCTION__, cmd, index, uptodate, locked, count, \ - page, (!page->mapping) ? -1 : page->mapping->nrpages);\ - } else \ - CDEBUG(D_CACHE, "** %s, no page\n", __FUNCTION__);\ +extern unsigned long obd_memory; +extern unsigned long obd_fail_loc; + +#define OBD_FAIL_MDS 0x100 +#define OBD_FAIL_MDS_HANDLE_UNPACK 0x101 +#define OBD_FAIL_MDS_GETATTR_NET 0x102 +#define OBD_FAIL_MDS_GETATTR_PACK 0x103 +#define OBD_FAIL_MDS_READPAGE_NET 0x104 +#define OBD_FAIL_MDS_READPAGE_PACK 0x105 +#define OBD_FAIL_MDS_SENDPAGE 0x106 +#define OBD_FAIL_MDS_REINT_NET 0x107 +#define OBD_FAIL_MDS_REINT_UNPACK 0x108 +#define OBD_FAIL_MDS_REINT_SETATTR 0x109 +#define OBD_FAIL_MDS_REINT_SETATTR_WRITE 0x10a +#define OBD_FAIL_MDS_REINT_CREATE 0x10b +#define OBD_FAIL_MDS_REINT_CREATE_WRITE 0x10c +#define OBD_FAIL_MDS_REINT_UNLINK 0x10d +#define OBD_FAIL_MDS_REINT_UNLINK_WRITE 0x10e +#define OBD_FAIL_MDS_REINT_LINK 0x10f +#define OBD_FAIL_MDS_REINT_LINK_WRITE 0x110 +#define OBD_FAIL_MDS_REINT_RENAME 0x111 +#define OBD_FAIL_MDS_REINT_RENAME_WRITE 0x112 +#define OBD_FAIL_MDS_OPEN_NET 0x113 +#define OBD_FAIL_MDS_OPEN_PACK 0x114 +#define OBD_FAIL_MDS_CLOSE_NET 0x115 +#define OBD_FAIL_MDS_CLOSE_PACK 0x116 + +#define OBD_FAIL_OST 0x200 +#define OBD_FAIL_OST_CONNECT_NET 0x201 +#define OBD_FAIL_OST_DISCONNECT_NET 0x202 +#define OBD_FAIL_OST_GET_INFO_NET 0x203 +#define OBD_FAIL_OST_CREATE_NET 0x204 +#define OBD_FAIL_OST_DESTROY_NET 0x205 +#define OBD_FAIL_OST_GETATTR_NET 0x206 +#define OBD_FAIL_OST_SETATTR_NET 0x207 +#define OBD_FAIL_OST_OPEN_NET 0x208 +#define OBD_FAIL_OST_CLOSE_NET 0x209 +#define OBD_FAIL_OST_BRW_NET 0x20a +#define OBD_FAIL_OST_PUNCH_NET 0x20b + +#define OBB_FAIL_LDLM 0x300 +#define OBD_FAIL_LDLM_ENQUEUE 0x301 +#define OBD_FAIL_LDLM_CONVERT 0x302 +#define OBD_FAIL_LDLM_CANCEL 0x303 +#define OBD_FAIL_LDLM_CALLBACK 0x304 + +/* preparation for a more advanced failure testbed (not functional yet) */ +#define OBD_FAIL_MASK_SYS 0x0000FF00 +#define OBD_FAIL_MASK_LOC (0x000000FF | OBD_FAIL_MASK_SYS) +#define OBD_FAIL_ONCE 0x80000000 +#define OBD_FAILED 0x40000000 +#define OBD_FAIL_MDS_ALL_NET 0x01000000 +#define OBD_FAIL_OST_ALL_NET 0x02000000 + +#define OBD_FAIL_CHECK(id) ((obd_fail_loc & OBD_FAIL_MASK_LOC) == (id) && \ + ((obd_fail_loc & (OBD_FAILED | OBD_FAIL_ONCE))!=\ + (OBD_FAILED | OBD_FAIL_ONCE))) + +#define OBD_FAIL_RETURN(id, ret) \ +do { \ + if (OBD_FAIL_CHECK(id)) { \ + CERROR("obd_fail_loc=%x, fail operation rc=%d\n", id, ret); \ + obd_fail_loc |= OBD_FAILED; \ + RETURN(ret); \ + } \ +} while(0) + +#include + +static inline void OBD_FAIL_WRITE(int id, kdev_t dev) +{ + if (OBD_FAIL_CHECK(id)) { +#ifdef CONFIG_DEV_RDONLY + CERROR("obd_fail_loc=%x, fail write operation on %s\n", + id, bdevname(dev)); + dev_set_rdonly(dev, 2); +#else + CERROR("obd_fail_loc=%x, can't fail write operation on %s\n", + id, bdevname(dev)); +#endif + /* We set FAIL_ONCE because we never "un-fail" a device */ + obd_fail_loc |= OBD_FAILED | OBD_FAIL_ONCE; + } } -#else /* EXT2_OBD_DEBUG */ - -#define CDEBUG(mask, format, a...) {} -#define ENTRY {} -#define EXIT {} -#define ODEBUG(obdo) {} -#define EXDEBUG(inode) {} -#define OIDEBUG(inode) {} -#define PDEBUG(page, cmd) {} - -#endif /* EXT2_OBD_DEBUG */ - - - -#define OBD_ALLOC(ptr, cast, size) \ -do { \ - if (size <= 4096) { \ - ptr = (cast)kmalloc((unsigned long) size, GFP_KERNEL); \ - CDEBUG(D_MALLOC, "kmalloced: %x at %x.\n", \ - (int) size, (int) ptr); \ - } else { \ - ptr = (cast)vmalloc((unsigned long) size); \ - CDEBUG(D_MALLOC, "vmalloced: %x at %x.\n", \ - (int) size, (int) ptr); \ - } \ - if (ptr == 0) { \ - printk("kernel malloc returns 0 at %s:%d\n", \ - __FILE__, __LINE__); \ - } \ - memset(ptr, 0, size); \ +#define OBD_ALLOC(ptr, size) \ +do { \ + long s = (size); \ + (ptr) = kmalloc(s, GFP_KERNEL); \ + if ((ptr) == NULL) { \ + CERROR("kernel malloc of %ld bytes failed at " \ + "%s:%d\n", s, __FILE__, __LINE__); \ + } else { \ + memset((ptr), 0, s); \ + obd_memory += s; \ + } \ + CDEBUG(D_MALLOC, "kmalloced: %ld at %x (tot %ld).\n", \ + s, (int)(ptr), obd_memory); \ } while (0) -#define OBD_FREE(ptr,size) \ -do { \ - if (size <= 4096) { \ - kfree_s((ptr), (size)); \ - CDEBUG(D_MALLOC, "kfreed: %x at %x.\n", \ - (int) size, (int) ptr); \ - } else { \ - vfree((ptr)); \ - CDEBUG(D_MALLOC, "vfreed: %x at %x.\n", \ - (int) size, (int) ptr); \ - } \ +#define OBD_FREE(ptr, size) \ +do { \ + int s = (size); \ + kfree((ptr)); \ + CDEBUG(D_MALLOC, "kfreed: %d at %x (tot %ld).\n", \ + s, (int)(ptr), obd_memory); \ + obd_memory -= s; \ } while (0) - - #endif