Whamcloud - gitweb
b=18800
authorzhanghc <zhanghc>
Wed, 13 May 2009 07:49:51 +0000 (07:49 +0000)
committerzhanghc <zhanghc>
Wed, 13 May 2009 07:49:51 +0000 (07:49 +0000)
add flag during create llog_ctxt to fix
a bug caused by using uninitialized llog_ctxt

i=johann
i=wangdi

lustre/include/lustre_log.h
lustre/lov/lov_log.c
lustre/mds/mds_log.c
lustre/obdclass/llog_obd.c

index ad872a5..1b1333a 100644 (file)
@@ -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
index 44c881e..57f5ce7 100644 (file)
@@ -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);
index ca76e09..ae85df1 100644 (file)
@@ -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);
 
index e2be6c8..469fd15 100644 (file)
@@ -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);