Whamcloud - gitweb
LU-3030 build: Update Master Copyrights pre 2.4 split
[fs/lustre-release.git] / lustre / lov / lov_cl_internal.h
index 5401f6b..13c2f5a 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2012, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -40,6 +40,7 @@
  * Internal interfaces of LOV layer.
  *
  *   Author: Nikita Danilov <nikita.danilov@sun.com>
+ *   Author: Jinshan Xiong <jinshan.xiong@intel.com>
  */
 
 #ifndef LOV_CL_INTERNAL_H
@@ -158,7 +159,7 @@ struct lov_device {
          * Serializes access to lov_device::ld_emrg in low-memory
          * conditions.
          */
-        struct mutex              ld_mutex;
+       struct mutex              ld_mutex;
 };
 
 /**
@@ -169,8 +170,6 @@ enum lov_layout_type {
         LLT_EMPTY,
         /** striped file */
         LLT_RAID0,
-        /** join file */
-        LLT_JOIN,
         LLT_NR
 };
 
@@ -198,16 +197,40 @@ struct lov_object {
          *
          * \see lov_object::lo_type
          */
-        struct rw_semaphore    lo_type_guard;
-        /**
-         * Type of an object. Protected by lov_object::lo_type_guard.
-         */
-        enum lov_layout_type   lo_type;
+       struct rw_semaphore     lo_type_guard;
+       /**
+        * Type of an object. Protected by lov_object::lo_type_guard.
+        */
+       enum lov_layout_type    lo_type;
+       /**
+        * True if layout is invalid. This bit is cleared when layout lock
+        * is lost.
+        */
+       bool                    lo_layout_invalid;
+       /**
+        * How many IOs are on going on this object. Layout can be changed
+        * only if there is no active IO.
+        */
+       cfs_atomic_t           lo_active_ios;
+       /**
+        * Waitq - wait for no one else is using lo_lsm
+        */
+       cfs_waitq_t            lo_waitq;
+       /**
+        * Layout metadata. NULL if empty layout.
+        */
+       struct lov_stripe_md  *lo_lsm;
 
         union lov_layout_state {
                 struct lov_layout_raid0 {
                         unsigned               lo_nr;
-                        struct lov_stripe_md  *lo_lsm;
+                       /**
+                        * When this is true, lov_object::lo_attr contains
+                        * valid up to date attributes for a top-level
+                        * object. This field is reset to 0 when attributes of
+                        * any sub-object change.
+                        */
+                       int                    lo_attr_valid;
                         /**
                          * Array of sub-objects. Allocated when top-object is
                          * created (lov_init_raid0()).
@@ -225,12 +248,9 @@ struct lov_object {
                          */
                         struct lovsub_object **lo_sub;
                         /**
-                         * When this is true, lov_object::lo_attr contains
-                         * valid up to date attributes for a top-level
-                         * object. This field is reset to 0 when attributes of
-                         * any sub-object change.
+                         * protect lo_sub
                          */
-                        int                    lo_attr_valid;
+                       spinlock_t              lo_sub_lock;
                         /**
                          * Cached object attribute, built from sub-object
                          * attributes.
@@ -239,8 +259,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
@@ -283,9 +301,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;
+       unsigned int           lls_cancel_race:1;
         /**
          * An array of sub-locks
          *
@@ -370,7 +388,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;
 };
 
 /**
@@ -382,7 +400,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
@@ -414,7 +432,6 @@ struct lov_thread_info {
         struct cl_lock_descr    lti_ldescr;
         struct ost_lvb          lti_lvb;
         struct cl_2queue        lti_cl2q;
-        union  lov_layout_state lti_state;
         struct cl_lock_closure  lti_closure;
         cfs_waitlink_t          lti_waiter;
 };
@@ -434,7 +451,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.
@@ -510,7 +527,7 @@ struct lov_io {
         /**
          * List of active sub-io's.
          */
-        struct list_head   lis_active;
+        cfs_list_t         lis_active;
 };
 
 struct lov_session {
@@ -538,14 +555,12 @@ extern struct lu_device_type lovsub_device_type;
 extern struct lu_context_key lov_key;
 extern struct lu_context_key lov_session_key;
 
-extern cfs_mem_cache_t *lov_page_kmem;
 extern cfs_mem_cache_t *lov_lock_kmem;
 extern cfs_mem_cache_t *lov_object_kmem;
 extern cfs_mem_cache_t *lov_thread_kmem;
 extern cfs_mem_cache_t *lov_session_kmem;
 extern cfs_mem_cache_t *lov_req_kmem;
 
-extern cfs_mem_cache_t *lovsub_page_kmem;
 extern cfs_mem_cache_t *lovsub_lock_kmem;
 extern cfs_mem_cache_t *lovsub_object_kmem;
 extern cfs_mem_cache_t *lovsub_req_kmem;
@@ -565,6 +580,8 @@ int   lovsub_lock_init    (const struct lu_env *env, struct cl_object *obj,
 
 int   lov_lock_init_raid0 (const struct lu_env *env, struct cl_object *obj,
                            struct cl_lock *lock, const struct cl_io *io);
+int   lov_lock_init_empty (const struct lu_env *env, struct cl_object *obj,
+                           struct cl_lock *lock, const struct cl_io *io);
 int   lov_io_init_raid0   (const struct lu_env *env, struct cl_object *obj,
                            struct cl_io *io);
 int   lov_io_init_empty   (const struct lu_env *env, struct cl_object *obj,
@@ -580,17 +597,17 @@ int   lov_sublock_modify  (const struct lu_env *env, struct lov_lock *lov,
                            const struct cl_lock_descr *d, int idx);
 
 
-struct cl_page *lov_page_init   (const struct lu_env *env, struct cl_object *ob,
-                                 struct cl_page *page, cfs_page_t *vmpage);
-struct cl_page *lovsub_page_init(const struct lu_env *env, struct cl_object *ob,
-                                 struct cl_page *page, cfs_page_t *vmpage);
+int   lov_page_init       (const struct lu_env *env, struct cl_object *ob,
+                           struct cl_page *page, cfs_page_t *vmpage);
+int   lovsub_page_init    (const struct lu_env *env, struct cl_object *ob,
+                           struct cl_page *page, cfs_page_t *vmpage);
 
-struct cl_page   *lov_page_init_empty(const struct lu_env *env,
-                                      struct cl_object *obj,
-                                      struct cl_page *page, cfs_page_t *vmpage);
-struct cl_page   *lov_page_init_raid0(const struct lu_env *env,
-                                      struct cl_object *obj,
-                                      struct cl_page *page, cfs_page_t *vmpage);
+int   lov_page_init_empty (const struct lu_env *env,
+                           struct cl_object *obj,
+                           struct cl_page *page, cfs_page_t *vmpage);
+int   lov_page_init_raid0 (const struct lu_env *env,
+                           struct cl_object *obj,
+                           struct cl_page *page, cfs_page_t *vmpage);
 struct lu_object *lov_object_alloc   (const struct lu_env *env,
                                       const struct lu_object_header *hdr,
                                       struct lu_device *dev);
@@ -605,6 +622,8 @@ struct lov_io_sub    *lov_page_subio    (const struct lu_env *env,
                                          struct lov_io *lio,
                                          const struct cl_page_slice *slice);
 
+void lov_lsm_decref(struct lov_object *lov, struct lov_stripe_md *lsm);
+struct lov_stripe_md *lov_lsm_addref(struct lov_object *lov);
 
 #define lov_foreach_target(lov, var)                    \
         for (var = 0; var < lov_targets_nr(lov); ++var)
@@ -794,13 +813,10 @@ static inline struct lov_thread_info *lov_env_info(const struct lu_env *env)
 
 static inline struct lov_layout_raid0 *lov_r0(struct lov_object *lov)
 {
-        struct lov_layout_raid0 *raid0;
-
-        LASSERT(lov->lo_type == LLT_RAID0);
-        raid0 = &lov->u.raid0;
-        LASSERT(raid0->lo_lsm->lsm_wire.lw_magic == LOV_MAGIC ||
-                raid0->lo_lsm->lsm_wire.lw_magic == LOV_MAGIC_V3);
-        return raid0;
+       LASSERT(lov->lo_type == LLT_RAID0);
+       LASSERT(lov->lo_lsm->lsm_wire.lw_magic == LOV_MAGIC ||
+               lov->lo_lsm->lsm_wire.lw_magic == LOV_MAGIC_V3);
+       return &lov->u.raid0;
 }
 
 /** @} lov */