* GPL HEADER END
*/
/*
- * Copyright (c) 2012, 2016, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
*/
/*
* lustre/target/tgt_main.c
/* statfs data */
spin_lock_init(&tgd->tgd_osfs_lock);
- tgd->tgd_osfs_age = cfs_time_shift_64(-1000);
+ tgd->tgd_osfs_age = ktime_get_seconds() - 1000;
tgd->tgd_osfs_unstable = 0;
tgd->tgd_statfs_inflight = 0;
tgd->tgd_osfs_inflight = 0;
/* prepare transactions callbacks */
lut->lut_txn_cb.dtc_txn_start = tgt_txn_start_cb;
lut->lut_txn_cb.dtc_txn_stop = tgt_txn_stop_cb;
- lut->lut_txn_cb.dtc_txn_commit = NULL;
lut->lut_txn_cb.dtc_cookie = lut;
lut->lut_txn_cb.dtc_tag = LCT_DT_THREAD | LCT_MD_THREAD;
INIT_LIST_HEAD(&lut->lut_txn_cb.dtc_linkage);
}
EXPORT_SYMBOL(tgt_fini);
+static struct kmem_cache *tgt_thread_kmem;
+static struct kmem_cache *tgt_session_kmem;
+static struct lu_kmem_descr tgt_caches[] = {
+ {
+ .ckd_cache = &tgt_thread_kmem,
+ .ckd_name = "tgt_thread_kmem",
+ .ckd_size = sizeof(struct tgt_thread_info),
+ },
+ {
+ .ckd_cache = &tgt_session_kmem,
+ .ckd_name = "tgt_session_kmem",
+ .ckd_size = sizeof(struct tgt_session_info)
+ },
+ {
+ .ckd_cache = NULL
+ }
+};
+
+
/* context key constructor/destructor: tg_key_init, tg_key_fini */
-LU_KEY_INIT(tgt, struct tgt_thread_info);
+static void *tgt_key_init(const struct lu_context *ctx,
+ struct lu_context_key *key)
+{
+ struct tgt_thread_info *thread;
+
+ OBD_SLAB_ALLOC_PTR_GFP(thread, tgt_thread_kmem, GFP_NOFS);
+ if (thread == NULL)
+ return ERR_PTR(-ENOMEM);
+
+ return thread;
+}
static void tgt_key_fini(const struct lu_context *ctx,
struct lu_context_key *key, void *data)
if (args->ta_args != NULL)
OBD_FREE(args->ta_args, sizeof(args->ta_args[0]) *
args->ta_alloc_args);
- OBD_FREE_PTR(info);
+ OBD_SLAB_FREE_PTR(info, tgt_thread_kmem);
}
static void tgt_key_exit(const struct lu_context *ctx,
LU_KEY_INIT_GENERIC(tgt);
-/* context key constructor/destructor: tgt_ses_key_init, tgt_ses_key_fini */
-LU_KEY_INIT_FINI(tgt_ses, struct tgt_session_info);
+static void *tgt_ses_key_init(const struct lu_context *ctx,
+ struct lu_context_key *key)
+{
+ struct tgt_session_info *session;
+
+ OBD_SLAB_ALLOC_PTR_GFP(session, tgt_session_kmem, GFP_NOFS);
+ if (session == NULL)
+ return ERR_PTR(-ENOMEM);
+
+ return session;
+}
+
+static void tgt_ses_key_fini(const struct lu_context *ctx,
+ struct lu_context_key *key, void *data)
+{
+ struct tgt_session_info *session = data;
+
+ OBD_SLAB_FREE_PTR(session, tgt_session_kmem);
+}
/* context key: tgt_session_key */
struct lu_context_key tgt_session_key = {
int tgt_mod_init(void)
{
+ int result;
ENTRY;
+ result = lu_kmem_init(tgt_caches);
+ if (result != 0)
+ RETURN(result);
+
tgt_page_to_corrupt = alloc_page(GFP_KERNEL);
tgt_key_init_generic(&tgt_thread_key, NULL);
lu_context_key_degister(&tgt_thread_key);
lu_context_key_degister(&tgt_session_key);
update_info_fini();
+
+ lu_kmem_fini(tgt_caches);
}