X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Ftarget.c;h=d0e99de3187ddbcff8c7ad0a2d5a3eb7b2406058;hb=69b4763882b4515ff4a1b9b223e522172fdb27f4;hp=97919417e4927f81babde530b0dbf837987f0140;hpb=829a444349dfef22111c056befd7d902b0f610e4;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/target.c b/lustre/ptlrpc/target.c index 9791941..d0e99de 100644 --- a/lustre/ptlrpc/target.c +++ b/lustre/ptlrpc/target.c @@ -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) @@ -545,32 +546,41 @@ void lut_cb_last_committed(struct lu_env *env, struct thandle *th, if (ccb->llcc_transno) CDEBUG(D_HA, "%s: transno "LPD64" is committed\n", ccb->llcc_lut->lut_obd->obd_name, ccb->llcc_transno); - cfs_list_del(&ccb->llcc_cb.dcb_linkage); OBD_FREE_PTR(ccb); } 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); + } + + if ((exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0) + /* report failure to force synchronous operation */ + return -EPERM; + + return rc; } EXPORT_SYMBOL(lut_last_commit_cb_add); @@ -597,29 +607,33 @@ void lut_cb_new_client(struct lu_env *env, struct thandle *th, cfs_spin_unlock(&ccb->lncc_exp->exp_lock); class_export_cb_put(ccb->lncc_exp); - cfs_list_del(&ccb->lncc_cb.dcb_linkage); OBD_FREE_PTR(ccb); } 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; } /** @@ -640,6 +654,11 @@ int lut_client_new(const struct lu_env *env, struct obd_export *exp) if (!strcmp(ted->ted_lcd->lcd_uuid, tg->lut_obd->obd_uuid.uuid)) RETURN(0); + cfs_mutex_init(&ted->ted_lcd_lock); + + if ((exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0) + RETURN(0); + /* the bitmap operations can handle cl_idx > sizeof(long) * 8, so * there's no need for extra complication here */ @@ -664,8 +683,6 @@ repeat: ted->ted_lr_off = tg->lut_lsd.lsd_client_start + idx * tg->lut_lsd.lsd_client_size; - cfs_mutex_init(&ted->ted_lcd_lock); - LASSERTF(ted->ted_lr_off > 0, "ted_lr_off = %llu\n", ted->ted_lr_off); CDEBUG(D_INFO, "%s: new client at index %d (%llu) with UUID '%s'\n", @@ -702,7 +719,8 @@ int lut_client_add(const struct lu_env *env, struct obd_export *exp, int idx) LASSERT(tg->lut_client_bitmap != NULL); LASSERTF(idx >= 0, "%d\n", idx); - if (!strcmp(ted->ted_lcd->lcd_uuid, tg->lut_obd->obd_uuid.uuid)) + if (!strcmp(ted->ted_lcd->lcd_uuid, tg->lut_obd->obd_uuid.uuid) || + (exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0) RETURN(0); if (cfs_test_and_set_bit(idx, tg->lut_client_bitmap)) { @@ -738,7 +756,8 @@ int lut_client_del(const struct lu_env *env, struct obd_export *exp) /* XXX if lcd_uuid were a real obd_uuid, I could use obd_uuid_equals */ if (!strcmp((char *)ted->ted_lcd->lcd_uuid, - (char *)tg->lut_obd->obd_uuid.uuid)) + (char *)tg->lut_obd->obd_uuid.uuid) || + (exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0) RETURN(0); CDEBUG(D_INFO, "%s: del client at idx %u, off %lld, UUID '%s'\n",