X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_cl_internal.h;h=d933b8fa5d1b1bd511566c9b16b2e0ac5f91f43a;hb=79e65c81349f539aa2960a1889144ce71d91351e;hp=3870ddfe366ecf531324b29d63763d3cfdb9fad9;hpb=2989b9dab9e87529ccadfc5711960b71e5e57b18;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_cl_internal.h b/lustre/lov/lov_cl_internal.h index 3870ddf..d933b8f 100644 --- a/lustre/lov/lov_cl_internal.h +++ b/lustre/lov/lov_cl_internal.h @@ -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 + * Author: Jinshan Xiong */ #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. * @@ -185,37 +203,42 @@ enum lov_layout_type { * function corresponding to the current layout type. */ struct lov_object { - struct cl_object lo_cl; - /** - * Serializes object operations with transitions between layout types. - * - * This semaphore is taken in shared mode by all object methods, and - * is taken in exclusive mode when object type is changed. - * - * \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 cl_object lo_cl; + /** + * Serializes object operations with transitions between layout types. + * + * This semaphore is taken in shared mode by all object methods, and + * is taken in exclusive mode when object type is changed. + * + * \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; /** - * 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; + wait_queue_head_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; + union lov_layout_state { + struct lov_layout_raid0 { + unsigned lo_nr; /** * When this is true, lov_object::lo_attr contains * valid up to date attributes for a top-level @@ -223,40 +246,42 @@ struct lov_object { * any sub-object change. */ int lo_attr_valid; - /** - * 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; - /** - * protect lo_sub - */ - cfs_spinlock_t lo_sub_lock; - /** - * Cached object attribute, built from sub-object - * attributes. - */ - struct cl_attr lo_attr; - } raid0; - struct lov_layout_state_empty { - } empty; - } u; - /** - * Thread that acquired lov_object::lo_type_guard in an exclusive - * mode. - */ - cfs_task_t *lo_owner; + /** + * 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; + /** + * protect lo_sub + */ + spinlock_t lo_sub_lock; + /** + * Cached object attribute, built from sub-object + * attributes. + */ + struct cl_attr lo_attr; + } 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 + * mode. + */ + struct task_struct *lo_owner; }; /** @@ -295,7 +320,8 @@ 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, + lls_ever_canceled:1; /** * An array of sub-locks * @@ -419,14 +445,15 @@ struct lovsub_page { struct lov_thread_info { - struct cl_object_conf lti_stripe_conf; - struct lu_fid lti_fid; - 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; + struct cl_object_conf lti_stripe_conf; + struct lu_fid lti_fid; + struct cl_lock_descr lti_ldescr; + struct ost_lvb lti_lvb; + struct cl_2queue lti_cl2q; + struct cl_page_list lti_plist; + struct cl_lock_closure lti_closure; + wait_queue_t lti_waiter; + struct cl_attr lti_attr; }; /** @@ -481,11 +508,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 +575,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 +600,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 +619,14 @@ 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); - -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 (const struct lu_env *env, struct cl_object *ob, + struct cl_page *page, pgoff_t index); +int lovsub_page_init (const struct lu_env *env, struct cl_object *ob, + struct cl_page *page, pgoff_t index); +int lov_page_init_empty (const struct lu_env *env, struct cl_object *obj, + struct cl_page *page, pgoff_t index); +int lov_page_init_raid0 (const struct lu_env *env, struct cl_object *obj, + struct cl_page *page, pgoff_t index); struct lu_object *lov_object_alloc (const struct lu_env *env, const struct lu_object_header *hdr, struct lu_device *dev); @@ -620,8 +641,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); +int lov_page_stripe(const struct cl_page *page); #define lov_foreach_target(lov, var) \ for (var = 0; var < lov_targets_nr(lov); ++var) @@ -780,11 +801,6 @@ static inline struct lovsub_req *cl2lovsub_req(const struct cl_req_slice *slice) return container_of0(slice, struct lovsub_req, lsrq_cl); } -static inline struct cl_page *lov_sub_page(const struct cl_page_slice *slice) -{ - return slice->cpl_page->cp_child; -} - static inline struct lov_io *cl2lov_io(const struct lu_env *env, const struct cl_io_slice *ios) {