Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drbd: Improved logging of state changes

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>

+32 -15
+30 -14
drivers/block/drbd/drbd_state.c
··· 384 384 char *pbp; 385 385 pbp = pb; 386 386 *pbp = 0; 387 + 387 388 if (ns.role != os.role && flags & CS_DC_ROLE) 388 389 pbp += sprintf(pbp, "role( %s -> %s ) ", 389 390 drbd_role_str(os.role), ··· 405 404 pbp += sprintf(pbp, "pdsk( %s -> %s ) ", 406 405 drbd_disk_str(os.pdsk), 407 406 drbd_disk_str(ns.pdsk)); 408 - if (is_susp(ns) != is_susp(os)) 409 - pbp += sprintf(pbp, "susp( %d -> %d ) ", 410 - is_susp(os), 411 - is_susp(ns)); 407 + 408 + return pbp - pb; 409 + } 410 + 411 + static void drbd_pr_state_change(struct drbd_conf *mdev, union drbd_state os, union drbd_state ns, 412 + enum chg_state_flags flags) 413 + { 414 + char pb[300]; 415 + char *pbp = pb; 416 + 417 + pbp += print_state_change(pbp, os, ns, flags ^ CS_DC_MASK); 418 + 412 419 if (ns.aftr_isp != os.aftr_isp) 413 420 pbp += sprintf(pbp, "aftr_isp( %d -> %d ) ", 414 421 os.aftr_isp, ··· 430 421 os.user_isp, 431 422 ns.user_isp); 432 423 433 - return pbp - pb; 434 - } 435 - 436 - static void drbd_pr_state_change(struct drbd_conf *mdev, union drbd_state os, union drbd_state ns, 437 - enum chg_state_flags flags) 438 - { 439 - char pb[300]; 440 - 441 - if (print_state_change(pb, os, ns, flags ^ CS_DC_MASK)) 424 + if (pbp != pb) 442 425 dev_info(DEV, "%s\n", pb); 443 426 } 444 427 ··· 438 437 enum chg_state_flags flags) 439 438 { 440 439 char pb[300]; 440 + char *pbp = pb; 441 441 442 - if (print_state_change(pb, os, ns, flags)) 442 + pbp += print_state_change(pbp, os, ns, flags); 443 + 444 + if (is_susp(ns) != is_susp(os) && flags & CS_DC_SUSP) 445 + pbp += sprintf(pbp, "susp( %d -> %d ) ", 446 + is_susp(os), 447 + is_susp(ns)); 448 + 449 + if (pbp != pb) 443 450 conn_info(tconn, "%s\n", pb); 444 451 } 445 452 ··· 884 875 dev_warn(DEV, "%s aborted.\n", warn_sync_abort); 885 876 886 877 drbd_pr_state_change(mdev, os, ns, flags); 878 + 879 + /* Display changes to the susp* flags that where caused by the call to 880 + sanitize_state(). Only display it here if we where not called from 881 + _conn_request_state() */ 882 + if (!(flags & CS_DC_SUSP)) 883 + conn_pr_state_change(mdev->tconn, os, ns, (flags & ~CS_DC_MASK) | CS_DC_SUSP); 887 884 888 885 /* if we are going -> D_FAILED or D_DISKLESS, grab one extra reference 889 886 * on the ldev here, to be sure the transition -> D_DISKLESS resp. ··· 1643 1628 } 1644 1629 1645 1630 conn_old_common_state(tconn, &os, &flags); 1631 + flags |= CS_DC_SUSP; 1646 1632 conn_set_state(tconn, mask, val, &ns_min, &ns_max, flags); 1647 1633 conn_pr_state_change(tconn, os, ns_max, flags); 1648 1634
+2 -1
drivers/block/drbd/drbd_state.h
··· 68 68 CS_DC_CONN = 1 << 7, 69 69 CS_DC_DISK = 1 << 8, 70 70 CS_DC_PDSK = 1 << 9, 71 + CS_DC_SUSP = 1 << 10, 71 72 CS_DC_MASK = CS_DC_ROLE + CS_DC_PEER + CS_DC_CONN + CS_DC_DISK + CS_DC_PDSK, 72 - CS_IGN_OUTD_FAIL = 1 << 10, 73 + CS_IGN_OUTD_FAIL = 1 << 11, 73 74 }; 74 75 75 76 /* drbd_dev_state and drbd_state are different types. This is to stress the