Whamcloud - gitweb
LU-5710 all: second batch of corrected typos and grammar errors
[fs/lustre-release.git] / lustre / include / lustre_dlm.h
index 5ad5f9b..1935e2f 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2010, 2012, Intel Corporation.
+ * Copyright (c) 2010, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #ifndef _LUSTRE_DLM_H__
 #define _LUSTRE_DLM_H__
 
-#if defined(__linux__)
-#include <linux/lustre_dlm.h>
-#elif defined(__APPLE__)
-#include <darwin/lustre_dlm.h>
-#elif defined(__WINNT__)
-#include <winnt/lustre_dlm.h>
-#else
-#error Unsupported operating system.
-#endif
-
 #include <lustre_lib.h>
 #include <lustre_net.h>
 #include <lustre_import.h>
 #include <interval_tree.h> /* for interval_node{}, ldlm_extent */
 #include <lu_ref.h>
 
+#include "lustre_dlm_flags.h"
+
 struct obd_ops;
 struct obd_device;
 
 #define OBD_LDLM_DEVICENAME  "ldlm"
 
-#ifdef HAVE_BGL_SUPPORT
-/* 1.5 times the maximum 128 tasks available in VN mode */
-#define LDLM_DEFAULT_LRU_SIZE 196
-#else
-#define LDLM_DEFAULT_LRU_SIZE (100 * cfs_num_online_cpus())
-#endif
+#define LDLM_DEFAULT_LRU_SIZE (100 * num_online_cpus())
 #define LDLM_DEFAULT_MAX_ALIVE (cfs_time_seconds(36000))
 #define LDLM_CTIME_AGE_LIMIT (10)
 #define LDLM_DEFAULT_PARALLEL_AST_LIMIT 1024
@@ -85,6 +72,7 @@ struct obd_device;
  */
 typedef enum {
         ELDLM_OK = 0,
+       ELDLM_LOCK_MATCHED = 1,
 
         ELDLM_LOCK_CHANGED = 300,
         ELDLM_LOCK_ABORTED = 301,
@@ -109,161 +97,6 @@ typedef enum {
 } ldlm_side_t;
 
 /**
- * Declaration of flags sent through the wire.
- **/
-#define LDLM_FL_LOCK_CHANGED   0x000001 /* extent, mode, or resource changed */
-
-/**
- * If the server returns one of these flags, then the lock was put on that list.
- * If the client sends one of these flags (during recovery ONLY!), it wants the
- * lock added to the specified list, no questions asked.
- */
-#define LDLM_FL_BLOCK_GRANTED  0x000002
-#define LDLM_FL_BLOCK_CONV     0x000004
-#define LDLM_FL_BLOCK_WAIT     0x000008
-
-/* Used to be LDLM_FL_CBPENDING 0x000010 moved to non-wire flags */
-
-#define LDLM_FL_AST_SENT       0x000020 /* blocking or cancel packet was
-                                         * queued for sending. */
-/* Used to be LDLM_FL_WAIT_NOREPROC 0x000040   moved to non-wire flags */
-/* Used to be LDLM_FL_CANCEL        0x000080   moved to non-wire flags */
-
-/**
- * Lock is being replayed.  This could probably be implied by the fact that one
- * of BLOCK_{GRANTED,CONV,WAIT} is set, but that is pretty dangerous.
- */
-#define LDLM_FL_REPLAY         0x000100
-
-#define LDLM_FL_INTENT_ONLY    0x000200 /* Don't grant lock, just do intent. */
-
-/* Used to be LDLM_FL_LOCAL_ONLY 0x000400  moved to non-wire flags */
-/* Used to be LDLM_FL_FAILED     0x000800  moved to non-wire flags */
-
-#define LDLM_FL_HAS_INTENT     0x001000 /* lock request has intent */
-
-/* Used to be LDLM_FL_CANCELING  0x002000  moved to non-wire flags */
-/* Used to be LDLM_FL_LOCAL      0x004000  moved to non-wire flags */
-
-#define LDLM_FL_DISCARD_DATA   0x010000 /* discard (no writeback) on cancel */
-
-#define LDLM_FL_NO_TIMEOUT     0x020000 /* Blocked by group lock - wait
-                                         * indefinitely */
-
-/** file & record locking */
-#define LDLM_FL_BLOCK_NOWAIT   0x040000 /* Server told not to wait if blocked.
-                                         * For AGL, OST will not send glimpse
-                                         * callback. */
-#define LDLM_FL_TEST_LOCK      0x080000 // return blocking lock
-
-/* Used to be LDLM_FL_LVB_READY  0x100000 moved to non-wire flags */
-/* Used to be LDLM_FL_KMS_IGNORE 0x200000 moved to non-wire flags */
-/* Used to be LDLM_FL_NO_LRU     0x400000 moved to non-wire flags */
-
-/* Immediatelly cancel such locks when they block some other locks. Send
- * cancel notification to original lock holder, but expect no reply. This is
- * for clients (like liblustre) that cannot be expected to reliably response
- * to blocking AST. */
-#define LDLM_FL_CANCEL_ON_BLOCK 0x800000
-
-/* Flags flags inherited from parent lock when doing intents. */
-#define LDLM_INHERIT_FLAGS     (LDLM_FL_CANCEL_ON_BLOCK)
-
-/* Used to be LDLM_FL_CP_REQD        0x1000000 moved to non-wire flags */
-/* Used to be LDLM_FL_CLEANED        0x2000000 moved to non-wire flags */
-/* Used to be LDLM_FL_ATOMIC_CB      0x4000000 moved to non-wire flags */
-/* Used to be LDLM_FL_BL_AST         0x10000000 moved to non-wire flags */
-/* Used to be LDLM_FL_BL_DONE        0x20000000 moved to non-wire flags */
-
-/* measure lock contention and return -EUSERS if locking contention is high */
-#define LDLM_FL_DENY_ON_CONTENTION 0x40000000
-
-/* These are flags that are mapped into the flags and ASTs of blocking locks */
-#define LDLM_AST_DISCARD_DATA  0x80000000 /* Add FL_DISCARD to blocking ASTs */
-
-/* Flags sent in AST lock_flags to be mapped into the receiving lock. */
-#define LDLM_AST_FLAGS         (LDLM_FL_DISCARD_DATA)
-
-/*
- * --------------------------------------------------------------------------
- * NOTE! Starting from this point, that is, LDLM_FL_* flags with values above
- * 0x80000000 will not be sent over the wire.
- * --------------------------------------------------------------------------
- */
-
-/**
- * Declaration of flags not sent through the wire.
- **/
-
-/**
- * Used for marking lock as a target for -EINTR while cp_ast sleep
- * emulation + race with upcoming bl_ast.
- */
-#define LDLM_FL_FAIL_LOC       0x100000000ULL
-
-/**
- * Used while processing the unused list to know that we have already
- * handled this lock and decided to skip it.
- */
-#define LDLM_FL_SKIPPED        0x200000000ULL
-/* this lock is being destroyed */
-#define LDLM_FL_CBPENDING      0x400000000ULL
-/* not a real flag, not saved in lock */
-#define LDLM_FL_WAIT_NOREPROC  0x800000000ULL
-/* cancellation callback already run */
-#define LDLM_FL_CANCEL         0x1000000000ULL
-#define LDLM_FL_LOCAL_ONLY     0x2000000000ULL
-/* don't run the cancel callback under ldlm_cli_cancel_unused */
-#define LDLM_FL_FAILED         0x4000000000ULL
-/* lock cancel has already been sent */
-#define LDLM_FL_CANCELING      0x8000000000ULL
-/* local lock (ie, no srv/cli split) */
-#define LDLM_FL_LOCAL          0x10000000000ULL
-/* XXX FIXME: This is being added to b_size as a low-risk fix to the fact that
- * the LVB filling happens _after_ the lock has been granted, so another thread
- * can match it before the LVB has been updated.  As a dirty hack, we set
- * LDLM_FL_LVB_READY only after we've done the LVB poop.
- * this is only needed on LOV/OSC now, where LVB is actually used and callers
- * must set it in input flags.
- *
- * The proper fix is to do the granting inside of the completion AST, which can
- * be replaced with a LVB-aware wrapping function for OSC locks.  That change is
- * pretty high-risk, though, and would need a lot more testing. */
-#define LDLM_FL_LVB_READY      0x20000000000ULL
-/* A lock contributes to the known minimum size (KMS) calculation until it has
- * finished the part of its cancelation that performs write back on its dirty
- * pages.  It can remain on the granted list during this whole time.  Threads
- * racing to update the KMS after performing their writeback need to know to
- * exclude each other's locks from the calculation as they walk the granted
- * list. */
-#define LDLM_FL_KMS_IGNORE     0x40000000000ULL
-/* completion AST to be executed */
-#define LDLM_FL_CP_REQD        0x80000000000ULL
-/* cleanup_resource has already handled the lock */
-#define LDLM_FL_CLEANED        0x100000000000ULL
-/* optimization hint: LDLM can run blocking callback from current context
- * w/o involving separate thread. in order to decrease cs rate */
-#define LDLM_FL_ATOMIC_CB      0x200000000000ULL
-
-/* It may happen that a client initiates two operations, e.g. unlink and
- * mkdir, such that the server sends a blocking AST for conflicting
- * locks to this client for the first operation, whereas the second
- * operation has canceled this lock and is waiting for rpc_lock which is
- * taken by the first operation. LDLM_FL_BL_AST is set by
- * ldlm_callback_handler() in the lock to prevent the Early Lock Cancel
- * (ELC) code from cancelling it.
- *
- * LDLM_FL_BL_DONE is to be set by ldlm_cancel_callback() when lock
- * cache is dropped to let ldlm_callback_handler() return EINVAL to the
- * server. It is used when ELC RPC is already prepared and is waiting
- * for rpc_lock, too late to send a separate CANCEL RPC. */
-#define LDLM_FL_BL_AST          0x400000000000ULL
-#define LDLM_FL_BL_DONE         0x800000000000ULL
-/* Don't put lock into the LRU list, so that it is not canceled due to aging.
- * Used by MGC locks, they are cancelled only at unmount or by callback. */
-#define LDLM_FL_NO_LRU         0x1000000000000ULL
-
-/**
  * The blocking callback is overloaded to perform two functions.  These flags
  * indicate which operation should be performed.
  */
@@ -377,8 +210,7 @@ struct ldlm_pool_ops {
        /** Recalculate pool \a pl usage */
        int (*po_recalc)(struct ldlm_pool *pl);
        /** Cancel at least \a nr locks from pool \a pl */
-       int (*po_shrink)(struct ldlm_pool *pl, int nr,
-                        unsigned int gfp_mask);
+       int (*po_shrink)(struct ldlm_pool *pl, int nr, gfp_t gfp_mask);
        int (*po_setup)(struct ldlm_pool *pl, int limit);
 };
 
@@ -401,26 +233,26 @@ struct ldlm_pool_ops {
  */
 struct ldlm_pool {
        /** Pool proc directory. */
-       cfs_proc_dir_entry_t    *pl_proc_dir;
+       struct proc_dir_entry   *pl_proc_dir;
        /** Pool name, must be long enough to hold compound proc entry name. */
        char                    pl_name[100];
        /** Lock for protecting SLV/CLV updates. */
        spinlock_t              pl_lock;
        /** Number of allowed locks in in pool, both, client and server side. */
-       cfs_atomic_t            pl_limit;
+       atomic_t                pl_limit;
        /** Number of granted locks in */
-       cfs_atomic_t            pl_granted;
+       atomic_t                pl_granted;
        /** Grant rate per T. */
-       cfs_atomic_t            pl_grant_rate;
+       atomic_t                pl_grant_rate;
        /** Cancel rate per T. */
-       cfs_atomic_t            pl_cancel_rate;
+       atomic_t                pl_cancel_rate;
        /** Server lock volume (SLV). Protected by pl_lock. */
        __u64                   pl_server_lock_volume;
        /** Current biggest client lock volume. Protected by pl_lock. */
        __u64                   pl_client_lock_volume;
        /** Lock volume factor. SLV on client is calculated as following:
         *  server_slv * lock_volume_factor. */
-       cfs_atomic_t            pl_lock_volume_factor;
+       atomic_t                pl_lock_volume_factor;
        /** Time when last SLV from server was obtained. */
        time_t                  pl_recalc_time;
        /** Recalculation period for pool. */
@@ -437,7 +269,7 @@ typedef int (*ldlm_res_policy)(struct ldlm_namespace *, struct ldlm_lock **,
                               void *req_cookie, ldlm_mode_t mode, __u64 flags,
                               void *data);
 
-typedef int (*ldlm_cancel_for_recovery)(struct ldlm_lock *lock);
+typedef int (*ldlm_cancel_cbt)(struct ldlm_lock *lock);
 
 /**
  * LVB operations.
@@ -448,6 +280,9 @@ typedef int (*ldlm_cancel_for_recovery)(struct ldlm_lock *lock);
  * Currently LVBs are used by:
  *  - OSC-OST code to maintain current object size/times
  *  - layout lock code to return the layout when the layout lock is granted
+ *
+ * To ensure delayed LVB initialization, it is highly recommended to use the set
+ * of ldlm_[res_]lvbo_[init,update,fill]() functions.
  */
 struct ldlm_valblock_ops {
         int (*lvbo_init)(struct ldlm_resource *res);
@@ -547,7 +382,7 @@ struct ldlm_namespace {
        spinlock_t              ns_lock;
 
        /** big refcount (by bucket) */
-       cfs_atomic_t            ns_bref;
+       atomic_t                ns_bref;
 
        /**
         * Namespace connect flags supported by server (may be changed via
@@ -558,11 +393,14 @@ struct ldlm_namespace {
        /** Client side original connect flags supported by server. */
        __u64                   ns_orig_connect_flags;
 
+       /* namespace proc dir entry */
+       struct proc_dir_entry   *ns_proc_dir_entry;
+
        /**
         * Position in global namespace list linking all namespaces on
         * the node.
         */
-       cfs_list_t              ns_list_chain;
+       struct list_head        ns_list_chain;
 
        /**
         * List of unused locks for this namespace. This list is also called
@@ -574,7 +412,7 @@ struct ldlm_namespace {
         * to release from the head of this list.
         * Locks are linked via l_lru field in \see struct ldlm_lock.
         */
-       cfs_list_t              ns_unused_list;
+       struct list_head        ns_unused_list;
        /** Number of locks in the LRU list above */
        int                     ns_nr_unused;
 
@@ -625,7 +463,7 @@ struct ldlm_namespace {
         * Wait queue used by __ldlm_namespace_free. Gets woken up every time
         * a resource is removed.
         */
-       cfs_waitq_t             ns_waitq;
+       wait_queue_head_t       ns_waitq;
        /** LDLM pool structure for this namespace */
        struct ldlm_pool        ns_pool;
        /** Definition of how eagerly unused locks will be released from LRU */
@@ -655,8 +493,11 @@ struct ldlm_namespace {
        /** Limit of parallel AST RPC count. */
        unsigned                ns_max_parallel_ast;
 
-       /** Callback to cancel locks before replaying it during recovery. */
-       ldlm_cancel_for_recovery ns_cancel_for_recovery;
+       /**
+        * Callback to check if a lock is good to be canceled by ELC or
+        * during recovery.
+        */
+       ldlm_cancel_cbt         ns_cancel;
 
        /** LDLM lock stats */
        struct lprocfs_stats    *ns_stats;
@@ -713,10 +554,10 @@ static inline int ns_connect_lru_resize(struct ldlm_namespace *ns)
 }
 
 static inline void ns_register_cancel(struct ldlm_namespace *ns,
-                                      ldlm_cancel_for_recovery arg)
+                                     ldlm_cancel_cbt arg)
 {
-        LASSERT(ns != NULL);
-        ns->ns_cancel_for_recovery = arg;
+       LASSERT(ns != NULL);
+       ns->ns_cancel = arg;
 }
 
 struct ldlm_lock;
@@ -730,13 +571,11 @@ typedef int (*ldlm_completion_callback)(struct ldlm_lock *lock, __u64 flags,
                                        void *data);
 /** Type for glimpse callback function of a lock. */
 typedef int (*ldlm_glimpse_callback)(struct ldlm_lock *lock, void *data);
-/** Type for weight callback function of a lock. */
-typedef unsigned long (*ldlm_weigh_callback)(struct ldlm_lock *lock);
 
 /** Work list for sending GL ASTs to multiple locks. */
 struct ldlm_glimpse_work {
        struct ldlm_lock        *gl_lock; /* lock to glimpse */
-       cfs_list_t               gl_list; /* linkage to other gl work structs */
+       struct list_head         gl_list; /* linkage to other gl work structs */
        __u32                    gl_flags;/* see LDLM_GL_WORK_* below */
        union ldlm_gl_desc      *gl_desc; /* glimpse descriptor to be packed in
                                           * glimpse callback request */
@@ -748,7 +587,7 @@ struct ldlm_glimpse_work {
 /** Interval node data for each LDLM_EXTENT lock. */
 struct ldlm_interval {
        struct interval_node    li_node;  /* node for tree management */
-       cfs_list_t              li_group; /* the locks which have the same
+       struct list_head        li_group; /* the locks which have the same
                                           * policy - group of the policy */
 };
 #define to_ldlm_interval(n) container_of(n, struct ldlm_interval, li_node)
@@ -788,11 +627,13 @@ struct ldlm_flock {
         __u32 pid;
 };
 
-typedef union {
-        struct ldlm_extent l_extent;
-        struct ldlm_flock l_flock;
-        struct ldlm_inodebits l_inodebits;
-} ldlm_policy_data_t;
+union ldlm_policy_data {
+       struct ldlm_extent l_extent;
+       struct ldlm_flock l_flock;
+       struct ldlm_inodebits l_inodebits;
+};
+
+typedef union ldlm_policy_data ldlm_policy_data_t;
 
 void ldlm_convert_policy_to_wire(ldlm_type_t type,
                                  const ldlm_policy_data_t *lpolicy,
@@ -809,6 +650,11 @@ enum lvb_type {
 };
 
 /**
+ * LDLM_GID_ANY is used to match any group id in ldlm_lock_match().
+ */
+#define LDLM_GID_ANY  ((__u64)-1)
+
+/**
  * LDLM lock structure
  *
  * Represents a single LDLM lock and its state in memory. Each lock is
@@ -835,7 +681,7 @@ struct ldlm_lock {
         * This is how many users have pointers to actual structure, so that
         * we do not accidentally free lock structure that is in use.
         */
-       cfs_atomic_t            l_refc;
+       atomic_t                l_refc;
        /**
         * Internal spinlock protects l_resource.  We should hold this lock
         * first before taking res_lock.
@@ -850,13 +696,13 @@ struct ldlm_lock {
         * List item for client side LRU list.
         * Protected by ns_lock in struct ldlm_namespace.
         */
-       cfs_list_t              l_lru;
+       struct list_head        l_lru;
        /**
         * Linkage to resource's lock queues according to current lock state.
         * (could be granted, waiting or converting)
         * Protected by lr_lock in struct ldlm_resource.
         */
-       cfs_list_t              l_res_link;
+       struct list_head        l_res_link;
        /**
         * Tree node for ldlm_extent.
         */
@@ -865,12 +711,12 @@ struct ldlm_lock {
         * Per export hash of locks.
         * Protected by per-bucket exp->exp_lock_hash locks.
         */
-       cfs_hlist_node_t        l_exp_hash;
+       struct hlist_node       l_exp_hash;
        /**
         * Per export hash of flock locks.
         * Protected by per-bucket exp->exp_flock_hash locks.
         */
-       cfs_hlist_node_t        l_exp_flock_hash;
+       struct hlist_node       l_exp_flock_hash;
        /**
         * Requested mode.
         * Protected by lr_lock.
@@ -900,9 +746,6 @@ struct ldlm_lock {
         */
        ldlm_glimpse_callback   l_glimpse_ast;
 
-       /** XXX apparently unused "weight" handler. To be removed? */
-       ldlm_weigh_callback     l_weigh_ast;
-
        /**
         * Lock export.
         * This is a pointer to actual client export for locks that were granted
@@ -929,11 +772,11 @@ struct ldlm_lock {
        ldlm_policy_data_t      l_policy_data;
 
        /**
-        * Lock state flags.
-        * Like whenever we receive any blocking requests for this lock, etc.
-        * Protected by lr_lock.
+        * Lock state flags. Protected by lr_lock.
+        * \see lustre_dlm_flags.h where the bits are defined.
         */
        __u64                   l_flags;
+
        /**
         * Lock r/w usage counters.
         * Protected by lr_lock.
@@ -945,7 +788,7 @@ struct ldlm_lock {
         * it's no longer in use.  If the lock is not granted, a process sleeps
         * on this waitq to learn when it becomes granted.
         */
-       cfs_waitq_t             l_waitq;
+       wait_queue_head_t       l_waitq;
 
        /**
         * Seconds. It will be updated if there is any activity related to
@@ -962,34 +805,6 @@ struct ldlm_lock {
        /** Originally requested extent for the extent lock. */
        struct ldlm_extent      l_req_extent;
 
-       unsigned int            l_failed:1,
-       /**
-        * Set for locks that were removed from class hash table and will be
-        * destroyed when last reference to them is released. Set by
-        * ldlm_lock_destroy_internal().
-        *
-        * Protected by lock and resource locks.
-        */
-                               l_destroyed:1,
-       /*
-        * it's set in lock_res_and_lock() and unset in unlock_res_and_lock().
-        *
-        * NB: compared with check_res_locked(), checking this bit is cheaper.
-        * Also, spin_is_locked() is deprecated for kernel code; one reason is
-        * because it works only for SMP so user needs to add extra macros like
-        * LASSERT_SPIN_LOCKED for uniprocessor kernels.
-        */
-                               l_res_locked:1,
-       /*
-        * It's set once we call ldlm_add_waiting_lock_res_locked()
-        * to start the lock-timeout timer and it will never be reset.
-        *
-        * Protected by lock_res_and_lock().
-        */
-                               l_waited:1,
-       /** Flag whether this is a server namespace lock. */
-                               l_ns_srv:1;
-
        /*
         * Client-side-only members.
         */
@@ -1024,7 +839,7 @@ struct ldlm_lock {
         * expired_lock_thread.elt_expired_locks for further processing.
         * Protected by elt_lock.
         */
-       cfs_list_t              l_pending_chain;
+       struct list_head        l_pending_chain;
 
        /**
         * Set when lock is sent a blocking AST. Time in seconds when timeout
@@ -1046,11 +861,11 @@ struct ldlm_lock {
         */
        int                     l_bl_ast_run;
        /** List item ldlm_add_ast_work_item() for case of blocking ASTs. */
-       cfs_list_t              l_bl_ast;
+       struct list_head        l_bl_ast;
        /** List item ldlm_add_ast_work_item() for case of completion ASTs. */
-       cfs_list_t              l_cp_ast;
+       struct list_head        l_cp_ast;
        /** For ldlm_add_ast_work_item() for "revoke" AST used in COS. */
-       cfs_list_t              l_rk_ast;
+       struct list_head        l_rk_ast;
 
        /**
         * Pointer to a conflicting lock that caused blocking AST to be sent
@@ -1062,8 +877,8 @@ struct ldlm_lock {
         * Protected by lr_lock, linkages to "skip lists".
         * For more explanations of skip lists see ldlm/ldlm_inodebits.c
         */
-       cfs_list_t              l_sl_mode;
-       cfs_list_t              l_sl_policy;
+       struct list_head        l_sl_mode;
+       struct list_head        l_sl_policy;
 
        /** Reference tracking structure to debug leaked locks. */
        struct lu_ref           l_reference;
@@ -1072,7 +887,7 @@ struct ldlm_lock {
        /** number of export references taken */
        int                     l_exp_refs_nr;
        /** link all locks referencing one export */
-       cfs_list_t              l_exp_refs_link;
+       struct list_head        l_exp_refs_link;
        /** referenced export object */
        struct obd_export       *l_exp_refs_target;
 #endif
@@ -1082,7 +897,7 @@ struct ldlm_lock {
         * Lock order of waiting_lists_spinlock, exp_bl_list_lock and res lock
         * is: res lock -> exp_bl_list_lock -> wanting_lists_spinlock.
         */
-       cfs_list_t              l_exp_list;
+       struct list_head        l_exp_list;
 };
 
 /**
@@ -1103,7 +918,7 @@ struct ldlm_resource {
         * List item for list in namespace hash.
         * protected by ns_lock
         */
-       cfs_hlist_node_t        lr_hash;
+       struct hlist_node       lr_hash;
 
        /** Spinlock to protect locks under this resource. */
        spinlock_t              lr_lock;
@@ -1112,13 +927,13 @@ struct ldlm_resource {
         * protected by lr_lock
         * @{ */
        /** List of locks in granted state */
-       cfs_list_t              lr_granted;
+       struct list_head        lr_granted;
        /** List of locks waiting to change their granted mode (converted) */
-       cfs_list_t              lr_converting;
+       struct list_head        lr_converting;
        /**
         * List of locks that could not be granted due to conflicts and
         * that are waiting for conflicts to go away */
-       cfs_list_t              lr_waiting;
+       struct list_head        lr_waiting;
        /** @} */
 
        /* XXX No longer needed? Remove ASAP */
@@ -1130,7 +945,7 @@ struct ldlm_resource {
        /** Resource name */
        struct ldlm_res_id      lr_name;
        /** Reference count for this resource */
-       cfs_atomic_t            lr_refcount;
+       atomic_t                lr_refcount;
 
        /**
         * Interval trees (only for extent locks) for all modes of this resource
@@ -1142,7 +957,9 @@ struct ldlm_resource {
         * To serialize lvbo_init.
         */
        struct mutex            lr_lvb_mutex;
-       __u32                   lr_lvb_len;
+       int                     lr_lvb_len;
+       /** is lvb initialized ? */
+       bool                    lr_lvb_initialized;
        /** protected by lr_lock */
        void                    *lr_lvb_data;
 
@@ -1193,11 +1010,32 @@ ldlm_lock_to_ns_at(struct ldlm_lock *lock)
 static inline int ldlm_lvbo_init(struct ldlm_resource *res)
 {
        struct ldlm_namespace *ns = ldlm_res_to_ns(res);
+       int rc = 0;
 
-       if (ns->ns_lvbo != NULL && ns->ns_lvbo->lvbo_init != NULL)
-               return ns->ns_lvbo->lvbo_init(res);
+       if (ns->ns_lvbo == NULL || ns->ns_lvbo->lvbo_init == NULL ||
+           res->lr_lvb_initialized)
+               return 0;
 
-       return 0;
+       mutex_lock(&res->lr_lvb_mutex);
+       /* Did we lose the race? */
+       if (res->lr_lvb_initialized) {
+               mutex_unlock(&res->lr_lvb_mutex);
+               return 0;
+       }
+       rc = ns->ns_lvbo->lvbo_init(res);
+       if (rc < 0) {
+               CDEBUG(D_DLMTRACE, "lvbo_init failed for resource : rc = %d\n",
+                      rc);
+               if (res->lr_lvb_data != NULL) {
+                       OBD_FREE(res->lr_lvb_data, res->lr_lvb_len);
+                       res->lr_lvb_data = NULL;
+               }
+               res->lr_lvb_len = rc;
+       } else {
+               res->lr_lvb_initialized = true;
+       }
+       mutex_unlock(&res->lr_lvb_mutex);
+       return rc;
 }
 
 static inline int ldlm_lvbo_size(struct ldlm_lock *lock)
@@ -1213,22 +1051,30 @@ static inline int ldlm_lvbo_size(struct ldlm_lock *lock)
 static inline int ldlm_lvbo_fill(struct ldlm_lock *lock, void *buf, int len)
 {
        struct ldlm_namespace *ns = ldlm_lock_to_ns(lock);
+       int rc;
 
        if (ns->ns_lvbo != NULL) {
                LASSERT(ns->ns_lvbo->lvbo_fill != NULL);
+               /* init lvb now if not already */
+               rc = ldlm_lvbo_init(lock->l_resource);
+               if (rc < 0) {
+                       CERROR("lock %p: delayed lvb init failed (rc %d)",
+                              lock, rc);
+                       return rc;
+               }
                return ns->ns_lvbo->lvbo_fill(lock, buf, len);
        }
        return 0;
 }
 
 struct ldlm_ast_work {
-        struct ldlm_lock      *w_lock;
-        int                    w_blocking;
-        struct ldlm_lock_desc  w_desc;
-        cfs_list_t             w_list;
-        int                    w_flags;
-        void                  *w_data;
-        int                    w_datalen;
+       struct ldlm_lock       *w_lock;
+       int                     w_blocking;
+       struct ldlm_lock_desc   w_desc;
+       struct list_head        w_list;
+       int                     w_flags;
+       void                   *w_data;
+       int                     w_datalen;
 };
 
 /**
@@ -1240,10 +1086,12 @@ struct ldlm_enqueue_info {
        void *ei_cb_bl;  /** blocking lock callback */
        void *ei_cb_cp;  /** lock completion callback */
        void *ei_cb_gl;  /** lock glimpse callback */
-       void *ei_cb_wg;  /** lock weigh callback */
        void *ei_cbdata; /** Data to be passed into callbacks. */
+       unsigned int ei_enq_slave:1; /* whether enqueue slave stripes */
 };
 
+#define ei_res_id      ei_cb_gl
+
 extern struct obd_ops ldlm_obd_ops;
 
 extern char *ldlm_lockname[];
@@ -1306,8 +1154,8 @@ void _ldlm_lock_debug(struct ldlm_lock *lock,
 #endif
 
 typedef int (*ldlm_processing_policy)(struct ldlm_lock *lock, __u64 *flags,
-                                      int first_enq, ldlm_error_t *err,
-                                      cfs_list_t *work_list);
+                                     int first_enq, ldlm_error_t *err,
+                                     struct list_head *work_list);
 
 /**
  * Return values for lock iterators.
@@ -1344,7 +1192,6 @@ struct ldlm_callback_suite {
         ldlm_completion_callback lcs_completion;
         ldlm_blocking_callback   lcs_blocking;
         ldlm_glimpse_callback    lcs_glimpse;
-        ldlm_weigh_callback      lcs_weigh;
 };
 
 /* ldlm_lockd.c */
@@ -1358,7 +1205,8 @@ int ldlm_server_blocking_ast(struct ldlm_lock *, struct ldlm_lock_desc *,
                             void *data, int flag);
 int ldlm_server_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data);
 int ldlm_server_glimpse_ast(struct ldlm_lock *lock, void *data);
-int ldlm_glimpse_locks(struct ldlm_resource *res, cfs_list_t *gl_work_list);
+int ldlm_glimpse_locks(struct ldlm_resource *res,
+                      struct list_head *gl_work_list);
 /** @} ldlm_srv_ast */
 
 /** \defgroup ldlm_handlers Server LDLM handlers
@@ -1376,10 +1224,12 @@ int ldlm_handle_convert0(struct ptlrpc_request *req,
                          const struct ldlm_request *dlm_req);
 int ldlm_handle_cancel(struct ptlrpc_request *req);
 int ldlm_request_cancel(struct ptlrpc_request *req,
-                        const struct ldlm_request *dlm_req, int first);
+                       const struct ldlm_request *dlm_req,
+                       int first, enum lustre_at_flags flags);
 /** @} ldlm_handlers */
 
 void ldlm_revoke_export_locks(struct obd_export *exp);
+unsigned int ldlm_bl_timeout(struct ldlm_lock *lock);
 #endif
 int ldlm_del_waiting_lock(struct ldlm_lock *lock);
 int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout);
@@ -1410,7 +1260,7 @@ static inline struct ldlm_lock *ldlm_handle2lock(const struct lustre_handle *h)
 }
 
 #define LDLM_LOCK_REF_DEL(lock) \
-        lu_ref_del(&lock->l_reference, "handle", cfs_current())
+       lu_ref_del(&lock->l_reference, "handle", current)
 
 static inline struct ldlm_lock *
 ldlm_handle2lock_long(const struct lustre_handle *h, __u64 flags)
@@ -1425,11 +1275,20 @@ ldlm_handle2lock_long(const struct lustre_handle *h, __u64 flags)
 
 /**
  * Update Lock Value Block Operations (LVBO) on a resource taking into account
- * data from reqest \a r
+ * data from request \a r
  */
 static inline int ldlm_res_lvbo_update(struct ldlm_resource *res,
                                        struct ptlrpc_request *r, int increase)
 {
+       int rc;
+
+       /* delayed lvb init may be required */
+       rc = ldlm_lvbo_init(res);
+       if (rc < 0) {
+               CERROR("delayed lvb init failed (rc %d)\n", rc);
+               return rc;
+       }
+
         if (ldlm_res_to_ns(res)->ns_lvbo &&
             ldlm_res_to_ns(res)->ns_lvbo->lvbo_update) {
                 return ldlm_res_to_ns(res)->ns_lvbo->lvbo_update(res, r,
@@ -1473,17 +1332,17 @@ do {                                            \
         lock;                                   \
 })
 
-#define ldlm_lock_list_put(head, member, count)                     \
-({                                                                  \
-        struct ldlm_lock *_lock, *_next;                            \
-        int c = count;                                              \
-        cfs_list_for_each_entry_safe(_lock, _next, head, member) {  \
-                if (c-- == 0)                                       \
-                        break;                                      \
-                cfs_list_del_init(&_lock->member);                  \
-                LDLM_LOCK_RELEASE(_lock);                           \
-        }                                                           \
-        LASSERT(c <= 0);                                            \
+#define ldlm_lock_list_put(head, member, count)                        \
+({                                                             \
+       struct ldlm_lock *_lock, *_next;                        \
+       int c = count;                                          \
+       list_for_each_entry_safe(_lock, _next, head, member) {  \
+               if (c-- == 0)                                   \
+                       break;                                  \
+               list_del_init(&_lock->member);                  \
+               LDLM_LOCK_RELEASE(_lock);                       \
+       }                                                       \
+       LASSERT(c <= 0);                                        \
 })
 
 struct ldlm_lock *ldlm_lock_get(struct ldlm_lock *lock);
@@ -1523,12 +1382,10 @@ void ldlm_namespace_free(struct ldlm_namespace *ns,
                          struct obd_import *imp, int force);
 void ldlm_namespace_register(struct ldlm_namespace *ns, ldlm_side_t client);
 void ldlm_namespace_unregister(struct ldlm_namespace *ns, ldlm_side_t client);
-void ldlm_namespace_move_locked(struct ldlm_namespace *ns, ldlm_side_t client);
-struct ldlm_namespace *ldlm_namespace_first_locked(ldlm_side_t client);
 void ldlm_namespace_get(struct ldlm_namespace *ns);
 void ldlm_namespace_put(struct ldlm_namespace *ns);
 int ldlm_proc_setup(void);
-#ifdef LPROCFS
+#ifdef CONFIG_PROC_FS
 void ldlm_proc_cleanup(void);
 #else
 static inline void ldlm_proc_cleanup(void) {}
@@ -1542,8 +1399,8 @@ struct ldlm_resource *ldlm_resource_get(struct ldlm_namespace *ns,
 struct ldlm_resource *ldlm_resource_getref(struct ldlm_resource *res);
 int ldlm_resource_putref(struct ldlm_resource *res);
 void ldlm_resource_add_lock(struct ldlm_resource *res,
-                            cfs_list_t *head,
-                            struct ldlm_lock *lock);
+                           struct list_head *head,
+                           struct ldlm_lock *lock);
 void ldlm_resource_unlink_lock(struct ldlm_lock *lock);
 void ldlm_res2desc(struct ldlm_resource *res, struct ldlm_resource_desc *desc);
 void ldlm_dump_all_namespaces(ldlm_side_t client, int level);
@@ -1553,11 +1410,11 @@ int ldlm_lock_change_resource(struct ldlm_namespace *, struct ldlm_lock *,
                               const struct ldlm_res_id *);
 
 #define LDLM_RESOURCE_ADDREF(res) do {                                  \
-        lu_ref_add_atomic(&(res)->lr_reference, __FUNCTION__, cfs_current());  \
+       lu_ref_add_atomic(&(res)->lr_reference, __FUNCTION__, current);  \
 } while (0)
 
 #define LDLM_RESOURCE_DELREF(res) do {                                  \
-        lu_ref_del(&(res)->lr_reference, __FUNCTION__, cfs_current());  \
+       lu_ref_del(&(res)->lr_reference, __FUNCTION__, current);  \
 } while (0)
 
 /* ldlm_request.c */
@@ -1586,13 +1443,17 @@ int ldlm_cli_enqueue(struct obd_export *exp, struct ptlrpc_request **reqp,
                     void *lvb, __u32 lvb_len, enum lvb_type lvb_type,
                     struct lustre_handle *lockh, int async);
 int ldlm_prep_enqueue_req(struct obd_export *exp,
-                          struct ptlrpc_request *req,
-                          cfs_list_t *cancels,
-                          int count);
-int ldlm_prep_elc_req(struct obd_export *exp,
-                      struct ptlrpc_request *req,
-                      int version, int opc, int canceloff,
-                      cfs_list_t *cancels, int count);
+                         struct ptlrpc_request *req,
+                         struct list_head *cancels,
+                         int count);
+int ldlm_prep_elc_req(struct obd_export *exp, struct ptlrpc_request *req,
+                     int version, int opc, int canceloff,
+                     struct list_head *cancels, int count);
+
+struct ptlrpc_request *ldlm_enqueue_pack(struct obd_export *exp, int lvb_len);
+int ldlm_handle_enqueue0(struct ldlm_namespace *ns, struct ptlrpc_request *req,
+                        const struct ldlm_request *dlm_req,
+                        const struct ldlm_callback_suite *cbs);
 int ldlm_cli_enqueue_fini(struct obd_export *exp, struct ptlrpc_request *req,
                           ldlm_type_t type, __u8 with_policy, ldlm_mode_t mode,
                          __u64 *flags, void *lvb, __u32 lvb_len,
@@ -1611,7 +1472,8 @@ int ldlm_server_ast(struct lustre_handle *lockh, struct ldlm_lock_desc *new,
                     void *data, __u32 data_len);
 int ldlm_cli_convert(struct lustre_handle *, int new_mode, __u32 *flags);
 int ldlm_cli_update_pool(struct ptlrpc_request *req);
-int ldlm_cli_cancel(struct lustre_handle *lockh);
+int ldlm_cli_cancel(struct lustre_handle *lockh,
+                   ldlm_cancel_flags_t cancel_flags);
 int ldlm_cli_cancel_unused(struct ldlm_namespace *, const struct ldlm_res_id *,
                            ldlm_cancel_flags_t flags, void *opaque);
 int ldlm_cli_cancel_unused_resource(struct ldlm_namespace *ns,
@@ -1620,16 +1482,16 @@ int ldlm_cli_cancel_unused_resource(struct ldlm_namespace *ns,
                                     ldlm_mode_t mode,
                                     ldlm_cancel_flags_t flags,
                                     void *opaque);
-int ldlm_cli_cancel_req(struct obd_export *exp, cfs_list_t *head,
-                        int count, ldlm_cancel_flags_t flags);
+int ldlm_cli_cancel_req(struct obd_export *exp, struct list_head *head,
+                       int count, ldlm_cancel_flags_t flags);
 int ldlm_cancel_resource_local(struct ldlm_resource *res,
-                               cfs_list_t *cancels,
-                               ldlm_policy_data_t *policy,
-                               ldlm_mode_t mode, int lock_flags,
-                               ldlm_cancel_flags_t cancel_flags, void *opaque);
-int ldlm_cli_cancel_list_local(cfs_list_t *cancels, int count,
+                              struct list_head *cancels,
+                              ldlm_policy_data_t *policy,
+                              ldlm_mode_t mode, __u64 lock_flags,
+                              ldlm_cancel_flags_t cancel_flags, void *opaque);
+int ldlm_cli_cancel_list_local(struct list_head *cancels, int count,
                                ldlm_cancel_flags_t flags);
-int ldlm_cli_cancel_list(cfs_list_t *head, int count,
+int ldlm_cli_cancel_list(struct list_head *head, int count,
                          struct ptlrpc_request *req, ldlm_cancel_flags_t flags);
 /** @} ldlm_cli_api */
 
@@ -1638,17 +1500,6 @@ int ldlm_cli_cancel_list(cfs_list_t *head, int count,
 int intent_disposition(struct ldlm_reply *rep, int flag);
 void intent_set_disposition(struct ldlm_reply *rep, int flag);
 
-
-/* ioctls for trying requests */
-#define IOC_LDLM_TYPE                   'f'
-#define IOC_LDLM_MIN_NR                 40
-
-#define IOC_LDLM_TEST                   _IOWR('f', 40, long)
-#define IOC_LDLM_DUMP                   _IOWR('f', 41, long)
-#define IOC_LDLM_REGRESS_START          _IOWR('f', 42, long)
-#define IOC_LDLM_REGRESS_STOP           _IOWR('f', 43, long)
-#define IOC_LDLM_MAX_NR                 43
-
 /**
  * "Modes" of acquiring lock_res, necessary to tell lockdep that taking more
  * than one lock_res is dead-lock safe.
@@ -1680,7 +1531,7 @@ static inline void unlock_res(struct ldlm_resource *res)
 /** Check if resource is already locked, assert if not. */
 static inline void check_res_locked(struct ldlm_resource *res)
 {
-        LASSERT_SPIN_LOCKED(&res->lr_lock);
+       assert_spin_locked(&res->lr_lock);
 }
 
 struct ldlm_resource * lock_res_and_lock(struct ldlm_lock *lock);
@@ -1691,14 +1542,13 @@ void unlock_res_and_lock(struct ldlm_lock *lock);
  * There are not used outside of ldlm.
  * @{
  */
-void ldlm_pools_recalc(ldlm_side_t client);
+int ldlm_pools_recalc(ldlm_side_t client);
 int ldlm_pools_init(void);
 void ldlm_pools_fini(void);
 
 int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns,
                    int idx, ldlm_side_t client);
-int ldlm_pool_shrink(struct ldlm_pool *pl, int nr,
-                     unsigned int gfp_mask);
+int ldlm_pool_shrink(struct ldlm_pool *pl, int nr, gfp_t gfp_mask);
 void ldlm_pool_fini(struct ldlm_pool *pl);
 int ldlm_pool_setup(struct ldlm_pool *pl, int limit);
 int ldlm_pool_recalc(struct ldlm_pool *pl);