#define CFS_KFI_FAIL_RECV 0xF112
#define CFS_KFI_FAIL_MSG_UNPACK 0xF113
#define CFS_KFI_FAIL_MSG_TYPE 0xF114
+#define CFS_KFI_FAIL_WAIT_SEND_COMP1 0xF115
+#define CFS_KFI_FAIL_WAIT_SEND_COMP2 0xF116
/* Maximum number of transaction keys supported. */
#define KFILND_EP_KEY_BITS 16U
kfree(err);
}
-static int kfilnd_ep_gen_fake_err(struct kfilnd_ep *ep,
- const struct kfi_cq_err_entry *err)
+int kfilnd_ep_gen_fake_err(struct kfilnd_ep *ep,
+ const struct kfi_cq_err_entry *err)
{
struct kfilnd_ep_err_fail_loc_work *fake_err;
int kfilnd_ep_get_key(struct kfilnd_ep *ep);
void kfilnd_ep_put_key(struct kfilnd_ep *ep, unsigned int key);
+int kfilnd_ep_gen_fake_err(struct kfilnd_ep *ep,
+ const struct kfi_cq_err_entry *err);
#endif /* _KFILND_EP_ */
switch (event) {
case TN_EVENT_TX_OK:
+ if (unlikely(tn->msg_type == KFILND_MSG_BULK_PUT_REQ) &&
+ CFS_FAIL_CHECK_RESET(CFS_KFI_FAIL_WAIT_SEND_COMP1,
+ CFS_KFI_FAIL_WAIT_SEND_COMP2 |
+ CFS_FAIL_ONCE))
+ break;
kfilnd_peer_alive(tn->tn_kp);
kfilnd_tn_timeout_enable(tn);
kfilnd_tn_state_change(tn, TN_STATE_WAIT_TAG_COMP);
case TN_EVENT_TAG_RX_OK:
kfilnd_tn_state_change(tn, TN_STATE_WAIT_SEND_COMP);
+ if (unlikely(tn->msg_type == KFILND_MSG_BULK_PUT_REQ) &&
+ CFS_FAIL_CHECK(CFS_KFI_FAIL_WAIT_SEND_COMP2)) {
+ struct kfi_cq_err_entry fake_error = {
+ .op_context = tn,
+ .flags = KFI_MSG | KFI_SEND,
+ .err = EIO,
+ };
+
+ kfilnd_ep_gen_fake_err(tn->tn_ep, &fake_error);
+ }
break;
case TN_EVENT_TX_FAIL:
KFILND_TN_DEBUG(tn, "%s event status %d", tn_event_to_str(event),
status);
- if (event == TN_EVENT_TX_OK) {
+ switch (event) {
+ case TN_EVENT_TX_OK:
kfilnd_peer_alive(tn->tn_kp);
- kfilnd_tn_finalize(tn, tn_released);
- } else {
+ break;
+ case TN_EVENT_TX_FAIL:
+ kfilnd_tn_status_update(tn, status,
+ LNET_MSG_STATUS_NETWORK_TIMEOUT);
+ kfilnd_peer_tn_failed(tn->tn_kp, status);
+ break;
+ default:
KFILND_TN_ERROR(tn, "Invalid %s event", tn_event_to_str(event));
LBUG();
}
+ kfilnd_tn_finalize(tn, tn_released);
+
return 0;
}
}
run_test 310 "Set timeout and verify"
+test_311() {
+ [[ $NETTYPE == kfi* ]] ||
+ skip "Need kfi network type"
+
+ setupall || error "setupall failed"
+
+ mkdir -p $DIR/$tdir || error "mkdir failed"
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 oflag=direct ||
+ error "dd write failed"
+
+ local list=$(comma_list $(osts_nodes))
+
+#define CFS_KFI_FAIL_WAIT_SEND_COMP 0xF115
+ do_nodes $list $LCTL set_param fail_loc=0x8000F115
+ dd if=$DIR/$tdir/$tfile of=/dev/null bs=1M count=1 ||
+ error "dd read failed"
+
+ cleanupall || error "Failed cleanup"
+}
+run_test 311 "Fail bulk put in send wait completion"
check_udsp_prio() {
local target_net="${1}"