From ba062b3363a40d91b943f8f8fe57dd058ce4a43f Mon Sep 17 00:00:00 2001 From: johann Date: Sat, 21 Mar 2009 08:47:03 +0000 Subject: [PATCH] Branch b_release_1_8_0 b=18800 i=johann (patch from HongChao) i=wangdi prevent use of uninitialized llog context during unlink. --- lustre/include/lustre_log.h | 2 ++ lustre/lov/lov_log.c | 9 +++++++-- lustre/mds/mds_log.c | 5 +++++ lustre/obdclass/llog_obd.c | 5 +++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lustre/include/lustre_log.h b/lustre/include/lustre_log.h index ad872a5..c7afc6f 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 2271253..f7e1570 100644 --- a/lustre/lov/lov_log.c +++ b/lustre/lov/lov_log.c @@ -116,9 +116,14 @@ 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); + + if (cctxt && cctxt->loc_flags & LLOG_CTXT_FLAG_UNINITIALIZED) + rc = -EAGAIN; + else + 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 b03b3f6..7fc07bd 100644 --- a/lustre/obdclass/llog_obd.c +++ b/lustre/obdclass/llog_obd.c @@ -59,6 +59,7 @@ static struct llog_ctxt* llog_new_ctxt(struct obd_device *obd) return NULL; ctxt->loc_obd = obd; + ctxt->loc_flags = LLOG_CTXT_FLAG_UNINITIALIZED; atomic_set(&ctxt->loc_refcount, 1); return ctxt; @@ -193,6 +194,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); -- 1.8.3.1