X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flinux%2Fobd_support.h;h=e9cd1187fffe0a15eebedf24076fe56959e9411e;hb=6aea6cf0aecb1f819bb8a0e9cf546d26b653e2b4;hp=31043251ddb197b8714fc30750457ba350188b4b;hpb=405e17721c0863a3d310edcd3f6afa850ead353c;p=fs%2Flustre-release.git diff --git a/lustre/include/linux/obd_support.h b/lustre/include/linux/obd_support.h index 3104325..e9cd118 100644 --- a/lustre/include/linux/obd_support.h +++ b/lustre/include/linux/obd_support.h @@ -1,138 +1,165 @@ +/* -*- 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 EXT2_OBD_DEBUG - -#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; - -/* 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_UNUSED4 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 /* ext2 block allocation */ - -#ifdef EXT2_OBD_DEBUG -#define CDEBUG(mask, format, a...) \ - do { \ - if (obd_debug_level & mask) { \ - printk("(%s,l. %d): ", __FUNCTION__, __LINE__); \ - printk(format, ## a); } \ - } while (0) - -#define ENTRY \ - if (obd_print_entry) \ - printk("Process %d entered %s\n", current->pid, __FUNCTION__) - -#define EXIT \ - if (obd_print_entry) \ - printk("Process %d leaving %s [%d]\n", current->pid, __FUNCTION__, __LINE__) - -#else /* EXT2_OBD_DEBUG */ - -# define CDEBUG ; -# define ENTRY ; -# define EXIT ; - -#endif /* EXT2_OBD_DEBUG */ - - -#define CMD(cmd) (( cmd == READ ) ? "read" : "write") - -#define IDEBUG(inode) { \ - printk("]]%s line %d[[ ino %ld, blocks %ld, size %Ld, atm %ld, ctim %ld, mtm %ld, mode %o, uid %d, gid %d\n", \ - __FUNCTION__ , __LINE__, \ - inode->i_ino, inode->i_blocks, inode->i_size,\ - inode->i_atime, inode->i_ctime, inode->i_mtime,\ - inode->i_mode, inode->i_uid, inode->i_gid);\ - printk("blk: %d %d %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],\ - inode->u.ext2_i.i_data[8], inode->u.ext2_i.i_data[9]);\ - } - - -#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_IOCTL, " ** %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_IOCTL, "** %s, no page\n", __FUNCTION__); }} - - -#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); \ -} 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); \ - } \ -} while (0) - - -static inline struct page *addr_to_page(char *buf) +extern unsigned long obd_memory; +extern unsigned long obd_fail_loc; +extern unsigned long obd_timeout; +extern char obd_recovery_upcall[128]; + +#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_MDS_CONNECT_NET 0x117 +#define OBD_FAIL_MDS_CONNECT_PACK 0x118 +#define OBD_FAIL_MDS_REINT_NET_REP 0x119 +#define OBD_FAIL_MDS_DISCONNECT_NET 0x11a +#define OBD_FAIL_MDS_GETSTATUS_NET 0x11b +#define OBD_FAIL_MDS_GETSTATUS_PACK 0x11c +#define OBD_FAIL_MDS_STATFS_PACK 0x11d +#define OBD_FAIL_MDS_STATFS_NET 0x11e + +#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 OBD_FAIL_OST_STATFS_NET 0x20c +#define OBD_FAIL_OST_HANDLE_UNPACK 0x20d +#define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e +#define OBD_FAIL_OST_BRW_READ_BULK 0x20f + +#define OBD_FAIL_LDLM 0x300 +#define OBD_FAIL_LDLM_NAMESPACE_NEW 0x301 +#define OBD_FAIL_LDLM_ENQUEUE 0x302 +#define OBD_FAIL_LDLM_CONVERT 0x303 +#define OBD_FAIL_LDLM_CANCEL 0x304 +#define OBD_FAIL_LDLM_BL_CALLBACK 0x305 +#define OBD_FAIL_LDLM_CP_CALLBACK 0x306 + +#define OBD_FAIL_OSC 0x400 +#define OBD_FAIL_OSC_BRW_READ_BULK 0x401 +#define OBD_FAIL_OSC_BRW_WRITE_BULK 0x402 + +/* 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; \ + if ((id) & OBD_FAIL_ONCE) \ + obd_fail_loc |= OBD_FAIL_ONCE; \ + RETURN(ret); \ + } \ +} while(0) + +#include +#include + +#define fixme() CDEBUG(D_OTHER, "FIXME\n"); + +static inline void OBD_FAIL_WRITE(int id, kdev_t dev) { - unsigned long addr = (unsigned long)buf; - unsigned long map_nr; - -#ifdef CONFIG_DISCONTIGMEM - if (addr == 0) return; + 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 - map_nr = MAP_NR(addr); - if (map_nr < max_mapnr) - return mem_map + map_nr; - else - return 0; + /* We set FAIL_ONCE because we never "un-fail" a device */ + obd_fail_loc |= OBD_FAILED | OBD_FAIL_ONCE; + } } +#define OBD_ALLOC(ptr, size) \ +do { \ + long s = (size); \ + (ptr) = kmalloc(s, GFP_KERNEL); \ + if ((ptr) == NULL) { \ + CERROR("kmalloc of '" #ptr "' (%ld bytes) failed " \ + "at %s:%d\n", s, __FILE__, __LINE__); \ + } else { \ + memset((ptr), 0, s); \ + obd_memory += s; \ + CDEBUG(D_MALLOC, "kmalloced '" #ptr "': %ld at " \ + "%p (tot %ld).\n", s, (ptr), obd_memory); \ + } \ +} while (0) +#define OBD_FREE(ptr, size) \ +do { \ + int s = (size); \ + kfree((ptr)); \ + obd_memory -= s; \ + CDEBUG(D_MALLOC, "kfreed '" #ptr "': %d at %p (tot %ld).\n", \ + s, (ptr), obd_memory); \ +} while (0) #endif