Whamcloud - gitweb
LU-3647 hsm: small fixes for HSM 43/7243/4
authorJinshan Xiong <jinshan.xiong@intel.com>
Mon, 5 Aug 2013 22:08:43 +0000 (15:08 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 17 Aug 2013 05:16:39 +0000 (05:16 +0000)
This patch includes the following fixes for HSM:
1. Redefine D_HSM. It was defined to D_TRACE;
2. Fix lu_ref for lease handle
3. User input verification to make sure the hur size is less than
MDS_MAXREQSIZE;

Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Change-Id: I6ae9af71b08cf38174b6b470ef1602966aab1805
Reviewed-on: http://review.whamcloud.com/7243
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Tested-by: Hudson
Reviewed-by: jacques-Charles Lafoucriere <jacques-charles.lafoucriere@cea.fr>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
libcfs/include/libcfs/libcfs_debug.h
libcfs/libcfs/debug.c
lnet/utils/debug.c
lustre/llite/dir.c
lustre/llite/file.c
lustre/mdc/mdc_lib.c
lustre/mdt/mdt_open.c

index a87894b..204dfe0 100644 (file)
@@ -86,75 +86,83 @@ struct ptldebug_header {
 #define PH_FLAG_FIRST_RECORD 1
 
 /* Debugging subsystems (32 bits, non-overlapping) */
-/* keep these in sync with lnet/utils/debug.c and lnet/libcfs/debug.c */
-#define S_UNDEFINED   0x00000001
-#define S_MDC         0x00000002
-#define S_MDS         0x00000004
-#define S_OSC         0x00000008
-#define S_OST         0x00000010
-#define S_CLASS       0x00000020
-#define S_LOG         0x00000040
-#define S_LLITE       0x00000080
-#define S_RPC         0x00000100
-#define S_MGMT        0x00000200
-#define S_LNET        0x00000400
-#define S_LND         0x00000800 /* ALL LNDs */
-#define S_PINGER      0x00001000
-#define S_FILTER      0x00002000
+#define S_UNDEFINED    0x00000001
+#define S_MDC          0x00000002
+#define S_MDS          0x00000004
+#define S_OSC          0x00000008
+#define S_OST          0x00000010
+#define S_CLASS                0x00000020
+#define S_LOG          0x00000040
+#define S_LLITE                0x00000080
+#define S_RPC          0x00000100
+#define S_MGMT         0x00000200
+#define S_LNET         0x00000400
+#define S_LND          0x00000800 /* ALL LNDs */
+#define S_PINGER       0x00001000
+#define S_FILTER       0x00002000
 /* unused */
-#define S_ECHO        0x00008000
-#define S_LDLM        0x00010000
-#define S_LOV         0x00020000
-#define S_LQUOTA      0x00040000
+#define S_ECHO         0x00008000
+#define S_LDLM         0x00010000
+#define S_LOV          0x00020000
+#define S_LQUOTA       0x00040000
 #define S_OSD          0x00080000
-#define S_LFSCK       0x00100000
+#define S_LFSCK                0x00100000
 /* unused */
 /* unused */
-#define S_LMV         0x00800000 /* b_new_cmd */
+#define S_LMV          0x00800000 /* b_new_cmd */
 /* unused */
-#define S_SEC         0x02000000 /* upcall cache */
-#define S_GSS         0x04000000 /* b_new_cmd */
+#define S_SEC          0x02000000 /* upcall cache */
+#define S_GSS          0x04000000 /* b_new_cmd */
 /* unused */
-#define S_MGC         0x10000000
-#define S_MGS         0x20000000
-#define S_FID         0x40000000 /* b_new_cmd */
-#define S_FLD         0x80000000 /* b_new_cmd */
-/* keep these in sync with lnet/utils/debug.c and lnet/libcfs/debug.c */
+#define S_MGC          0x10000000
+#define S_MGS          0x20000000
+#define S_FID          0x40000000 /* b_new_cmd */
+#define S_FLD          0x80000000 /* b_new_cmd */
+
+#define LIBCFS_DEBUG_SUBSYS_NAMES {                                    \
+       "undefined", "mdc", "mds", "osc", "ost", "class", "log",        \
+       "llite", "rpc", "mgmt", "lnet", "lnd", "pinger", "filter", "",  \
+       "echo", "ldlm", "lov", "lquota", "osd", "lfsck", "", "", "lmv", \
+        "", "sec", "gss", "", "mgc", "mgs", "fid", "fld", NULL }
 
 /* Debugging masks (32 bits, non-overlapping) */
-/* keep these in sync with lnet/utils/debug.c and lnet/libcfs/debug.c */
-#define D_TRACE       0x00000001 /* ENTRY/EXIT markers */
-#define D_INODE       0x00000002
-#define D_SUPER       0x00000004
-#define D_EXT2        0x00000008 /* anything from ext2_debug */
-#define D_MALLOC      0x00000010 /* print malloc, free information */
-#define D_CACHE       0x00000020 /* cache-related items */
-#define D_INFO        0x00000040 /* general information */
-#define D_IOCTL       0x00000080 /* ioctl related information */
-#define D_NETERROR    0x00000100 /* network errors */
-#define D_NET         0x00000200 /* network communications */
-#define D_WARNING     0x00000400 /* CWARN(...) == CDEBUG (D_WARNING, ...) */
-#define D_BUFFS       0x00000800
-#define D_OTHER       0x00001000
-#define D_DENTRY      0x00002000
-#define D_NETTRACE    0x00004000
-#define D_PAGE        0x00008000 /* bulk page handling */
-#define D_DLMTRACE    0x00010000
-#define D_ERROR       0x00020000 /* CERROR(...) == CDEBUG (D_ERROR, ...) */
-#define D_EMERG       0x00040000 /* CEMERG(...) == CDEBUG (D_EMERG, ...) */
-#define D_HA          0x00080000 /* recovery and failover */
-#define D_RPCTRACE    0x00100000 /* for distributed debugging */
-#define D_VFSTRACE    0x00200000
-#define D_READA       0x00400000 /* read-ahead */
-#define D_MMAP        0x00800000
-#define D_CONFIG      0x01000000
-#define D_CONSOLE     0x02000000
-#define D_QUOTA       0x04000000
-#define D_SEC         0x08000000
-#define D_LFSCK              0x10000000 /* For both OI scrub and LFSCK */
-/* keep these in sync with lnet/{utils,libcfs}/debug.c */
-
-#define D_HSM         D_TRACE
+#define D_TRACE                0x00000001 /* ENTRY/EXIT markers */
+#define D_INODE                0x00000002
+#define D_SUPER                0x00000004
+#define D_EXT2         0x00000008 /* anything from ext2_debug */
+#define D_MALLOC       0x00000010 /* print malloc, free information */
+#define D_CACHE                0x00000020 /* cache-related items */
+#define D_INFO         0x00000040 /* general information */
+#define D_IOCTL                0x00000080 /* ioctl related information */
+#define D_NETERROR     0x00000100 /* network errors */
+#define D_NET          0x00000200 /* network communications */
+#define D_WARNING      0x00000400 /* CWARN(...) == CDEBUG (D_WARNING, ...) */
+#define D_BUFFS                0x00000800
+#define D_OTHER                0x00001000
+#define D_DENTRY       0x00002000
+#define D_NETTRACE     0x00004000
+#define D_PAGE         0x00008000 /* bulk page handling */
+#define D_DLMTRACE     0x00010000
+#define D_ERROR                0x00020000 /* CERROR(...) == CDEBUG (D_ERROR, ...) */
+#define D_EMERG                0x00040000 /* CEMERG(...) == CDEBUG (D_EMERG, ...) */
+#define D_HA           0x00080000 /* recovery and failover */
+#define D_RPCTRACE     0x00100000 /* for distributed debugging */
+#define D_VFSTRACE     0x00200000
+#define D_READA                0x00400000 /* read-ahead */
+#define D_MMAP         0x00800000
+#define D_CONFIG       0x01000000
+#define D_CONSOLE      0x02000000
+#define D_QUOTA                0x04000000
+#define D_SEC          0x08000000
+#define D_LFSCK                0x10000000 /* For both OI scrub and LFSCK */
+#define D_HSM          0x20000000
+
+#define LIBCFS_DEBUG_MASKS_NAMES {                                     \
+       "trace", "inode", "super", "ext2", "malloc", "cache", "info",   \
+       "ioctl", "neterror", "net", "warning", "buffs", "other",        \
+       "dentry", "nettrace", "page", "dlmtrace", "error", "emerg",     \
+       "ha", "rpctrace", "vfstrace", "reada", "mmap", "config",        \
+       "console", "quota", "sec", "lfsck", "hsm", NULL }
 
 #define D_CANTMASK   (D_ERROR | D_EMERG | D_WARNING | D_CONSOLE)
 
index bc5454c..cb72417 100644 (file)
@@ -124,134 +124,26 @@ int libcfs_panic_in_progress;
 
 /* libcfs_debug_token2mask() expects the returned
  * string in lower-case */
-const char *
-libcfs_debug_subsys2str(int subsys)
+const char *libcfs_debug_subsys2str(int subsys)
 {
-        switch (1 << subsys) {
-        default:
-                return NULL;
-        case S_UNDEFINED:
-                return "undefined";
-        case S_MDC:
-                return "mdc";
-        case S_MDS:
-                return "mds";
-        case S_OSC:
-                return "osc";
-        case S_OST:
-                return "ost";
-        case S_CLASS:
-                return "class";
-        case S_LOG:
-                return "log";
-        case S_LLITE:
-                return "llite";
-        case S_RPC:
-                return "rpc";
-        case S_LNET:
-                return "lnet";
-        case S_LND:
-                return "lnd";
-        case S_PINGER:
-                return "pinger";
-        case S_FILTER:
-                return "filter";
-        case S_ECHO:
-                return "echo";
-        case S_LDLM:
-                return "ldlm";
-        case S_LOV:
-                return "lov";
-        case S_LQUOTA:
-                return "lquota";
-       case S_OSD:
-               return "osd";
-       case S_LFSCK:
-               return "lfsck";
-        case S_LMV:
-                return "lmv";
-        case S_SEC:
-                return "sec";
-        case S_GSS:
-                return "gss";
-        case S_MGC:
-                return "mgc";
-        case S_MGS:
-                return "mgs";
-        case S_FID:
-                return "fid";
-        case S_FLD:
-                return "fld";
-        }
+       static const char *libcfs_debug_subsystems[] = LIBCFS_DEBUG_SUBSYS_NAMES;
+
+       if (subsys >= ARRAY_SIZE(libcfs_debug_subsystems))
+               return NULL;
+
+       return libcfs_debug_subsystems[subsys];
 }
 
 /* libcfs_debug_token2mask() expects the returned
  * string in lower-case */
-const char *
-libcfs_debug_dbg2str(int debug)
+const char *libcfs_debug_dbg2str(int debug)
 {
-        switch (1 << debug) {
-        default:
-                return NULL;
-        case D_TRACE:
-                return "trace";
-        case D_INODE:
-                return "inode";
-        case D_SUPER:
-                return "super";
-        case D_EXT2:
-                return "ext2";
-        case D_MALLOC:
-                return "malloc";
-        case D_CACHE:
-                return "cache";
-        case D_INFO:
-                return "info";
-        case D_IOCTL:
-                return "ioctl";
-        case D_NETERROR:
-                return "neterror";
-        case D_NET:
-                return "net";
-        case D_WARNING:
-                return "warning";
-        case D_BUFFS:
-                return "buffs";
-        case D_OTHER:
-                return "other";
-        case D_DENTRY:
-                return "dentry";
-        case D_NETTRACE:
-                return "nettrace";
-        case D_PAGE:
-                return "page";
-        case D_DLMTRACE:
-                return "dlmtrace";
-        case D_ERROR:
-                return "error";
-        case D_EMERG:
-                return "emerg";
-        case D_HA:
-                return "ha";
-        case D_RPCTRACE:
-                return "rpctrace";
-        case D_VFSTRACE:
-                return "vfstrace";
-        case D_READA:
-                return "reada";
-        case D_MMAP:
-                return "mmap";
-        case D_CONFIG:
-                return "config";
-        case D_CONSOLE:
-                return "console";
-        case D_QUOTA:
-                return "quota";
-        case D_SEC:
-                return "sec";
-       case D_LFSCK:
-               return "lfsck";
-       }
+       static const char *libcfs_debug_masks[] = LIBCFS_DEBUG_MASKS_NAMES;
+
+       if (debug >= ARRAY_SIZE(libcfs_debug_masks))
+               return NULL;
+
+       return libcfs_debug_masks[debug];
 }
 
 int
index 20a6ba4..91da09c 100644 (file)
@@ -56,23 +56,8 @@ static int debug_mask = ~0;
 
 #define MAX_MARK_SIZE 256
 
-static const char *libcfs_debug_subsystems[] =
-       {"undefined", "mdc", "mds", "osc",
-        "ost", "class", "log", "llite",
-        "rpc", "mgmt", "lnet", "lnd",
-        "pinger", "filter", "", "echo",
-        "ldlm", "lov", "lquota", "osd",
-        "lfsck", "", "", "lmv",
-        "", "sec", "gss", "",
-        "mgc", "mgs", "fid", "fld", NULL};
-static const char *libcfs_debug_masks[] =
-        {"trace", "inode", "super", "ext2",
-         "malloc", "cache", "info", "ioctl",
-         "neterror", "net", "warning", "buffs",
-         "other", "dentry", "nettrace", "page",
-         "dlmtrace", "error", "emerg", "ha",
-         "rpctrace", "vfstrace", "reada", "mmap",
-         "config", "console", "quota", "sec", NULL};
+static const char *libcfs_debug_subsystems[] = LIBCFS_DEBUG_SUBSYS_NAMES;
+static const char *libcfs_debug_masks[] = LIBCFS_DEBUG_MASKS_NAMES;
 
 #ifdef __linux__
 
index 719c8ac..ace571a 100644 (file)
@@ -1828,6 +1828,11 @@ out_rmdir:
                /* Compute the whole struct size */
                totalsize = hur_len(hur);
                OBD_FREE_PTR(hur);
+
+               /* Make sure the size is reasonable */
+               if (totalsize >= MDS_MAXREQSIZE)
+                       RETURN(-E2BIG);
+
                OBD_ALLOC_LARGE(hur, totalsize);
                if (hur == NULL)
                        RETURN(-ENOMEM);
index a82ff30..6e80b35 100644 (file)
@@ -899,7 +899,7 @@ int ll_lease_close(struct obd_client_handle *och, struct inode *inode,
                lock_res_and_lock(lock);
                cancelled = ldlm_is_cancel(lock);
                unlock_res_and_lock(lock);
-               ldlm_lock_put(lock);
+               LDLM_LOCK_PUT(lock);
        }
 
        CDEBUG(D_INODE, "lease for "DFID" broken? %d\n",
@@ -2521,7 +2521,7 @@ long ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                                        rc = och->och_flags &
                                                (FMODE_READ | FMODE_WRITE);
                                unlock_res_and_lock(lock);
-                               ldlm_lock_put(lock);
+                               LDLM_LOCK_PUT(lock);
                        }
                }
                mutex_unlock(&lli->lli_och_mutex);
index 3a4978b..9b0f7bf 100644 (file)
@@ -517,7 +517,7 @@ static void mdc_hsm_release_pack(struct ptlrpc_request *req,
                lock = ldlm_handle2lock(&op_data->op_lease_handle);
                if (lock != NULL) {
                        data->cd_handle = lock->l_remote_handle;
-                       ldlm_lock_put(lock);
+                       LDLM_LOCK_PUT(lock);
                }
                ldlm_cli_cancel(&op_data->op_lease_handle, LCF_LOCAL);
 
index a967c44..28eb0ca 100644 (file)
@@ -1966,7 +1966,7 @@ static int mdt_hsm_release(struct mdt_thread_info *info, struct mdt_object *o,
        /* try to hold open_sem so that nobody else can open the file */
        if (!down_write_trylock(&o->mot_open_sem)) {
                ldlm_lock_cancel(lease);
-               ldlm_lock_put(lease);
+               LDLM_LOCK_PUT(lease);
                RETURN(-EBUSY);
        }
 
@@ -1982,7 +1982,7 @@ static int mdt_hsm_release(struct mdt_thread_info *info, struct mdt_object *o,
         * have been cancelled. It's okay to cancel it now as we've
         * held mot_open_sem. */
        ldlm_lock_cancel(lease);
-       ldlm_lock_put(lease);
+       LDLM_LOCK_PUT(lease);
 
        if (lease_broken) /* don't perform release task */
                GOTO(out_unlock, rc = -ESTALE);