X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flinux%2Fobd_support.h;h=1ad99026b918cb0458dacb340b06c574b3290a8d;hb=b437c99b6cd7eee79ad0a16a6f34f693709e5477;hp=01d69f717c4311323801d74e2142ce07a7e8e2d2;hpb=851d24d58eea7e9664546a8be8dd41959e4aa353;p=fs%2Flustre-release.git diff --git a/lustre/include/linux/obd_support.h b/lustre/include/linux/obd_support.h index 01d69f7..1ad9902 100644 --- a/lustre/include/linux/obd_support.h +++ b/lustre/include/linux/obd_support.h @@ -1,157 +1,158 @@ +/* -*- 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_UNUSED3 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) { \ - if ( !list_empty(&inode->i_data.pages) || inode->i_data.nrpages ) {\ - struct page * page;\ - printk("XXXXX: func %s line %d ino %ld list not empty, pages %ld\n", __FUNCTION__ , __LINE__,\ - inode->i_ino, inode->i_data.nrpages);\ - page = list_entry(inode->i_data.pages.next, struct page , list);\ - PDEBUG(page, "READ INODE");\ - }} - - -#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 offset = page->offset;\ - \ - CDEBUG(D_IOCTL, " ** %s, cmd: %s, off %ld, uptodate: %s, "\ - "locked: %s, cnt %d page %p pages %ld** \n", __FUNCTION__,\ - cmd, offset, uptodate, locked, count, page, 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 void inode_to_iattr(struct inode *inode, struct iattr *tmp) +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_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 OBB_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_CALLBACK 0x305 + +/* 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 + +static inline void fixme(void) { - tmp->ia_mode = inode->i_mode; - tmp->ia_uid = inode->i_uid; - tmp->ia_gid = inode->i_gid; - tmp->ia_size = inode->i_size; - tmp->ia_atime = inode->i_atime; - tmp->ia_mtime = inode->i_mtime; - tmp->ia_ctime = inode->i_ctime; - /* tmp->ia_flags = inode->i_flags; */ - - tmp->ia_valid = ~0; + CERROR("FIXME\n"); } -static inline void inode_cpy(struct inode *dest, struct inode *src) +static inline void OBD_FAIL_WRITE(int id, kdev_t dev) { - dest->i_mode = src->i_mode; - dest->i_uid = src->i_uid; - dest->i_gid = src->i_gid; - dest->i_size = src->i_size; - dest->i_atime = src->i_atime; - dest->i_mtime = src->i_mtime; - dest->i_ctime = src->i_ctime; - dest->i_flags = src->i_flags; - /* allocation of space */ - dest->i_blocks = src->i_blocks; - - if ( !dest->i_blocks) - memcpy(&dest->u, &src->u, sizeof(src->u)); + 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; + } } +#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