X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fosc%2Fosc_object.c;h=e1e4fdb9048d1b1823202690c275366a1c115957;hb=3f3a24dc5d7d;hp=b68eb30d5037e820a3a35fd1cac6feda09f2aeda;hpb=342c14842fa996181e5d5764701585b1b2f6d6cb;p=fs%2Flustre-release.git diff --git a/lustre/osc/osc_object.c b/lustre/osc/osc_object.c index b68eb30..e1e4fdb 100644 --- a/lustre/osc/osc_object.c +++ b/lustre/osc/osc_object.c @@ -83,22 +83,24 @@ static int osc_object_init(const struct lu_env *env, struct lu_object *obj, #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); + 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)); @@ -111,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(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); @@ -202,6 +205,32 @@ 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; + + LASSERT(lock->l_granted_mode == lock->l_req_mode); + 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) { @@ -242,39 +271,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, __GFP_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 */