Whamcloud - gitweb
in getattr requests, get the authoritative file size from the OST
[fs/lustre-release.git] / lustre / include / linux / obd_support.h
index 4707963..c7d1328 100644 (file)
-#ifndef _OBD_SUPPORT
-#define _OBD_SUPPORT
-/*
- * Copyright (C) 2001  Cluster File Systems, Inc.
+/* -*- 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.
  *
- * This code is issued under the GNU General Public License.
- * See the file COPYING in this distribution
  */
 
+#ifndef _OBD_SUPPORT
+#define _OBD_SUPPORT
+
 #include <linux/autoconf.h>
 #include <linux/slab.h>
 #include <linux/kp30.h>
 
-#define obd_unlock_page(page)                                           \
-do {                                                                    \
-        if (PageLocked(page)) {                                         \
-                UnlockPage(page);                                       \
-        } else {                                                        \
-                printk("file %s, line %d: expecting locked page\n",     \
-                       __FILE__, __LINE__);                             \
-        }                                                               \
-} while(0)
-
-/*
- * Debug code
- */
 /* global variables */
-extern int obd_debug_level;
-extern int obd_print_entry;
-extern int obd_inodes;
-extern int obd_pages;
-extern long obd_memory;
-
-#define EXT2_OBD_DEBUG
-
-#ifdef EXT2_OBD_DEBUG
-#define CMD(cmd) (( cmd == READ ) ? "read" : "write")
-
-/* Inode common information printed out (used by obdfs and ext2obd inodes) */
-#define ICDEBUG(inode) {                                                \
-        CDEBUG(D_INFO, "ino %ld, atm %ld, mtm %ld, ctm %ld, size %Ld, " \
-               "blocks %ld\n", inode->i_ino, inode->i_atime,            \
-               inode->i_mtime, inode->i_ctime, inode->i_size,           \
-               inode->i_blocks);                                        \
-        CDEBUG(D_INFO, "mode %o, uid %d, gid %d, nlnk %d, count %d\n",  \
-               inode->i_mode, inode->i_uid, inode->i_gid,               \
-               inode->i_nlink, atomic_read(&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, "id %ld, atm %ld, mtm %ld, ctm %ld, "            \
-               "size %ld, blocks %ld\n",                                \
-               (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, " mode %o, uid %d, gid %d, flg 0x%0x, "          \
-               "obdflg 0x%0x, nlnk %d, valid 0x%0x\n",                  \
-               (obdo)->o_mode, (obdo)->o_uid, (obdo)->o_gid, (obdo)->o_flags,\
-               (obdo)->o_obdflags, (obdo)->o_nlink, (obdo)->o_valid);   \
-}
+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
+#define OBD_FAIL_OSC_LOCK_BL_AST         0x403
+#define OBD_FAIL_OSC_LOCK_BL_REPLY       0x404
+
+/* 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)
 
-#define PDEBUG(page,msg) {                                              \
-        if (page){                                                      \
-                char *uptodate = (Page_Uptodate(page)) ? "upto" : "outof";\
-                char *locked = (PageLocked(page)) ? "" : "un";          \
-                char *buffer = page->buffers ? "buffer" : "";           \
-                int count = page_count(page);                           \
-                long index = page->index;                               \
-                CDEBUG(D_CACHE, "%s: ** off %ld, %sdate, %slocked, flag %ld,"\
-                       " cnt %d page 0x%p pages %ld virt %lx %s**\n",   \
-                       msg, index, uptodate, locked, page->flags, count,\
-                       page, page->mapping ? page->mapping->nrpages : -1,\
-                       page->virtual, buffer);                          \
-        } else                                                          \
-                CDEBUG(D_CACHE, "** %s: no page\n", msg);               \
-}
+#include <linux/types.h>
+#include <linux/blkdev.h>
 
-#if 0
-#define iget(sb, ino) obd_iget(sb, ino)
-#define iput(sb, ino) obd_iput(sb, ino)
+#define fixme() CDEBUG(D_OTHER, "FIXME\n");
 
-static inline struct inode *obd_iget(struct super_block *sb, unsigned long ino)
+static inline void OBD_FAIL_WRITE(int id, kdev_t dev)
 {
-        struct inode *inode;
-        
-        if ((inode = iget(sb, ino)) == NULL)
-                CDEBUG(D_INODE, "NULL in iget for %ld\n", ino);
-        else
-                obd_inodes++;
-        return inode;
-}
-
-static inline void obd_iput(struct inode *inode)
-{
-        if (inode == NULL)
-                CDEBUG(D_INODE, "NULL in iput\n");
-        else
-                obd_inodes--;
-}
+        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, size)                                    \
-do {                                                            \
-        (ptr) = kmalloc((unsigned long)(size), GFP_KERNEL);     \
-        obd_memory += (size);                                   \
-        CDEBUG(D_MALLOC, "kmalloced: %ld at %x (tot %ld).\n",   \
-               (long)(size), (int)(ptr), obd_memory);           \
-        if (ptr == NULL) {                                      \
-                CERROR("kernel malloc failed at %s:%d\n",       \
-                       __FILE__, __LINE__);                     \
-        } else {                                                \
-                memset((ptr), 0, (size));                       \
-        }                                                       \
+#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 {                                                         \
-        kfree((ptr));                                        \
-        obd_memory -= (size);                                \
-        CDEBUG(D_MALLOC, "kfreed: %d at %x (tot %ld).\n",    \
-               (int)(size), (int)(ptr), obd_memory);         \
+#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