Whamcloud - gitweb
LU-1333 hsm: Add hsm_release feature.
[fs/lustre-release.git] / lustre / lov / lov_cl_internal.h
index 3870ddf..2698495 100644 (file)
@@ -26,6 +26,8 @@
 /*
  * 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/
@@ -38,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
@@ -156,20 +159,35 @@ struct lov_device {
          * Serializes access to lov_device::ld_emrg in low-memory
          * conditions.
          */
-        cfs_mutex_t               ld_mutex;
+       struct mutex              ld_mutex;
 };
 
 /**
  * Layout type.
  */
 enum lov_layout_type {
-        /** empty file without body */
-        LLT_EMPTY,
-        /** striped file */
-        LLT_RAID0,
-        LLT_NR
+       LLT_EMPTY,      /** empty file without body (mknod + truncate) */
+       LLT_RAID0,      /** striped file */
+       LLT_RELEASED,   /** file with no objects (data in HSM) */
+       LLT_NR
 };
 
+static inline char *llt2str(enum lov_layout_type llt)
+{
+       switch (llt) {
+       case LLT_EMPTY:
+               return "EMPTY";
+       case LLT_RAID0:
+               return "RAID0";
+       case LLT_RELEASED:
+               return "RELEASED";
+       case LLT_NR:
+               LBUG();
+       }
+       LBUG();
+       return "";
+}
+
 /**
  * lov-specific file state.
  *
@@ -194,24 +212,29 @@ struct lov_object {
          *
          * \see lov_object::lo_type
          */
-        cfs_rw_semaphore_t     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 valid. This bit is cleared when layout lock
+        * True if layout is invalid. This bit is cleared when layout lock
         * is lost.
         */
-       unsigned               lo_lsm_invalid:1;
+       bool                    lo_layout_invalid;
        /**
-        * Layout metadata.
+        * How many IOs are on going on this object. Layout can be changed
+        * only if there is no active IO.
         */
-       struct lov_stripe_md  *lo_lsm;
+       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 {
@@ -242,7 +265,7 @@ struct lov_object {
                         /**
                          * protect lo_sub
                          */
-                        cfs_spinlock_t         lo_sub_lock;
+                       spinlock_t              lo_sub_lock;
                         /**
                          * Cached object attribute, built from sub-object
                          * attributes.
@@ -251,6 +274,8 @@ struct lov_object {
                 } raid0;
                 struct lov_layout_state_empty {
                 } empty;
+               struct lov_layout_state_released {
+               } released;
         } u;
         /**
          * Thread that acquired lov_object::lo_type_guard in an exclusive
@@ -295,7 +320,7 @@ struct lov_lock {
          * Set when sub-lock was canceled, while top-lock was being
          * used, or unused.
          */
-        int                    lls_cancel_race:1;
+       unsigned int           lls_cancel_race:1;
         /**
          * An array of sub-locks
          *
@@ -424,7 +449,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;
 };
@@ -481,11 +505,6 @@ struct lov_io {
          * lov_io::lis_cl::cis_object.
          */
         struct lov_object *lis_object;
-       /**
-        * Lov stripe - this determines how this io fans out.
-        * Hold a refcount to the lsm so it can't go away during IO.
-        */
-       struct lov_stripe_md *lis_lsm;
         /**
          * Original end-of-io position for this IO, set by the upper layer as
          * cl_io::u::ci_rw::pos + cl_io::u::ci_rw::count. lov remembers this,
@@ -553,19 +572,17 @@ 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 struct kmem_cache *lov_lock_kmem;
+extern struct kmem_cache *lov_object_kmem;
+extern struct kmem_cache *lov_thread_kmem;
+extern struct kmem_cache *lov_session_kmem;
+extern struct kmem_cache *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;
+extern struct kmem_cache *lovsub_lock_kmem;
+extern struct kmem_cache *lovsub_object_kmem;
+extern struct kmem_cache *lovsub_req_kmem;
 
-extern cfs_mem_cache_t *lov_lock_link_kmem;
+extern struct kmem_cache *lov_lock_link_kmem;
 
 int   lov_object_init     (const struct lu_env *env, struct lu_object *obj,
                            const struct lu_object_conf *conf);
@@ -580,10 +597,14 @@ 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,
                            struct cl_io *io);
+int   lov_io_init_released(const struct lu_env *env, struct cl_object *obj,
+                           struct cl_io *io);
 void  lov_lock_unlink     (const struct lu_env *env, struct lov_lock_link *link,
                            struct lovsub_lock *sub);
 
@@ -595,17 +616,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, struct page *vmpage);
+int   lovsub_page_init    (const struct lu_env *env, struct cl_object *ob,
+                          struct cl_page *page, struct page *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, struct page *vmpage);
+int   lov_page_init_raid0 (const struct lu_env *env,
+                           struct cl_object *obj,
+                          struct cl_page *page, struct page *vmpage);
 struct lu_object *lov_object_alloc   (const struct lu_env *env,
                                       const struct lu_object_header *hdr,
                                       struct lu_device *dev);