Whamcloud - gitweb
LU-1235 osd: debug patch for transaction commit callback
authorBobi Jam <bobijam@whamcloud.com>
Tue, 12 Jun 2012 09:31:12 +0000 (17:31 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 24 Jul 2012 14:16:38 +0000 (10:16 -0400)
During transaction commit phase, osd_trans_commit_cb accesses an
invalid memeroy, this patch insert some assertions to find out the
possible faulty point.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Idb39a6946fbd5d8a96ee6915f828f557ccebadb6
Reviewed-on: http://review.whamcloud.com/2394
Tested-by: Hudson
Reviewed-by: Mike Pershin <tappro@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Liang Zhen <liang@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/fid/fid_store.c
lustre/include/dt_object.h
lustre/osd-ldiskfs/osd_handler.c
lustre/ptlrpc/target.c

index 97f4867..648fe86 100644 (file)
@@ -76,12 +76,16 @@ struct seq_update_callback {
 };
 
 void seq_update_cb(struct lu_env *env, struct thandle *th,
-                   struct dt_txn_commit_cb *cb, int err)
+                  struct dt_txn_commit_cb *cb, int err)
 {
-        struct seq_update_callback *ccb;
-        ccb = container_of0(cb, struct seq_update_callback, suc_cb);
-        ccb->suc_seq->lss_need_sync = 0;
-        OBD_FREE_PTR(ccb);
+       struct seq_update_callback *ccb;
+
+       ccb = container_of0(cb, struct seq_update_callback, suc_cb);
+
+       LASSERT(ccb->suc_seq != NULL);
+
+       ccb->suc_seq->lss_need_sync = 0;
+       OBD_FREE_PTR(ccb);
 }
 
 struct thandle *seq_store_trans_create(struct lu_server_seq *seq,
@@ -106,20 +110,27 @@ int seq_store_trans_start(struct lu_server_seq *seq, const struct lu_env *env,
 
 int seq_update_cb_add(struct thandle *th, struct lu_server_seq *seq)
 {
-        struct seq_update_callback *ccb;
-        int rc;
-        OBD_ALLOC_PTR(ccb);
-        if (ccb == NULL)
-                return -ENOMEM;
-
-        ccb->suc_cb.dcb_func = seq_update_cb;
-        CFS_INIT_LIST_HEAD(&ccb->suc_cb.dcb_linkage);
-        ccb->suc_seq = seq;
-        seq->lss_need_sync = 1;
-        rc = dt_trans_cb_add(th, &ccb->suc_cb);
-        if (rc)
-                OBD_FREE_PTR(ccb);
-        return rc;
+       struct seq_update_callback *ccb;
+       struct dt_txn_commit_cb    *dcb;
+       int                        rc;
+
+       OBD_ALLOC_PTR(ccb);
+       if (ccb == NULL)
+               return -ENOMEM;
+
+       ccb->suc_seq       = seq;
+       seq->lss_need_sync = 1;
+
+       dcb            = &ccb->suc_cb;
+       dcb->dcb_func  = seq_update_cb;
+       CFS_INIT_LIST_HEAD(&dcb->dcb_linkage);
+       strncpy(dcb->dcb_name, "seq_update_cb", MAX_COMMIT_CB_STR_LEN);
+       dcb->dcb_name[MAX_COMMIT_CB_STR_LEN - 1] = '\0';
+
+       rc = dt_trans_cb_add(th, dcb);
+       if (rc)
+               OBD_FREE_PTR(ccb);
+       return rc;
 }
 
 int seq_declare_store_write(struct lu_server_seq *seq,
index f438bcb..f95563a 100644 (file)
@@ -102,9 +102,14 @@ typedef void (*dt_cb_t)(struct lu_env *env, struct thandle *th,
  * Special per-transaction callback for cases when just commit callback
  * is needed and per-device callback are not convenient to use
  */
+#define TRANS_COMMIT_CB_MAGIC  0xa0a00a0a
+#define MAX_COMMIT_CB_STR_LEN  32
+
 struct dt_txn_commit_cb {
-        cfs_list_t dcb_linkage;
-        dt_cb_t    dcb_func;
+       cfs_list_t      dcb_linkage;
+       dt_cb_t         dcb_func;
+       __u32           dcb_magic;
+       char            dcb_name[MAX_COMMIT_CB_STR_LEN];
 };
 
 /**
@@ -830,10 +835,11 @@ static inline int dt_trans_stop(const struct lu_env *env,
 }
 
 static inline int dt_trans_cb_add(struct thandle *th,
-                                  struct dt_txn_commit_cb *dcb)
+                                 struct dt_txn_commit_cb *dcb)
 {
-        LASSERT(th->th_dev->dd_ops->dt_trans_cb_add);
-        return th->th_dev->dd_ops->dt_trans_cb_add(th, dcb);
+       LASSERT(th->th_dev->dd_ops->dt_trans_cb_add);
+       dcb->dcb_magic = TRANS_COMMIT_CB_MAGIC;
+       return th->th_dev->dd_ops->dt_trans_cb_add(th, dcb);
 }
 /** @} dt */
 
index 9a388c7..2474f69 100644 (file)
@@ -715,6 +715,9 @@ static void osd_trans_commit_cb(struct journal_callback *jcb, int error)
 
        /* call per-transaction callbacks if any */
        cfs_list_for_each_entry_safe(dcb, tmp, &oh->ot_dcb_list, dcb_linkage) {
+               LASSERTF(dcb->dcb_magic == TRANS_COMMIT_CB_MAGIC,
+                        "commit callback entry: magic=%x name='%s'\n",
+                        dcb->dcb_magic, dcb->dcb_name);
                cfs_list_del_init(&dcb->dcb_linkage);
                dcb->dcb_func(NULL, th, dcb, error);
        }
@@ -918,12 +921,14 @@ static int osd_trans_stop(const struct lu_env *env, struct thandle *th)
 
 static int osd_trans_cb_add(struct thandle *th, struct dt_txn_commit_cb *dcb)
 {
-        struct osd_thandle *oh = container_of0(th, struct osd_thandle,
-                                               ot_super);
+       struct osd_thandle *oh = container_of0(th, struct osd_thandle,
+                                              ot_super);
 
-        cfs_list_add(&dcb->dcb_linkage, &oh->ot_dcb_list);
+       LASSERT(dcb->dcb_magic == TRANS_COMMIT_CB_MAGIC);
+       LASSERT(&dcb->dcb_func != NULL);
+       cfs_list_add(&dcb->dcb_linkage, &oh->ot_dcb_list);
 
-        return 0;
+       return 0;
 }
 
 /*
index f1347b0..c4dcb16 100644 (file)
@@ -527,7 +527,8 @@ void lut_cb_last_committed(struct lu_env *env, struct thandle *th,
 
         ccb = container_of0(cb, struct lut_last_committed_callback, llcc_cb);
 
-        LASSERT(ccb->llcc_exp->exp_obd == ccb->llcc_lut->lut_obd);
+       LASSERT(ccb->llcc_lut != NULL);
+       LASSERT(ccb->llcc_exp->exp_obd == ccb->llcc_lut->lut_obd);
 
         cfs_spin_lock(&ccb->llcc_lut->lut_translock);
         if (ccb->llcc_transno > ccb->llcc_lut->lut_obd->obd_last_committed)
@@ -551,25 +552,30 @@ void lut_cb_last_committed(struct lu_env *env, struct thandle *th,
 int lut_last_commit_cb_add(struct thandle *th, struct lu_target *lut,
                            struct obd_export *exp, __u64 transno)
 {
-        struct lut_last_committed_callback *ccb;
-        int rc;
+       struct lut_last_committed_callback *ccb;
+       struct dt_txn_commit_cb            *dcb;
+       int                                rc;
 
-        OBD_ALLOC_PTR(ccb);
-        if (ccb == NULL)
-                return -ENOMEM;
+       OBD_ALLOC_PTR(ccb);
+       if (ccb == NULL)
+               return -ENOMEM;
 
-        ccb->llcc_cb.dcb_func = lut_cb_last_committed;
-        CFS_INIT_LIST_HEAD(&ccb->llcc_cb.dcb_linkage);
-        ccb->llcc_lut = lut;
-        ccb->llcc_exp = class_export_cb_get(exp);
-        ccb->llcc_transno = transno;
+       ccb->llcc_lut     = lut;
+       ccb->llcc_exp     = class_export_cb_get(exp);
+       ccb->llcc_transno = transno;
 
-        rc = dt_trans_cb_add(th, &ccb->llcc_cb);
-        if (rc) {
-                class_export_cb_put(exp);
-                OBD_FREE_PTR(ccb);
-        }
-        return rc;
+       dcb            = &ccb->llcc_cb;
+       dcb->dcb_func  = lut_cb_last_committed;
+       CFS_INIT_LIST_HEAD(&dcb->dcb_linkage);
+       strncpy(dcb->dcb_name, "lut_cb_last_committed", MAX_COMMIT_CB_STR_LEN);
+       dcb->dcb_name[MAX_COMMIT_CB_STR_LEN - 1] = '\0';
+
+       rc = dt_trans_cb_add(th, dcb);
+       if (rc) {
+               class_export_cb_put(exp);
+               OBD_FREE_PTR(ccb);
+       }
+       return rc;
 }
 EXPORT_SYMBOL(lut_last_commit_cb_add);
 
@@ -601,23 +607,28 @@ void lut_cb_new_client(struct lu_env *env, struct thandle *th,
 
 int lut_new_client_cb_add(struct thandle *th, struct obd_export *exp)
 {
-        struct lut_new_client_callback *ccb;
-        int rc;
+       struct lut_new_client_callback *ccb;
+       struct dt_txn_commit_cb        *dcb;
+       int                            rc;
 
-        OBD_ALLOC_PTR(ccb);
-        if (ccb == NULL)
-                return -ENOMEM;
+       OBD_ALLOC_PTR(ccb);
+       if (ccb == NULL)
+               return -ENOMEM;
 
-        ccb->lncc_cb.dcb_func = lut_cb_new_client;
-        CFS_INIT_LIST_HEAD(&ccb->lncc_cb.dcb_linkage);
-        ccb->lncc_exp = class_export_cb_get(exp);
+       ccb->lncc_exp  = class_export_cb_get(exp);
 
-        rc = dt_trans_cb_add(th, &ccb->lncc_cb);
-        if (rc) {
-                class_export_cb_put(exp);
-                OBD_FREE_PTR(ccb);
-        }
-        return rc;
+       dcb            = &ccb->lncc_cb;
+       dcb->dcb_func  = lut_cb_new_client;
+       CFS_INIT_LIST_HEAD(&dcb->dcb_linkage);
+       strncpy(dcb->dcb_name, "lut_cb_new_client", MAX_COMMIT_CB_STR_LEN);
+       dcb->dcb_name[MAX_COMMIT_CB_STR_LEN - 1] = '\0';
+
+       rc = dt_trans_cb_add(th, dcb);
+       if (rc) {
+               class_export_cb_put(exp);
+               OBD_FREE_PTR(ccb);
+       }
+       return rc;
 }
 
 /**