* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include "osc_cl_internal.h"
-/** \addtogroup osc
- * @{
+/** \addtogroup osc
+ * @{
*/
/*****************************************************************************
#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));
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);
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;
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)
{
}
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 */