Whamcloud - gitweb
Revert "b=21501 flock in process hangs on eviction, does not fail"
[fs/lustre-release.git] / lustre / lov / lov_cl_internal.h
index aa9583f..21b0ff4 100644 (file)
@@ -55,8 +55,6 @@
 #include <cl_object.h>
 #include "lov_internal.h"
 
-/** \addtogroup lov lov @{ */
-
 /** \defgroup lov lov
  * Logical object volume layer. This layer implements data striping (raid0).
  *
  *       cl_lock::cll_guard, and will be automatically cleared by the sub-lock
  *       when the latter is destroyed. When a sub-lock is canceled, a
  *       reference to it is removed from the top-lock array, and top-lock is
- *       moved into CLS_NEW state. It is guaranteed that all sub-locks exits
+ *       moved into CLS_NEW state. It is guaranteed that all sub-locks exist
  *       while their top-lock is in CLS_HELD or CLS_CACHED states.
  *
  *     - IO's are not reference counted.
  *
  * To implement a connection between top and sub entities, lov layer is split
  * into two pieces: lov ("upper half"), and lovsub ("bottom half"), both
- * implementing full set of cl-interfaces. For example, top-object has clu and
+ * implementing full set of cl-interfaces. For example, top-object has vvp and
  * lov layers, and it's sub-object has lovsub and osc layers. lovsub layer is
  * used to track child-parent relationship.
  *
@@ -160,7 +158,7 @@ struct lov_device {
          * Serializes access to lov_device::ld_emrg in low-memory
          * conditions.
          */
-        struct mutex              ld_mutex;
+        cfs_mutex_t               ld_mutex;
 };
 
 /**
@@ -171,8 +169,6 @@ enum lov_layout_type {
         LLT_EMPTY,
         /** striped file */
         LLT_RAID0,
-        /** join file */
-        LLT_JOIN,
         LLT_NR
 };
 
@@ -200,7 +196,7 @@ struct lov_object {
          *
          * \see lov_object::lo_type
          */
-        struct rw_semaphore    lo_type_guard;
+        cfs_rw_semaphore_t     lo_type_guard;
         /**
          * Type of an object. Protected by lov_object::lo_type_guard.
          */
@@ -210,6 +206,21 @@ struct lov_object {
                 struct lov_layout_raid0 {
                         unsigned               lo_nr;
                         struct lov_stripe_md  *lo_lsm;
+                        /**
+                         * Array of sub-objects. Allocated when top-object is
+                         * created (lov_init_raid0()).
+                         *
+                         * Top-object is a strict master of its sub-objects:
+                         * it is created before them, and outlives its
+                         * children (this later is necessary so that basic
+                         * functions like cl_object_top() always
+                         * work). Top-object keeps a reference on every
+                         * sub-object.
+                         *
+                         * When top-object is destroyed (lov_delete_raid0())
+                         * it releases its reference to a sub-object and waits
+                         * until the latter is finally destroyed.
+                         */
                         struct lovsub_object **lo_sub;
                         /**
                          * When this is true, lov_object::lo_attr contains
@@ -226,8 +237,6 @@ struct lov_object {
                 } raid0;
                 struct lov_layout_state_empty {
                 } empty;
-                struct lov_layout_state_join {
-                } join;
         } u;
         /**
          * Thread that acquired lov_object::lo_type_guard in an exclusive
@@ -270,9 +279,9 @@ struct lov_lock {
         unsigned               lls_nr_filled;
         /**
          * Set when sub-lock was canceled, while top-lock was being
-         * unlocked.
+         * used, or unused.
          */
-        int                    lls_unuse_race;
+        int                    lls_cancel_race:1;
         /**
          * An array of sub-locks
          *
@@ -357,7 +366,7 @@ struct lov_lock_link {
          * A linkage into per sub-lock list of all corresponding top-locks,
          * hanging off lovsub_lock::lss_parents.
          */
-        struct list_head lll_list;
+        cfs_list_t       lll_list;
 };
 
 /**
@@ -369,7 +378,7 @@ struct lovsub_lock {
          * List of top-locks that have given sub-lock as their part. Protected
          * by cl_lock::cll_guard mutex.
          */
-        struct list_head      lss_parents;
+        cfs_list_t            lss_parents;
         /**
          * Top-lock that initiated current operation on this sub-lock. This is
          * only set during top-to-bottom lock operations like enqueue, and is
@@ -381,6 +390,15 @@ struct lovsub_lock {
         struct cl_lock       *lss_active;
 };
 
+/**
+ * Describe the environment settings for sublocks.
+ */
+struct lov_sublock_env {
+        const struct lu_env *lse_env;
+        struct cl_io        *lse_io;
+        struct lov_io_sub   *lse_sub;
+};
+
 struct lovsub_page {
         struct cl_page_slice lsb_cl;
 };
@@ -394,6 +412,7 @@ struct lov_thread_info {
         struct cl_2queue        lti_cl2q;
         union  lov_layout_state lti_state;
         struct cl_lock_closure  lti_closure;
+        cfs_waitlink_t          lti_waiter;
 };
 
 /**
@@ -411,7 +430,7 @@ struct lov_io_sub {
          * Linkage into a list (hanging off lov_io::lis_active) of all
          * sub-io's active for the current IO iteration.
          */
-        struct list_head     sub_linkage;
+        cfs_list_t           sub_linkage;
         /**
          * true, iff cl_io_init() was successfully executed against
          * lov_io_sub::sub_io.
@@ -487,11 +506,12 @@ struct lov_io {
         /**
          * List of active sub-io's.
          */
-        struct list_head   lis_active;
+        cfs_list_t         lis_active;
 };
 
 struct lov_session {
-        struct lov_io ls_io;
+        struct lov_io          ls_io;
+        struct lov_sublock_env ls_subenv;
 };
 
 /**
@@ -548,7 +568,9 @@ int   lov_io_init_empty   (const struct lu_env *env, struct cl_object *obj,
 void  lov_lock_unlink     (const struct lu_env *env, struct lov_lock_link *link,
                            struct lovsub_lock *sub);
 
-void  lov_sub_put         (struct lov_io_sub *sub);
+struct lov_io_sub *lov_sub_get(const struct lu_env *env, struct lov_io *lio,
+                               int stripe);
+void  lov_sub_put             (struct lov_io_sub *sub);
 int   lov_sublock_modify  (const struct lu_env *env, struct lov_lock *lov,
                            struct lovsub_lock *sublock,
                            const struct cl_lock_descr *d, int idx);
@@ -772,7 +794,8 @@ static inline struct lov_layout_raid0 *lov_r0(struct lov_object *lov)
 
         LASSERT(lov->lo_type == LLT_RAID0);
         raid0 = &lov->u.raid0;
-        LASSERT(raid0->lo_lsm->lsm_wire.lw_magic == LOV_MAGIC);
+        LASSERT(raid0->lo_lsm->lsm_wire.lw_magic == LOV_MAGIC ||
+                raid0->lo_lsm->lsm_wire.lw_magic == LOV_MAGIC_V3);
         return raid0;
 }