0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "dlm_internal.h"
0013 #include "lockspace.h"
0014 #include "member.h"
0015 #include "lowcomms.h"
0016 #include "midcomms.h"
0017 #include "rcom.h"
0018 #include "recover.h"
0019 #include "dir.h"
0020 #include "config.h"
0021 #include "memory.h"
0022 #include "lock.h"
0023 #include "util.h"
0024
0025 static int rcom_response(struct dlm_ls *ls)
0026 {
0027 return test_bit(LSFL_RCOM_READY, &ls->ls_flags);
0028 }
0029
0030 static void _create_rcom(struct dlm_ls *ls, int to_nodeid, int type, int len,
0031 struct dlm_rcom **rc_ret, char *mb, int mb_len)
0032 {
0033 struct dlm_rcom *rc;
0034
0035 rc = (struct dlm_rcom *) mb;
0036
0037 rc->rc_header.h_version = cpu_to_le32(DLM_HEADER_MAJOR | DLM_HEADER_MINOR);
0038 rc->rc_header.u.h_lockspace = cpu_to_le32(ls->ls_global_id);
0039 rc->rc_header.h_nodeid = cpu_to_le32(dlm_our_nodeid());
0040 rc->rc_header.h_length = cpu_to_le16(mb_len);
0041 rc->rc_header.h_cmd = DLM_RCOM;
0042
0043 rc->rc_type = cpu_to_le32(type);
0044
0045 spin_lock(&ls->ls_recover_lock);
0046 rc->rc_seq = cpu_to_le64(ls->ls_recover_seq);
0047 spin_unlock(&ls->ls_recover_lock);
0048
0049 *rc_ret = rc;
0050 }
0051
0052 static int create_rcom(struct dlm_ls *ls, int to_nodeid, int type, int len,
0053 struct dlm_rcom **rc_ret, struct dlm_mhandle **mh_ret)
0054 {
0055 int mb_len = sizeof(struct dlm_rcom) + len;
0056 struct dlm_mhandle *mh;
0057 char *mb;
0058
0059 mh = dlm_midcomms_get_mhandle(to_nodeid, mb_len, GFP_NOFS, &mb);
0060 if (!mh) {
0061 log_print("%s to %d type %d len %d ENOBUFS",
0062 __func__, to_nodeid, type, len);
0063 return -ENOBUFS;
0064 }
0065
0066 _create_rcom(ls, to_nodeid, type, len, rc_ret, mb, mb_len);
0067 *mh_ret = mh;
0068 return 0;
0069 }
0070
0071 static int create_rcom_stateless(struct dlm_ls *ls, int to_nodeid, int type,
0072 int len, struct dlm_rcom **rc_ret,
0073 struct dlm_msg **msg_ret)
0074 {
0075 int mb_len = sizeof(struct dlm_rcom) + len;
0076 struct dlm_msg *msg;
0077 char *mb;
0078
0079 msg = dlm_lowcomms_new_msg(to_nodeid, mb_len, GFP_NOFS, &mb,
0080 NULL, NULL);
0081 if (!msg) {
0082 log_print("create_rcom to %d type %d len %d ENOBUFS",
0083 to_nodeid, type, len);
0084 return -ENOBUFS;
0085 }
0086
0087 _create_rcom(ls, to_nodeid, type, len, rc_ret, mb, mb_len);
0088 *msg_ret = msg;
0089 return 0;
0090 }
0091
0092 static void send_rcom(struct dlm_mhandle *mh, struct dlm_rcom *rc)
0093 {
0094 dlm_midcomms_commit_mhandle(mh);
0095 }
0096
0097 static void send_rcom_stateless(struct dlm_msg *msg, struct dlm_rcom *rc)
0098 {
0099 dlm_lowcomms_commit_msg(msg);
0100 dlm_lowcomms_put_msg(msg);
0101 }
0102
0103 static void set_rcom_status(struct dlm_ls *ls, struct rcom_status *rs,
0104 uint32_t flags)
0105 {
0106 rs->rs_flags = cpu_to_le32(flags);
0107 }
0108
0109
0110
0111
0112
0113 static void set_rcom_config(struct dlm_ls *ls, struct rcom_config *rf,
0114 uint32_t num_slots)
0115 {
0116 rf->rf_lvblen = cpu_to_le32(ls->ls_lvblen);
0117 rf->rf_lsflags = cpu_to_le32(ls->ls_exflags);
0118
0119 rf->rf_our_slot = cpu_to_le16(ls->ls_slot);
0120 rf->rf_num_slots = cpu_to_le16(num_slots);
0121 rf->rf_generation = cpu_to_le32(ls->ls_generation);
0122 }
0123
0124 static int check_rcom_config(struct dlm_ls *ls, struct dlm_rcom *rc, int nodeid)
0125 {
0126 struct rcom_config *rf = (struct rcom_config *) rc->rc_buf;
0127
0128 if ((le32_to_cpu(rc->rc_header.h_version) & 0xFFFF0000) != DLM_HEADER_MAJOR) {
0129 log_error(ls, "version mismatch: %x nodeid %d: %x",
0130 DLM_HEADER_MAJOR | DLM_HEADER_MINOR, nodeid,
0131 le32_to_cpu(rc->rc_header.h_version));
0132 return -EPROTO;
0133 }
0134
0135 if (le32_to_cpu(rf->rf_lvblen) != ls->ls_lvblen ||
0136 le32_to_cpu(rf->rf_lsflags) != ls->ls_exflags) {
0137 log_error(ls, "config mismatch: %d,%x nodeid %d: %d,%x",
0138 ls->ls_lvblen, ls->ls_exflags, nodeid,
0139 le32_to_cpu(rf->rf_lvblen),
0140 le32_to_cpu(rf->rf_lsflags));
0141 return -EPROTO;
0142 }
0143 return 0;
0144 }
0145
0146 static void allow_sync_reply(struct dlm_ls *ls, __le64 *new_seq)
0147 {
0148 spin_lock(&ls->ls_rcom_spin);
0149 *new_seq = cpu_to_le64(++ls->ls_rcom_seq);
0150 set_bit(LSFL_RCOM_WAIT, &ls->ls_flags);
0151 spin_unlock(&ls->ls_rcom_spin);
0152 }
0153
0154 static void disallow_sync_reply(struct dlm_ls *ls)
0155 {
0156 spin_lock(&ls->ls_rcom_spin);
0157 clear_bit(LSFL_RCOM_WAIT, &ls->ls_flags);
0158 clear_bit(LSFL_RCOM_READY, &ls->ls_flags);
0159 spin_unlock(&ls->ls_rcom_spin);
0160 }
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173 int dlm_rcom_status(struct dlm_ls *ls, int nodeid, uint32_t status_flags)
0174 {
0175 struct dlm_rcom *rc;
0176 struct dlm_msg *msg;
0177 int error = 0;
0178
0179 ls->ls_recover_nodeid = nodeid;
0180
0181 if (nodeid == dlm_our_nodeid()) {
0182 rc = ls->ls_recover_buf;
0183 rc->rc_result = cpu_to_le32(dlm_recover_status(ls));
0184 goto out;
0185 }
0186
0187 retry:
0188 error = create_rcom_stateless(ls, nodeid, DLM_RCOM_STATUS,
0189 sizeof(struct rcom_status), &rc, &msg);
0190 if (error)
0191 goto out;
0192
0193 set_rcom_status(ls, (struct rcom_status *)rc->rc_buf, status_flags);
0194
0195 allow_sync_reply(ls, &rc->rc_id);
0196 memset(ls->ls_recover_buf, 0, DLM_MAX_SOCKET_BUFSIZE);
0197
0198 send_rcom_stateless(msg, rc);
0199
0200 error = dlm_wait_function(ls, &rcom_response);
0201 disallow_sync_reply(ls);
0202 if (error == -ETIMEDOUT)
0203 goto retry;
0204 if (error)
0205 goto out;
0206
0207 rc = ls->ls_recover_buf;
0208
0209 if (rc->rc_result == cpu_to_le32(-ESRCH)) {
0210
0211 log_debug(ls, "remote node %d not ready", nodeid);
0212 rc->rc_result = 0;
0213 error = 0;
0214 } else {
0215 error = check_rcom_config(ls, rc, nodeid);
0216 }
0217
0218
0219 out:
0220 return error;
0221 }
0222
0223 static void receive_rcom_status(struct dlm_ls *ls, struct dlm_rcom *rc_in)
0224 {
0225 struct dlm_rcom *rc;
0226 struct rcom_status *rs;
0227 uint32_t status;
0228 int nodeid = le32_to_cpu(rc_in->rc_header.h_nodeid);
0229 int len = sizeof(struct rcom_config);
0230 struct dlm_msg *msg;
0231 int num_slots = 0;
0232 int error;
0233
0234 if (!dlm_slots_version(&rc_in->rc_header)) {
0235 status = dlm_recover_status(ls);
0236 goto do_create;
0237 }
0238
0239 rs = (struct rcom_status *)rc_in->rc_buf;
0240
0241 if (!(le32_to_cpu(rs->rs_flags) & DLM_RSF_NEED_SLOTS)) {
0242 status = dlm_recover_status(ls);
0243 goto do_create;
0244 }
0245
0246 spin_lock(&ls->ls_recover_lock);
0247 status = ls->ls_recover_status;
0248 num_slots = ls->ls_num_slots;
0249 spin_unlock(&ls->ls_recover_lock);
0250 len += num_slots * sizeof(struct rcom_slot);
0251
0252 do_create:
0253 error = create_rcom_stateless(ls, nodeid, DLM_RCOM_STATUS_REPLY,
0254 len, &rc, &msg);
0255 if (error)
0256 return;
0257
0258 rc->rc_id = rc_in->rc_id;
0259 rc->rc_seq_reply = rc_in->rc_seq;
0260 rc->rc_result = cpu_to_le32(status);
0261
0262 set_rcom_config(ls, (struct rcom_config *)rc->rc_buf, num_slots);
0263
0264 if (!num_slots)
0265 goto do_send;
0266
0267 spin_lock(&ls->ls_recover_lock);
0268 if (ls->ls_num_slots != num_slots) {
0269 spin_unlock(&ls->ls_recover_lock);
0270 log_debug(ls, "receive_rcom_status num_slots %d to %d",
0271 num_slots, ls->ls_num_slots);
0272 rc->rc_result = 0;
0273 set_rcom_config(ls, (struct rcom_config *)rc->rc_buf, 0);
0274 goto do_send;
0275 }
0276
0277 dlm_slots_copy_out(ls, rc);
0278 spin_unlock(&ls->ls_recover_lock);
0279
0280 do_send:
0281 send_rcom_stateless(msg, rc);
0282 }
0283
0284 static void receive_sync_reply(struct dlm_ls *ls, struct dlm_rcom *rc_in)
0285 {
0286 spin_lock(&ls->ls_rcom_spin);
0287 if (!test_bit(LSFL_RCOM_WAIT, &ls->ls_flags) ||
0288 le64_to_cpu(rc_in->rc_id) != ls->ls_rcom_seq) {
0289 log_debug(ls, "reject reply %d from %d seq %llx expect %llx",
0290 le32_to_cpu(rc_in->rc_type),
0291 le32_to_cpu(rc_in->rc_header.h_nodeid),
0292 (unsigned long long)le64_to_cpu(rc_in->rc_id),
0293 (unsigned long long)ls->ls_rcom_seq);
0294 goto out;
0295 }
0296 memcpy(ls->ls_recover_buf, rc_in,
0297 le16_to_cpu(rc_in->rc_header.h_length));
0298 set_bit(LSFL_RCOM_READY, &ls->ls_flags);
0299 clear_bit(LSFL_RCOM_WAIT, &ls->ls_flags);
0300 wake_up(&ls->ls_wait_general);
0301 out:
0302 spin_unlock(&ls->ls_rcom_spin);
0303 }
0304
0305 int dlm_rcom_names(struct dlm_ls *ls, int nodeid, char *last_name, int last_len)
0306 {
0307 struct dlm_rcom *rc;
0308 struct dlm_msg *msg;
0309 int error = 0;
0310
0311 ls->ls_recover_nodeid = nodeid;
0312
0313 retry:
0314 error = create_rcom_stateless(ls, nodeid, DLM_RCOM_NAMES, last_len,
0315 &rc, &msg);
0316 if (error)
0317 goto out;
0318 memcpy(rc->rc_buf, last_name, last_len);
0319
0320 allow_sync_reply(ls, &rc->rc_id);
0321 memset(ls->ls_recover_buf, 0, DLM_MAX_SOCKET_BUFSIZE);
0322
0323 send_rcom_stateless(msg, rc);
0324
0325 error = dlm_wait_function(ls, &rcom_response);
0326 disallow_sync_reply(ls);
0327 if (error == -ETIMEDOUT)
0328 goto retry;
0329 out:
0330 return error;
0331 }
0332
0333 static void receive_rcom_names(struct dlm_ls *ls, struct dlm_rcom *rc_in)
0334 {
0335 struct dlm_rcom *rc;
0336 int error, inlen, outlen, nodeid;
0337 struct dlm_msg *msg;
0338
0339 nodeid = le32_to_cpu(rc_in->rc_header.h_nodeid);
0340 inlen = le16_to_cpu(rc_in->rc_header.h_length) -
0341 sizeof(struct dlm_rcom);
0342 outlen = DLM_MAX_APP_BUFSIZE - sizeof(struct dlm_rcom);
0343
0344 error = create_rcom_stateless(ls, nodeid, DLM_RCOM_NAMES_REPLY, outlen,
0345 &rc, &msg);
0346 if (error)
0347 return;
0348 rc->rc_id = rc_in->rc_id;
0349 rc->rc_seq_reply = rc_in->rc_seq;
0350
0351 dlm_copy_master_names(ls, rc_in->rc_buf, inlen, rc->rc_buf, outlen,
0352 nodeid);
0353 send_rcom_stateless(msg, rc);
0354 }
0355
0356 int dlm_send_rcom_lookup(struct dlm_rsb *r, int dir_nodeid)
0357 {
0358 struct dlm_rcom *rc;
0359 struct dlm_mhandle *mh;
0360 struct dlm_ls *ls = r->res_ls;
0361 int error;
0362
0363 error = create_rcom(ls, dir_nodeid, DLM_RCOM_LOOKUP, r->res_length,
0364 &rc, &mh);
0365 if (error)
0366 goto out;
0367 memcpy(rc->rc_buf, r->res_name, r->res_length);
0368 rc->rc_id = cpu_to_le64(r->res_id);
0369
0370 send_rcom(mh, rc);
0371 out:
0372 return error;
0373 }
0374
0375 static void receive_rcom_lookup(struct dlm_ls *ls, struct dlm_rcom *rc_in)
0376 {
0377 struct dlm_rcom *rc;
0378 struct dlm_mhandle *mh;
0379 int error, ret_nodeid, nodeid = le32_to_cpu(rc_in->rc_header.h_nodeid);
0380 int len = le16_to_cpu(rc_in->rc_header.h_length) -
0381 sizeof(struct dlm_rcom);
0382
0383
0384 if (rc_in->rc_id == cpu_to_le64(0xFFFFFFFF)) {
0385 log_error(ls, "receive_rcom_lookup dump from %d", nodeid);
0386 dlm_dump_rsb_name(ls, rc_in->rc_buf, len);
0387 return;
0388 }
0389
0390 error = create_rcom(ls, nodeid, DLM_RCOM_LOOKUP_REPLY, 0, &rc, &mh);
0391 if (error)
0392 return;
0393
0394 error = dlm_master_lookup(ls, nodeid, rc_in->rc_buf, len,
0395 DLM_LU_RECOVER_MASTER, &ret_nodeid, NULL);
0396 if (error)
0397 ret_nodeid = error;
0398 rc->rc_result = cpu_to_le32(ret_nodeid);
0399 rc->rc_id = rc_in->rc_id;
0400 rc->rc_seq_reply = rc_in->rc_seq;
0401
0402 send_rcom(mh, rc);
0403 }
0404
0405 static void receive_rcom_lookup_reply(struct dlm_ls *ls, struct dlm_rcom *rc_in)
0406 {
0407 dlm_recover_master_reply(ls, rc_in);
0408 }
0409
0410 static void pack_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb,
0411 struct rcom_lock *rl)
0412 {
0413 memset(rl, 0, sizeof(*rl));
0414
0415 rl->rl_ownpid = cpu_to_le32(lkb->lkb_ownpid);
0416 rl->rl_lkid = cpu_to_le32(lkb->lkb_id);
0417 rl->rl_exflags = cpu_to_le32(lkb->lkb_exflags);
0418 rl->rl_flags = cpu_to_le32(lkb->lkb_flags);
0419 rl->rl_lvbseq = cpu_to_le32(lkb->lkb_lvbseq);
0420 rl->rl_rqmode = lkb->lkb_rqmode;
0421 rl->rl_grmode = lkb->lkb_grmode;
0422 rl->rl_status = lkb->lkb_status;
0423 rl->rl_wait_type = cpu_to_le16(lkb->lkb_wait_type);
0424
0425 if (lkb->lkb_bastfn)
0426 rl->rl_asts |= DLM_CB_BAST;
0427 if (lkb->lkb_astfn)
0428 rl->rl_asts |= DLM_CB_CAST;
0429
0430 rl->rl_namelen = cpu_to_le16(r->res_length);
0431 memcpy(rl->rl_name, r->res_name, r->res_length);
0432
0433
0434
0435
0436 if (lkb->lkb_lvbptr)
0437 memcpy(rl->rl_lvb, lkb->lkb_lvbptr, r->res_ls->ls_lvblen);
0438 }
0439
0440 int dlm_send_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
0441 {
0442 struct dlm_ls *ls = r->res_ls;
0443 struct dlm_rcom *rc;
0444 struct dlm_mhandle *mh;
0445 struct rcom_lock *rl;
0446 int error, len = sizeof(struct rcom_lock);
0447
0448 if (lkb->lkb_lvbptr)
0449 len += ls->ls_lvblen;
0450
0451 error = create_rcom(ls, r->res_nodeid, DLM_RCOM_LOCK, len, &rc, &mh);
0452 if (error)
0453 goto out;
0454
0455 rl = (struct rcom_lock *) rc->rc_buf;
0456 pack_rcom_lock(r, lkb, rl);
0457 rc->rc_id = cpu_to_le64((uintptr_t)r);
0458
0459 send_rcom(mh, rc);
0460 out:
0461 return error;
0462 }
0463
0464
0465 static void receive_rcom_lock(struct dlm_ls *ls, struct dlm_rcom *rc_in)
0466 {
0467 struct dlm_rcom *rc;
0468 struct dlm_mhandle *mh;
0469 int error, nodeid = le32_to_cpu(rc_in->rc_header.h_nodeid);
0470
0471 dlm_recover_master_copy(ls, rc_in);
0472
0473 error = create_rcom(ls, nodeid, DLM_RCOM_LOCK_REPLY,
0474 sizeof(struct rcom_lock), &rc, &mh);
0475 if (error)
0476 return;
0477
0478
0479
0480
0481 memcpy(rc->rc_buf, rc_in->rc_buf, sizeof(struct rcom_lock));
0482 rc->rc_id = rc_in->rc_id;
0483 rc->rc_seq_reply = rc_in->rc_seq;
0484
0485 send_rcom(mh, rc);
0486 }
0487
0488
0489
0490
0491 int dlm_send_ls_not_ready(int nodeid, struct dlm_rcom *rc_in)
0492 {
0493 struct dlm_rcom *rc;
0494 struct rcom_config *rf;
0495 struct dlm_mhandle *mh;
0496 char *mb;
0497 int mb_len = sizeof(struct dlm_rcom) + sizeof(struct rcom_config);
0498
0499 mh = dlm_midcomms_get_mhandle(nodeid, mb_len, GFP_NOFS, &mb);
0500 if (!mh)
0501 return -ENOBUFS;
0502
0503 rc = (struct dlm_rcom *) mb;
0504
0505 rc->rc_header.h_version = cpu_to_le32(DLM_HEADER_MAJOR | DLM_HEADER_MINOR);
0506 rc->rc_header.u.h_lockspace = rc_in->rc_header.u.h_lockspace;
0507 rc->rc_header.h_nodeid = cpu_to_le32(dlm_our_nodeid());
0508 rc->rc_header.h_length = cpu_to_le16(mb_len);
0509 rc->rc_header.h_cmd = DLM_RCOM;
0510
0511 rc->rc_type = cpu_to_le32(DLM_RCOM_STATUS_REPLY);
0512 rc->rc_id = rc_in->rc_id;
0513 rc->rc_seq_reply = rc_in->rc_seq;
0514 rc->rc_result = cpu_to_le32(-ESRCH);
0515
0516 rf = (struct rcom_config *) rc->rc_buf;
0517 rf->rf_lvblen = cpu_to_le32(~0U);
0518
0519 dlm_midcomms_commit_mhandle(mh);
0520
0521 return 0;
0522 }
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569 void dlm_receive_rcom(struct dlm_ls *ls, struct dlm_rcom *rc, int nodeid)
0570 {
0571 int lock_size = sizeof(struct dlm_rcom) + sizeof(struct rcom_lock);
0572 int stop, reply = 0, names = 0, lookup = 0, lock = 0;
0573 uint32_t status;
0574 uint64_t seq;
0575
0576 switch (rc->rc_type) {
0577 case cpu_to_le32(DLM_RCOM_STATUS_REPLY):
0578 reply = 1;
0579 break;
0580 case cpu_to_le32(DLM_RCOM_NAMES):
0581 names = 1;
0582 break;
0583 case cpu_to_le32(DLM_RCOM_NAMES_REPLY):
0584 names = 1;
0585 reply = 1;
0586 break;
0587 case cpu_to_le32(DLM_RCOM_LOOKUP):
0588 lookup = 1;
0589 break;
0590 case cpu_to_le32(DLM_RCOM_LOOKUP_REPLY):
0591 lookup = 1;
0592 reply = 1;
0593 break;
0594 case cpu_to_le32(DLM_RCOM_LOCK):
0595 lock = 1;
0596 break;
0597 case cpu_to_le32(DLM_RCOM_LOCK_REPLY):
0598 lock = 1;
0599 reply = 1;
0600 break;
0601 }
0602
0603 spin_lock(&ls->ls_recover_lock);
0604 status = ls->ls_recover_status;
0605 stop = dlm_recovery_stopped(ls);
0606 seq = ls->ls_recover_seq;
0607 spin_unlock(&ls->ls_recover_lock);
0608
0609 if (stop && (rc->rc_type != cpu_to_le32(DLM_RCOM_STATUS)))
0610 goto ignore;
0611
0612 if (reply && (le64_to_cpu(rc->rc_seq_reply) != seq))
0613 goto ignore;
0614
0615 if (!(status & DLM_RS_NODES) && (names || lookup || lock))
0616 goto ignore;
0617
0618 if (!(status & DLM_RS_DIR) && (lookup || lock))
0619 goto ignore;
0620
0621 switch (rc->rc_type) {
0622 case cpu_to_le32(DLM_RCOM_STATUS):
0623 receive_rcom_status(ls, rc);
0624 break;
0625
0626 case cpu_to_le32(DLM_RCOM_NAMES):
0627 receive_rcom_names(ls, rc);
0628 break;
0629
0630 case cpu_to_le32(DLM_RCOM_LOOKUP):
0631 receive_rcom_lookup(ls, rc);
0632 break;
0633
0634 case cpu_to_le32(DLM_RCOM_LOCK):
0635 if (le16_to_cpu(rc->rc_header.h_length) < lock_size)
0636 goto Eshort;
0637 receive_rcom_lock(ls, rc);
0638 break;
0639
0640 case cpu_to_le32(DLM_RCOM_STATUS_REPLY):
0641 receive_sync_reply(ls, rc);
0642 break;
0643
0644 case cpu_to_le32(DLM_RCOM_NAMES_REPLY):
0645 receive_sync_reply(ls, rc);
0646 break;
0647
0648 case cpu_to_le32(DLM_RCOM_LOOKUP_REPLY):
0649 receive_rcom_lookup_reply(ls, rc);
0650 break;
0651
0652 case cpu_to_le32(DLM_RCOM_LOCK_REPLY):
0653 if (le16_to_cpu(rc->rc_header.h_length) < lock_size)
0654 goto Eshort;
0655 dlm_recover_process_copy(ls, rc);
0656 break;
0657
0658 default:
0659 log_error(ls, "receive_rcom bad type %d",
0660 le32_to_cpu(rc->rc_type));
0661 }
0662 return;
0663
0664 ignore:
0665 log_limit(ls, "dlm_receive_rcom ignore msg %d "
0666 "from %d %llu %llu recover seq %llu sts %x gen %u",
0667 le32_to_cpu(rc->rc_type),
0668 nodeid,
0669 (unsigned long long)le64_to_cpu(rc->rc_seq),
0670 (unsigned long long)le64_to_cpu(rc->rc_seq_reply),
0671 (unsigned long long)seq,
0672 status, ls->ls_generation);
0673 return;
0674 Eshort:
0675 log_error(ls, "recovery message %d from %d is too short",
0676 le32_to_cpu(rc->rc_type), nodeid);
0677 }
0678