X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosc%2Fosc_object.c;h=b8836414671ab69a41dae9ad1050781ee2edda01;hp=64412b53ec535543ca636738c7191850b60a88dd;hb=4311cdaa832fc4a444d48e50174dde09f21146d2;hpb=6794d7654b4c459519a9e6d85ed439c8c594c2e7 diff --git a/lustre/osc/osc_object.c b/lustre/osc/osc_object.c index 64412b5..b883641 100644 --- a/lustre/osc/osc_object.c +++ b/lustre/osc/osc_object.c @@ -27,7 +27,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel Corporation. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -36,14 +36,15 @@ * Implementation of cl_object for OSC layer. * * Author: Nikita Danilov + * Author: Jinshan Xiong */ #define DEBUG_SUBSYSTEM S_OSC #include "osc_cl_internal.h" -/** \addtogroup osc - * @{ +/** \addtogroup osc + * @{ */ /***************************************************************************** @@ -77,26 +78,29 @@ static int osc_object_init(const struct lu_env *env, struct lu_object *obj, int i; osc->oo_oinfo = cconf->u.coc_oinfo; -#ifdef INVARIANT_CHECK +#ifdef CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK mutex_init(&osc->oo_debug_mutex); #endif spin_lock_init(&osc->oo_seatbelt); for (i = 0; i < CRT_NR; ++i) - CFS_INIT_LIST_HEAD(&osc->oo_inflight[i]); + INIT_LIST_HEAD(&osc->oo_inflight[i]); - CFS_INIT_LIST_HEAD(&osc->oo_ready_item); - CFS_INIT_LIST_HEAD(&osc->oo_hp_ready_item); - CFS_INIT_LIST_HEAD(&osc->oo_write_item); - CFS_INIT_LIST_HEAD(&osc->oo_read_item); + INIT_LIST_HEAD(&osc->oo_ready_item); + INIT_LIST_HEAD(&osc->oo_hp_ready_item); + INIT_LIST_HEAD(&osc->oo_write_item); + INIT_LIST_HEAD(&osc->oo_read_item); osc->oo_root.rb_node = NULL; - CFS_INIT_LIST_HEAD(&osc->oo_hp_exts); - CFS_INIT_LIST_HEAD(&osc->oo_urgent_exts); - CFS_INIT_LIST_HEAD(&osc->oo_rpc_exts); - CFS_INIT_LIST_HEAD(&osc->oo_reading_exts); - cfs_atomic_set(&osc->oo_nr_reads, 0); - cfs_atomic_set(&osc->oo_nr_writes, 0); + INIT_LIST_HEAD(&osc->oo_hp_exts); + INIT_LIST_HEAD(&osc->oo_urgent_exts); + INIT_LIST_HEAD(&osc->oo_rpc_exts); + INIT_LIST_HEAD(&osc->oo_reading_exts); + atomic_set(&osc->oo_nr_reads, 0); + atomic_set(&osc->oo_nr_writes, 0); spin_lock_init(&osc->oo_lock); + spin_lock_init(&osc->oo_tree_lock); + spin_lock_init(&osc->oo_ol_spin); + INIT_LIST_HEAD(&osc->oo_ol_list); cl_object_page_init(lu2cl(obj), sizeof(struct osc_page)); @@ -109,20 +113,21 @@ static void osc_object_free(const struct lu_env *env, struct lu_object *obj) int i; for (i = 0; i < CRT_NR; ++i) - LASSERT(cfs_list_empty(&osc->oo_inflight[i])); + LASSERT(list_empty(&osc->oo_inflight[i])); - LASSERT(cfs_list_empty(&osc->oo_ready_item)); - LASSERT(cfs_list_empty(&osc->oo_hp_ready_item)); - LASSERT(cfs_list_empty(&osc->oo_write_item)); - LASSERT(cfs_list_empty(&osc->oo_read_item)); + LASSERT(list_empty(&osc->oo_ready_item)); + LASSERT(list_empty(&osc->oo_hp_ready_item)); + LASSERT(list_empty(&osc->oo_write_item)); + LASSERT(list_empty(&osc->oo_read_item)); LASSERT(osc->oo_root.rb_node == NULL); - LASSERT(cfs_list_empty(&osc->oo_hp_exts)); - LASSERT(cfs_list_empty(&osc->oo_urgent_exts)); - LASSERT(cfs_list_empty(&osc->oo_rpc_exts)); - LASSERT(cfs_list_empty(&osc->oo_reading_exts)); - LASSERT(cfs_atomic_read(&osc->oo_nr_reads) == 0); - LASSERT(cfs_atomic_read(&osc->oo_nr_writes) == 0); + LASSERT(list_empty(&osc->oo_hp_exts)); + LASSERT(list_empty(&osc->oo_urgent_exts)); + LASSERT(list_empty(&osc->oo_rpc_exts)); + LASSERT(list_empty(&osc->oo_reading_exts)); + LASSERT(atomic_read(&osc->oo_nr_reads) == 0); + LASSERT(atomic_read(&osc->oo_nr_writes) == 0); + LASSERT(list_empty(&osc->oo_ol_list)); lu_object_fini(obj); OBD_SLAB_FREE_PTR(osc, osc_object_kmem); @@ -165,8 +170,8 @@ static int osc_attr_get(const struct lu_env *env, struct cl_object *obj, return 0; } -int osc_attr_set(const struct lu_env *env, struct cl_object *obj, - const struct cl_attr *attr, unsigned valid) +static int osc_attr_set(const struct lu_env *env, struct cl_object *obj, + const struct cl_attr *attr, unsigned valid) { struct lov_oinfo *oinfo = cl2osc(obj)->oo_oinfo; struct ost_lvb *lvb = &oinfo->loi_lvb; @@ -200,6 +205,31 @@ static int osc_object_glimpse(const struct lu_env *env, RETURN(0); } +static int osc_object_ast_clear(struct ldlm_lock *lock, void *data) +{ + ENTRY; + + if (lock->l_ast_data == data) + lock->l_ast_data = NULL; + RETURN(LDLM_ITER_CONTINUE); +} + +static int osc_object_prune(const struct lu_env *env, struct cl_object *obj) +{ + struct osc_object *osc = cl2osc(obj); + struct ldlm_res_id *resname = &osc_env_info(env)->oti_resname; + + LASSERTF(osc->oo_npages == 0, + DFID "still have %lu pages, obj: %p, osc: %p\n", + PFID(lu_object_fid(&obj->co_lu)), osc->oo_npages, obj, osc); + + /* DLM locks don't hold a reference of osc_object so we have to + * clear it before the object is being destroyed. */ + ostid_build_res_name(&osc->oo_oinfo->loi_oi, resname); + ldlm_resource_iterate(osc_export(osc)->exp_obd->obd_namespace, resname, + osc_object_ast_clear, osc); + return 0; +} void osc_object_set_contended(struct osc_object *obj) { @@ -240,39 +270,39 @@ int osc_object_is_contended(struct osc_object *obj) } static const struct cl_object_operations osc_ops = { - .coo_page_init = osc_page_init, - .coo_lock_init = osc_lock_init, - .coo_io_init = osc_io_init, - .coo_attr_get = osc_attr_get, - .coo_attr_set = osc_attr_set, - .coo_glimpse = osc_object_glimpse + .coo_page_init = osc_page_init, + .coo_lock_init = osc_lock_init, + .coo_io_init = osc_io_init, + .coo_attr_get = osc_attr_get, + .coo_attr_set = osc_attr_set, + .coo_glimpse = osc_object_glimpse, + .coo_prune = osc_object_prune }; static const struct lu_object_operations osc_lu_obj_ops = { - .loo_object_init = osc_object_init, - .loo_object_delete = NULL, - .loo_object_release = NULL, - .loo_object_free = osc_object_free, - .loo_object_print = osc_object_print, - .loo_object_invariant = NULL + .loo_object_init = osc_object_init, + .loo_object_release = NULL, + .loo_object_free = osc_object_free, + .loo_object_print = osc_object_print, + .loo_object_invariant = NULL }; struct lu_object *osc_object_alloc(const struct lu_env *env, - const struct lu_object_header *unused, - struct lu_device *dev) + const struct lu_object_header *unused, + struct lu_device *dev) { - struct osc_object *osc; - struct lu_object *obj; - - OBD_SLAB_ALLOC_PTR_GFP(osc, osc_object_kmem, CFS_ALLOC_IO); - if (osc != NULL) { - obj = osc2lu(osc); - lu_object_init(obj, NULL, dev); - osc->oo_cl.co_ops = &osc_ops; - obj->lo_ops = &osc_lu_obj_ops; - } else - obj = NULL; - return obj; + struct osc_object *osc; + struct lu_object *obj; + + OBD_SLAB_ALLOC_PTR_GFP(osc, osc_object_kmem, GFP_NOFS); + if (osc != NULL) { + obj = osc2lu(osc); + lu_object_init(obj, NULL, dev); + osc->oo_cl.co_ops = &osc_ops; + obj->lo_ops = &osc_lu_obj_ops; + } else + obj = NULL; + return obj; } /** @} osc */