X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_capa.c;h=56968087c6351403b610b9b02521e5127ebcbe71;hp=a4cbe69669557a34f61838b83a423ad698700dd4;hb=780bc7a0e9965ae76750daf15356a976afca806f;hpb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431 diff --git a/lustre/mdt/mdt_capa.c b/lustre/mdt/mdt_capa.c index a4cbe69..5696808 100644 --- a/lustre/mdt/mdt_capa.c +++ b/lustre/mdt/mdt_capa.c @@ -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. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,30 +40,27 @@ * Author: Lai Siyao */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_MDS #include "mdt_internal.h" static inline void set_capa_key_expiry(struct mdt_device *mdt) { - mdt->mdt_ck_expiry = jiffies + mdt->mdt_ck_timeout * CFS_HZ; + mdt->mdt_ck_expiry = jiffies + msecs_to_jiffies(mdt->mdt_ck_timeout * + MSEC_PER_SEC); } -static void make_capa_key(struct lustre_capa_key *key, - mdsno_t mdsnum, int keyid) +static void make_capa_key(struct lustre_capa_key *key, u32 mdsnum, int keyid) { - key->lk_mdsid = mdsnum; + key->lk_seq = mdsnum; key->lk_keyid = keyid + 1; - ll_get_random_bytes(key->lk_key, sizeof(key->lk_key)); + cfs_get_random_bytes(key->lk_key, sizeof(key->lk_key)); } static inline void lck_cpu_to_le(struct lustre_capa_key *tgt, struct lustre_capa_key *src) { - tgt->lk_mdsid = cpu_to_le64(src->lk_mdsid); + tgt->lk_seq = cpu_to_le64(src->lk_seq); tgt->lk_keyid = cpu_to_le32(src->lk_keyid); tgt->lk_padding = cpu_to_le32(src->lk_padding); memcpy(tgt->lk_key, src->lk_key, sizeof(src->lk_key)); @@ -72,7 +69,7 @@ static inline void lck_cpu_to_le(struct lustre_capa_key *tgt, static inline void lck_le_to_cpu(struct lustre_capa_key *tgt, struct lustre_capa_key *src) { - tgt->lk_mdsid = le64_to_cpu(src->lk_mdsid); + tgt->lk_seq = le64_to_cpu(src->lk_seq); tgt->lk_keyid = le32_to_cpu(src->lk_keyid); tgt->lk_padding = le32_to_cpu(src->lk_padding); memcpy(tgt->lk_key, src->lk_key, sizeof(src->lk_key)); @@ -89,10 +86,19 @@ static int write_capa_keys(const struct lu_env *env, int i, rc; mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key); - mdt_trans_credit_init(env, mdt, MDT_TXN_CAPA_KEYS_WRITE_OP); - th = mdt_trans_start(env, mdt); - if (IS_ERR(th)) - RETURN(PTR_ERR(th)); + th = dt_trans_create(env, mdt->mdt_bottom); + if (IS_ERR(th)) + RETURN(PTR_ERR(th)); + + rc = dt_declare_record_write(env, mdt->mdt_ck_obj, + mdt_buf_const(env, NULL, + sizeof(*tmp) * 3), 0, th); + if (rc) + goto stop; + + rc = dt_trans_start_local(env, mdt->mdt_bottom, th); + if (rc) + goto stop; tmp = &mti->mti_capa_key; @@ -106,7 +112,8 @@ static int write_capa_keys(const struct lu_env *env, break; } - mdt_trans_stop(env, mdt, th); +stop: + dt_trans_stop(env, mdt->mdt_bottom, th); CDEBUG(D_INFO, "write capability keys rc = %d:\n", rc); return rc; @@ -143,12 +150,12 @@ int mdt_capa_keys_init(const struct lu_env *env, struct mdt_device *mdt) struct mdt_thread_info *mti; struct dt_object *obj; struct lu_attr *la; - mdsno_t mdsnum; + u32 mdsnum; unsigned long size; int rc; ENTRY; - mdsnum = mdt_md_site(mdt)->ms_node_id; + mdsnum = mdt_seq_site(mdt)->ss_node_id; mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key); LASSERT(mti != NULL); @@ -188,124 +195,126 @@ int mdt_capa_keys_init(const struct lu_env *env, struct mdt_device *mdt) void mdt_ck_timer_callback(unsigned long castmeharder) { - struct mdt_device *mdt = (struct mdt_device *)castmeharder; - struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; + struct mdt_device *mdt = (struct mdt_device *)castmeharder; + struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; - ENTRY; - thread->t_flags |= SVC_EVENT; - cfs_waitq_signal(&thread->t_ctl_waitq); - EXIT; + ENTRY; + thread_add_flags(thread, SVC_EVENT); + wake_up(&thread->t_ctl_waitq); + EXIT; } static int mdt_ck_thread_main(void *args) { - struct mdt_device *mdt = args; - struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; - struct lustre_capa_key *bkey = &mdt->mdt_capa_keys[0], - *rkey = &mdt->mdt_capa_keys[1]; - struct lustre_capa_key *tmp; - struct lu_env env; - struct mdt_thread_info *info; - struct md_device *next; - struct l_wait_info lwi = { 0 }; - mdsno_t mdsnum; - int rc; - ENTRY; - - cfs_daemonize_ctxt("mdt_ck"); - cfs_block_allsigs(); - - thread->t_flags = SVC_RUNNING; - cfs_waitq_signal(&thread->t_ctl_waitq); - - rc = lu_env_init(&env, LCT_MD_THREAD|LCT_REMEMBER|LCT_NOREF); - if (rc) - RETURN(rc); - - thread->t_env = &env; - env.le_ctx.lc_thread = thread; - env.le_ctx.lc_cookie = 0x1; - - info = lu_context_key_get(&env.le_ctx, &mdt_thread_key); - LASSERT(info != NULL); - - tmp = &info->mti_capa_key; - mdsnum = mdt_md_site(mdt)->ms_node_id; - while (1) { - l_wait_event(thread->t_ctl_waitq, - thread->t_flags & (SVC_STOPPING | SVC_EVENT), - &lwi); - - if (thread->t_flags & SVC_STOPPING) - break; - thread->t_flags &= ~SVC_EVENT; - - if (cfs_time_before(cfs_time_current(), mdt->mdt_ck_expiry)) - break; - - *tmp = *rkey; - make_capa_key(tmp, mdsnum, rkey->lk_keyid); - - next = mdt->mdt_child; - rc = next->md_ops->mdo_update_capa_key(&env, next, tmp); - if (!rc) { - cfs_spin_lock(&capa_lock); - *bkey = *rkey; - *rkey = *tmp; - cfs_spin_unlock(&capa_lock); - - rc = write_capa_keys(&env, mdt, mdt->mdt_capa_keys); - if (rc) { - cfs_spin_lock(&capa_lock); - *rkey = *bkey; - memset(bkey, 0, sizeof(*bkey)); - cfs_spin_unlock(&capa_lock); - } else { - set_capa_key_expiry(mdt); - DEBUG_CAPA_KEY(D_SEC, rkey, "new"); - } - } - if (rc) { - DEBUG_CAPA_KEY(D_ERROR, rkey, "update failed for"); - /* next retry is in 300 sec */ - mdt->mdt_ck_expiry = jiffies + 300 * CFS_HZ; - } - - cfs_timer_arm(&mdt->mdt_ck_timer, mdt->mdt_ck_expiry); - CDEBUG(D_SEC, "mdt_ck_timer %lu\n", mdt->mdt_ck_expiry); - } - lu_env_fini(&env); - - thread->t_flags = SVC_STOPPED; - cfs_waitq_signal(&thread->t_ctl_waitq); - RETURN(0); + struct mdt_device *mdt = args; + struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; + struct lustre_capa_key *bkey = &mdt->mdt_capa_keys[0], + *rkey = &mdt->mdt_capa_keys[1]; + struct lustre_capa_key *tmp; + struct lu_env env; + struct mdt_thread_info *info; + struct md_device *next; + struct l_wait_info lwi = { 0 }; + u32 mdsnum; + int rc; + ENTRY; + + unshare_fs_struct(); + cfs_block_allsigs(); + + thread_set_flags(thread, SVC_RUNNING); + wake_up(&thread->t_ctl_waitq); + + rc = lu_env_init(&env, LCT_MD_THREAD|LCT_REMEMBER|LCT_NOREF); + if (rc) + RETURN(rc); + + thread->t_env = &env; + env.le_ctx.lc_thread = thread; + env.le_ctx.lc_cookie = 0x1; + + info = lu_context_key_get(&env.le_ctx, &mdt_thread_key); + LASSERT(info != NULL); + + tmp = &info->mti_capa_key; + mdsnum = mdt_seq_site(mdt)->ss_node_id; + while (1) { + l_wait_event(thread->t_ctl_waitq, + thread_is_stopping(thread) || + thread_is_event(thread), + &lwi); + + if (thread_is_stopping(thread)) + break; + thread_clear_flags(thread, SVC_EVENT); + + if (cfs_time_before(cfs_time_current(), mdt->mdt_ck_expiry)) + break; + + *tmp = *rkey; + make_capa_key(tmp, mdsnum, rkey->lk_keyid); + + next = mdt->mdt_child; + rc = next->md_ops->mdo_update_capa_key(&env, next, tmp); + if (!rc) { + spin_lock(&capa_lock); + *bkey = *rkey; + *rkey = *tmp; + spin_unlock(&capa_lock); + + rc = write_capa_keys(&env, mdt, mdt->mdt_capa_keys); + if (rc) { + spin_lock(&capa_lock); + *rkey = *bkey; + memset(bkey, 0, sizeof(*bkey)); + spin_unlock(&capa_lock); + } else { + set_capa_key_expiry(mdt); + DEBUG_CAPA_KEY(D_SEC, rkey, "new"); + } + } + if (rc) { + DEBUG_CAPA_KEY(D_ERROR, rkey, "update failed for"); + /* next retry is in 300 sec */ + mdt->mdt_ck_expiry = jiffies + + msecs_to_jiffies(300 * + MSEC_PER_SEC); + } + + cfs_timer_arm(&mdt->mdt_ck_timer, mdt->mdt_ck_expiry); + CDEBUG(D_SEC, "mdt_ck_timer %lu\n", mdt->mdt_ck_expiry); + } + lu_env_fini(&env); + + thread_set_flags(thread, SVC_STOPPED); + wake_up(&thread->t_ctl_waitq); + RETURN(0); } int mdt_ck_thread_start(struct mdt_device *mdt) { - struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; - int rc; - - cfs_waitq_init(&thread->t_ctl_waitq); - rc = cfs_kernel_thread(mdt_ck_thread_main, mdt, - (CLONE_VM | CLONE_FILES)); - if (rc < 0) { - CERROR("cannot start mdt_ck thread, rc = %d\n", rc); - return rc; - } - - l_cfs_wait_event(thread->t_ctl_waitq, thread->t_flags & SVC_RUNNING); - return 0; + struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; + struct task_struct *task; + + init_waitqueue_head(&thread->t_ctl_waitq); + task = kthread_run(mdt_ck_thread_main, mdt, "mdt_ck"); + if (IS_ERR(task)) { + CERROR("cannot start mdt_ck thread, rc = %ld\n", PTR_ERR(task)); + return PTR_ERR(task); + } + + l_wait_condition(thread->t_ctl_waitq, thread_is_running(thread)); + return 0; } void mdt_ck_thread_stop(struct mdt_device *mdt) { - struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; + struct ptlrpc_thread *thread = &mdt->mdt_ck_thread; - if (!(thread->t_flags & SVC_RUNNING)) - return; + if (!thread_is_running(thread)) + return; - thread->t_flags = SVC_STOPPING; - cfs_waitq_signal(&thread->t_ctl_waitq); - l_cfs_wait_event(thread->t_ctl_waitq, thread->t_flags & SVC_STOPPED); + thread_set_flags(thread, SVC_STOPPING); + wake_up(&thread->t_ctl_waitq); + l_wait_condition(thread->t_ctl_waitq, thread_is_stopped(thread)); }