X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_cl_internal.h;h=5c43cbb60570e9bf93fa2d815188a71530e392e8;hb=d5390bbde9b525b13ab91f5610abe1c4bb98eff9;hp=a892bc1d262692b5325f6301357fe646fd224595;hpb=f95393b0d0a59cf3dc2f29cffc35dcc4cc9d7728;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_cl_internal.h b/lustre/lov/lov_cl_internal.h index a892bc1..5c43cbb 100644 --- a/lustre/lov/lov_cl_internal.h +++ b/lustre/lov/lov_cl_internal.h @@ -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. @@ -28,6 +26,8 @@ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,6 +40,7 @@ * Internal interfaces of LOV layer. * * Author: Nikita Danilov + * Author: Jinshan Xiong */ #ifndef LOV_CL_INTERNAL_H @@ -158,7 +159,7 @@ struct lov_device { * Serializes access to lov_device::ld_emrg in low-memory * conditions. */ - cfs_mutex_t ld_mutex; + struct mutex ld_mutex; }; /** @@ -196,16 +197,40 @@ 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 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,14 +250,7 @@ struct lov_object { /** * protect lo_sub */ - cfs_spinlock_t lo_sub_lock; - /** - * 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; + spinlock_t lo_sub_lock; /** * Cached object attribute, built from sub-object * attributes. @@ -285,7 +303,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 * @@ -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; }; @@ -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 */