X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ffid%2Ffid_store.c;h=2226d5e2ce40cf102b17ae66e8708e920e57a287;hb=22a73afe70eaedabe337b8fba0dbd38a5cb19fe0;hp=ae88f59f85581ea91c36f2d2a068d1f1e95e3cff;hpb=70e80ade90af09300396706b8910e196a7928520;p=fs%2Flustre-release.git diff --git a/lustre/fid/fid_store.c b/lustre/fid/fid_store.c index ae88f59..2226d5e 100644 --- a/lustre/fid/fid_store.c +++ b/lustre/fid/fid_store.c @@ -16,8 +16,8 @@ * in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see [sun.com URL with a - * copy of GPLv2]. + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or @@ -26,7 +26,7 @@ * 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. */ /* @@ -62,9 +62,6 @@ #include "fid_internal.h" #ifdef __KERNEL__ -enum { - SEQ_TXN_STORE_CREDITS = 20 -}; static struct lu_buf *seq_store_buf(struct seq_thread_info *info) { @@ -76,47 +73,102 @@ static struct lu_buf *seq_store_buf(struct seq_thread_info *info) return buf; } +struct thandle *seq_store_trans_start(struct lu_server_seq *seq, + const struct lu_env *env, int credit, + int sync) +{ + struct seq_thread_info *info; + struct dt_device *dt_dev; + struct thandle *th; + ENTRY; + + dt_dev = lu2dt_dev(seq->lss_obj->do_lu.lo_dev); + info = lu_context_key_get(&env->le_ctx, &seq_thread_key); + LASSERT(info != NULL); + + txn_param_init(&info->sti_txn, credit); + if (sync) + txn_param_sync(&info->sti_txn); + + th = dt_dev->dd_ops->dt_trans_start(env, dt_dev, &info->sti_txn); + return th; +} + +void seq_store_trans_stop(struct lu_server_seq *seq, + const struct lu_env *env, + struct thandle *th) +{ + struct dt_device *dt_dev; + ENTRY; + + dt_dev = lu2dt_dev(seq->lss_obj->do_lu.lo_dev); + + dt_dev->dd_ops->dt_trans_stop(env, th); +} + /* This function implies that caller takes care about locking. */ int seq_store_write(struct lu_server_seq *seq, - const struct lu_env *env) + const struct lu_env *env, + struct thandle *th) { struct dt_object *dt_obj = seq->lss_obj; struct seq_thread_info *info; struct dt_device *dt_dev; - struct thandle *th; loff_t pos = 0; - int rc; - ENTRY; + int rc; + ENTRY; dt_dev = lu2dt_dev(seq->lss_obj->do_lu.lo_dev); info = lu_context_key_get(&env->le_ctx, &seq_thread_key); LASSERT(info != NULL); - /* Stub here, will fix it later. */ - txn_param_init(&info->sti_txn, SEQ_TXN_STORE_CREDITS); + /* Store ranges in le format. */ + range_cpu_to_le(&info->sti_space, &seq->lss_space); - th = dt_dev->dd_ops->dt_trans_start(env, dt_dev, &info->sti_txn); - if (!IS_ERR(th)) { - /* Store ranges in le format. */ - range_cpu_to_le(&info->sti_space, &seq->lss_space); - - rc = dt_obj->do_body_ops->dbo_write(env, dt_obj, - seq_store_buf(info), - &pos, th, BYPASS_CAPA); - if (rc == sizeof(info->sti_space)) { - CDEBUG(D_INFO, "%s: Space - "DRANGE"\n", - seq->lss_name, PRANGE(&seq->lss_space)); - rc = 0; - } else if (rc >= 0) { - rc = -EIO; - } + rc = dt_obj->do_body_ops->dbo_write(env, dt_obj, + seq_store_buf(info), + &pos, th, BYPASS_CAPA, 1); + if (rc == sizeof(info->sti_space)) { + CDEBUG(D_INFO, "%s: Space - "DRANGE"\n", + seq->lss_name, PRANGE(&seq->lss_space)); + rc = 0; + } else if (rc >= 0) { + rc = -EIO; + } - dt_dev->dd_ops->dt_trans_stop(env, th); - } else { - rc = PTR_ERR(th); + + RETURN(rc); +} + +int seq_store_update(const struct lu_env *env, struct lu_server_seq *seq, + struct lu_seq_range *out, int sync) +{ + struct thandle *th; + int rc; + int credits = SEQ_TXN_STORE_CREDITS; + + if (out != NULL) + credits += FLD_TXN_INDEX_INSERT_CREDITS; + + th = seq_store_trans_start(seq, env, credits, sync); + if (IS_ERR(th)) + RETURN(PTR_ERR(th)); + + rc = seq_store_write(seq, env, th); + if (rc) { + CERROR("%s: Can't write space data, rc %d\n", + seq->lss_name, rc); + } else if (out != NULL) { + rc = fld_server_create(seq->lss_site->ms_server_fld, + env, out, th); + if (rc) { + CERROR("%s: Can't Update fld database, rc %d\n", + seq->lss_name, rc); + } } - - RETURN(rc); + + seq_store_trans_stop(seq, env, th); + return rc; } /* @@ -129,8 +181,8 @@ int seq_store_read(struct lu_server_seq *seq, struct dt_object *dt_obj = seq->lss_obj; struct seq_thread_info *info; loff_t pos = 0; - int rc; - ENTRY; + int rc; + ENTRY; info = lu_context_key_get(&env->le_ctx, &seq_thread_key); LASSERT(info != NULL); @@ -151,7 +203,7 @@ int seq_store_read(struct lu_server_seq *seq, rc = -EIO; } - RETURN(rc); + RETURN(rc); } int seq_store_init(struct lu_server_seq *seq, @@ -167,13 +219,13 @@ int seq_store_init(struct lu_server_seq *seq, name = seq->lss_type == LUSTRE_SEQ_SERVER ? LUSTRE_SEQ_SRV_NAME : LUSTRE_SEQ_CTL_NAME; - dt_obj = dt_store_open(env, dt, name, &fid); + dt_obj = dt_store_open(env, dt, "", name, &fid); if (!IS_ERR(dt_obj)) { seq->lss_obj = dt_obj; - rc = 0; + rc = 0; } else { CERROR("%s: Can't find \"%s\" obj %d\n", - seq->lss_name, name, (int)PTR_ERR(dt_obj)); + seq->lss_name, name, (int)PTR_ERR(dt_obj)); rc = PTR_ERR(dt_obj); }