From: zhanghc Date: Wed, 13 May 2009 07:49:51 +0000 (+0000) Subject: b=18800 X-Git-Tag: v1_8_2_01~1^2~450 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=642ba67ff639266efdd29713c730fce2b249977d;p=fs%2Flustre-release.git b=18800 add flag during create llog_ctxt to fix a bug caused by using uninitialized llog_ctxt i=johann i=wangdi --- diff --git a/lustre/include/lustre_log.h b/lustre/include/lustre_log.h index ad872a5..1b1333a 100644 --- a/lustre/include/lustre_log.h +++ b/lustre/include/lustre_log.h @@ -251,6 +251,7 @@ int llog_get_cat_list(struct obd_device *obd, struct obd_device *disk_obd, int llog_put_cat_list(struct obd_device *obd, struct obd_device *disk_obd, char *name, int idx, int count, struct llog_catid *idarray); +#define LLOG_CTXT_FLAG_UNINITIALIZED 0x00000001 struct llog_ctxt { int loc_idx; /* my index the obd array of ctxt's */ struct llog_gen loc_gen; @@ -265,6 +266,7 @@ struct llog_ctxt { atomic_t loc_refcount; struct llog_commit_master *loc_lcm; void *llog_proc_cb; + long loc_flags; /* flags, see above defines */ }; #define LCM_NAME_SIZE 64 diff --git a/lustre/lov/lov_log.c b/lustre/lov/lov_log.c index 44c881e..57f5ce7 100644 --- a/lustre/lov/lov_log.c +++ b/lustre/lov/lov_log.c @@ -116,9 +116,17 @@ static int lov_llog_origin_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec, llog_ctxt_put(cctxt); cctxt = NULL; } - rc = llog_add(cctxt, rec, NULL, logcookies + cookies, - numcookies - cookies); - llog_ctxt_put(cctxt); + + if (cctxt && cctxt->loc_flags & LLOG_CTXT_FLAG_UNINITIALIZED) { + llog_ctxt_put(cctxt); + rc = -EAGAIN; + } else { + /* "cctxt == NULL" will be checked in llog_add */ + rc = llog_add(cctxt, rec, NULL, logcookies + cookies, + numcookies - cookies); + llog_ctxt_put(cctxt); + } + if (rc < 0) { CERROR("Can't add llog (rc = %d) for stripe %i\n", rc, cookies); diff --git a/lustre/mds/mds_log.c b/lustre/mds/mds_log.c index ca76e09..ae85df1 100644 --- a/lustre/mds/mds_log.c +++ b/lustre/mds/mds_log.c @@ -66,6 +66,11 @@ static int mds_llog_origin_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec, ENTRY; lctxt = llog_get_context(lov_obd, ctxt->loc_idx); + if (lctxt && lctxt->loc_flags & LLOG_CTXT_FLAG_UNINITIALIZED) { + llog_ctxt_put(lctxt); + RETURN(-EAGAIN); + } + /* "lctxt == NULL" will be checked in llog_add */ rc = llog_add(lctxt, rec, lsm, logcookies, numcookies); llog_ctxt_put(lctxt); diff --git a/lustre/obdclass/llog_obd.c b/lustre/obdclass/llog_obd.c index e2be6c8..469fd15 100644 --- a/lustre/obdclass/llog_obd.c +++ b/lustre/obdclass/llog_obd.c @@ -60,6 +60,7 @@ static struct llog_ctxt* llog_new_ctxt(struct obd_device *obd) ctxt->loc_obd = obd; atomic_set(&ctxt->loc_refcount, 1); + ctxt->loc_flags = LLOG_CTXT_FLAG_UNINITIALIZED; return ctxt; } @@ -194,6 +195,10 @@ int llog_setup(struct obd_device *obd, int index, struct obd_device *disk_obd, CERROR("obd %s ctxt %d lop_setup=%p failed %d\n", obd->obd_name, index, op->lop_setup, rc); llog_ctxt_put(ctxt); + } else { + CDEBUG(D_CONFIG, "obd %s ctxt %d is initialized\n", + obd->obd_name, index); + ctxt->loc_flags &= ~LLOG_CTXT_FLAG_UNINITIALIZED; } out: mutex_up(&obd->obd_llog_alloc);