diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ocfs2/cluster/nodemanager.c | 74 | ||||
| -rw-r--r-- | fs/ocfs2/cluster/nodemanager.h | 4 | ||||
| -rw-r--r-- | fs/ocfs2/stack_o2cb.c | 41 | ||||
| -rw-r--r-- | fs/ocfs2/stack_user.c | 3 | ||||
| -rw-r--r-- | fs/ocfs2/stackglue.c | 119 | ||||
| -rw-r--r-- | fs/ocfs2/stackglue.h | 19 |
6 files changed, 123 insertions, 137 deletions
diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c index cf9401e8cd0b..cfdb08b484ed 100644 --- a/fs/ocfs2/cluster/nodemanager.c +++ b/fs/ocfs2/cluster/nodemanager.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | 21 | ||
| 22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
| 23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
| 24 | #include <linux/sysctl.h> | ||
| 25 | #include <linux/configfs.h> | 24 | #include <linux/configfs.h> |
| 26 | 25 | ||
| 27 | #include "tcp.h" | 26 | #include "tcp.h" |
| @@ -36,65 +35,6 @@ | |||
| 36 | * cluster references throughout where nodes are looked up */ | 35 | * cluster references throughout where nodes are looked up */ |
| 37 | struct o2nm_cluster *o2nm_single_cluster = NULL; | 36 | struct o2nm_cluster *o2nm_single_cluster = NULL; |
| 38 | 37 | ||
| 39 | #define OCFS2_MAX_HB_CTL_PATH 256 | ||
| 40 | static char ocfs2_hb_ctl_path[OCFS2_MAX_HB_CTL_PATH] = "/sbin/ocfs2_hb_ctl"; | ||
| 41 | |||
| 42 | static ctl_table ocfs2_nm_table[] = { | ||
| 43 | { | ||
| 44 | .ctl_name = 1, | ||
| 45 | .procname = "hb_ctl_path", | ||
| 46 | .data = ocfs2_hb_ctl_path, | ||
| 47 | .maxlen = OCFS2_MAX_HB_CTL_PATH, | ||
| 48 | .mode = 0644, | ||
| 49 | .proc_handler = &proc_dostring, | ||
| 50 | .strategy = &sysctl_string, | ||
| 51 | }, | ||
| 52 | { .ctl_name = 0 } | ||
| 53 | }; | ||
| 54 | |||
| 55 | static ctl_table ocfs2_mod_table[] = { | ||
| 56 | { | ||
| 57 | .ctl_name = FS_OCFS2_NM, | ||
| 58 | .procname = "nm", | ||
| 59 | .data = NULL, | ||
| 60 | .maxlen = 0, | ||
| 61 | .mode = 0555, | ||
| 62 | .child = ocfs2_nm_table | ||
| 63 | }, | ||
| 64 | { .ctl_name = 0} | ||
| 65 | }; | ||
| 66 | |||
| 67 | static ctl_table ocfs2_kern_table[] = { | ||
| 68 | { | ||
| 69 | .ctl_name = FS_OCFS2, | ||
| 70 | .procname = "ocfs2", | ||
| 71 | .data = NULL, | ||
| 72 | .maxlen = 0, | ||
| 73 | .mode = 0555, | ||
| 74 | .child = ocfs2_mod_table | ||
| 75 | }, | ||
| 76 | { .ctl_name = 0} | ||
| 77 | }; | ||
| 78 | |||
| 79 | static ctl_table ocfs2_root_table[] = { | ||
| 80 | { | ||
| 81 | .ctl_name = CTL_FS, | ||
| 82 | .procname = "fs", | ||
| 83 | .data = NULL, | ||
| 84 | .maxlen = 0, | ||
| 85 | .mode = 0555, | ||
| 86 | .child = ocfs2_kern_table | ||
| 87 | }, | ||
| 88 | { .ctl_name = 0 } | ||
| 89 | }; | ||
| 90 | |||
| 91 | static struct ctl_table_header *ocfs2_table_header = NULL; | ||
| 92 | |||
| 93 | const char *o2nm_get_hb_ctl_path(void) | ||
| 94 | { | ||
| 95 | return ocfs2_hb_ctl_path; | ||
| 96 | } | ||
| 97 | EXPORT_SYMBOL_GPL(o2nm_get_hb_ctl_path); | ||
| 98 | 38 | ||
| 99 | struct o2nm_node *o2nm_get_node_by_num(u8 node_num) | 39 | struct o2nm_node *o2nm_get_node_by_num(u8 node_num) |
| 100 | { | 40 | { |
| @@ -941,9 +881,6 @@ void o2nm_undepend_this_node(void) | |||
| 941 | 881 | ||
| 942 | static void __exit exit_o2nm(void) | 882 | static void __exit exit_o2nm(void) |
| 943 | { | 883 | { |
| 944 | if (ocfs2_table_header) | ||
| 945 | unregister_sysctl_table(ocfs2_table_header); | ||
| 946 | |||
| 947 | /* XXX sync with hb callbacks and shut down hb? */ | 884 | /* XXX sync with hb callbacks and shut down hb? */ |
| 948 | o2net_unregister_hb_callbacks(); | 885 | o2net_unregister_hb_callbacks(); |
| 949 | configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys); | 886 | configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys); |
| @@ -964,16 +901,9 @@ static int __init init_o2nm(void) | |||
| 964 | if (ret) | 901 | if (ret) |
| 965 | goto out; | 902 | goto out; |
| 966 | 903 | ||
| 967 | ocfs2_table_header = register_sysctl_table(ocfs2_root_table); | ||
| 968 | if (!ocfs2_table_header) { | ||
| 969 | printk(KERN_ERR "nodemanager: unable to register sysctl\n"); | ||
| 970 | ret = -ENOMEM; /* or something. */ | ||
| 971 | goto out_o2net; | ||
| 972 | } | ||
| 973 | |||
| 974 | ret = o2net_register_hb_callbacks(); | 904 | ret = o2net_register_hb_callbacks(); |
| 975 | if (ret) | 905 | if (ret) |
| 976 | goto out_sysctl; | 906 | goto out_o2net; |
| 977 | 907 | ||
| 978 | config_group_init(&o2nm_cluster_group.cs_subsys.su_group); | 908 | config_group_init(&o2nm_cluster_group.cs_subsys.su_group); |
| 979 | mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex); | 909 | mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex); |
| @@ -990,8 +920,6 @@ static int __init init_o2nm(void) | |||
| 990 | configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys); | 920 | configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys); |
| 991 | out_callbacks: | 921 | out_callbacks: |
| 992 | o2net_unregister_hb_callbacks(); | 922 | o2net_unregister_hb_callbacks(); |
| 993 | out_sysctl: | ||
| 994 | unregister_sysctl_table(ocfs2_table_header); | ||
| 995 | out_o2net: | 923 | out_o2net: |
| 996 | o2net_exit(); | 924 | o2net_exit(); |
| 997 | out: | 925 | out: |
diff --git a/fs/ocfs2/cluster/nodemanager.h b/fs/ocfs2/cluster/nodemanager.h index 7c860361b8dd..c992ea0da4ad 100644 --- a/fs/ocfs2/cluster/nodemanager.h +++ b/fs/ocfs2/cluster/nodemanager.h | |||
| @@ -33,10 +33,6 @@ | |||
| 33 | #include <linux/configfs.h> | 33 | #include <linux/configfs.h> |
| 34 | #include <linux/rbtree.h> | 34 | #include <linux/rbtree.h> |
| 35 | 35 | ||
| 36 | #define FS_OCFS2_NM 1 | ||
| 37 | |||
| 38 | const char *o2nm_get_hb_ctl_path(void); | ||
| 39 | |||
| 40 | struct o2nm_node { | 36 | struct o2nm_node { |
| 41 | spinlock_t nd_lock; | 37 | spinlock_t nd_lock; |
| 42 | struct config_item nd_item; | 38 | struct config_item nd_item; |
diff --git a/fs/ocfs2/stack_o2cb.c b/fs/ocfs2/stack_o2cb.c index bbd1667aa7d3..fcd120f1493a 100644 --- a/fs/ocfs2/stack_o2cb.c +++ b/fs/ocfs2/stack_o2cb.c | |||
| @@ -317,8 +317,7 @@ out: | |||
| 317 | return rc; | 317 | return rc; |
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | static int o2cb_cluster_disconnect(struct ocfs2_cluster_connection *conn, | 320 | static int o2cb_cluster_disconnect(struct ocfs2_cluster_connection *conn) |
| 321 | int hangup_pending) | ||
| 322 | { | 321 | { |
| 323 | struct dlm_ctxt *dlm = conn->cc_lockspace; | 322 | struct dlm_ctxt *dlm = conn->cc_lockspace; |
| 324 | struct o2dlm_private *priv = conn->cc_private; | 323 | struct o2dlm_private *priv = conn->cc_private; |
| @@ -333,43 +332,6 @@ static int o2cb_cluster_disconnect(struct ocfs2_cluster_connection *conn, | |||
| 333 | return 0; | 332 | return 0; |
| 334 | } | 333 | } |
| 335 | 334 | ||
| 336 | static void o2hb_stop(const char *group) | ||
| 337 | { | ||
| 338 | int ret; | ||
| 339 | char *argv[5], *envp[3]; | ||
| 340 | |||
| 341 | argv[0] = (char *)o2nm_get_hb_ctl_path(); | ||
| 342 | argv[1] = "-K"; | ||
| 343 | argv[2] = "-u"; | ||
| 344 | argv[3] = (char *)group; | ||
| 345 | argv[4] = NULL; | ||
| 346 | |||
| 347 | mlog(0, "Run: %s %s %s %s\n", argv[0], argv[1], argv[2], argv[3]); | ||
| 348 | |||
| 349 | /* minimal command environment taken from cpu_run_sbin_hotplug */ | ||
| 350 | envp[0] = "HOME=/"; | ||
| 351 | envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; | ||
| 352 | envp[2] = NULL; | ||
| 353 | |||
| 354 | ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC); | ||
| 355 | if (ret < 0) | ||
| 356 | mlog_errno(ret); | ||
| 357 | } | ||
| 358 | |||
| 359 | /* | ||
| 360 | * Hangup is a hack for tools compatibility. Older ocfs2-tools software | ||
| 361 | * expects the filesystem to call "ocfs2_hb_ctl" during unmount. This | ||
| 362 | * happens regardless of whether the DLM got started, so we can't do it | ||
| 363 | * in ocfs2_cluster_disconnect(). We bring the o2hb_stop() function into | ||
| 364 | * the glue and provide a "hangup" API for super.c to call. | ||
| 365 | * | ||
| 366 | * Other stacks will eventually provide a NULL ->hangup() pointer. | ||
| 367 | */ | ||
| 368 | static void o2cb_cluster_hangup(const char *group, int grouplen) | ||
| 369 | { | ||
| 370 | o2hb_stop(group); | ||
| 371 | } | ||
| 372 | |||
| 373 | static int o2cb_cluster_this_node(unsigned int *node) | 335 | static int o2cb_cluster_this_node(unsigned int *node) |
| 374 | { | 336 | { |
| 375 | int node_num; | 337 | int node_num; |
| @@ -388,7 +350,6 @@ static int o2cb_cluster_this_node(unsigned int *node) | |||
| 388 | static struct ocfs2_stack_operations o2cb_stack_ops = { | 350 | static struct ocfs2_stack_operations o2cb_stack_ops = { |
| 389 | .connect = o2cb_cluster_connect, | 351 | .connect = o2cb_cluster_connect, |
| 390 | .disconnect = o2cb_cluster_disconnect, | 352 | .disconnect = o2cb_cluster_disconnect, |
| 391 | .hangup = o2cb_cluster_hangup, | ||
| 392 | .this_node = o2cb_cluster_this_node, | 353 | .this_node = o2cb_cluster_this_node, |
| 393 | .dlm_lock = o2cb_dlm_lock, | 354 | .dlm_lock = o2cb_dlm_lock, |
| 394 | .dlm_unlock = o2cb_dlm_unlock, | 355 | .dlm_unlock = o2cb_dlm_unlock, |
diff --git a/fs/ocfs2/stack_user.c b/fs/ocfs2/stack_user.c index 6b97d11f6bf8..c021280dd462 100644 --- a/fs/ocfs2/stack_user.c +++ b/fs/ocfs2/stack_user.c | |||
| @@ -816,8 +816,7 @@ out: | |||
| 816 | return rc; | 816 | return rc; |
| 817 | } | 817 | } |
| 818 | 818 | ||
| 819 | static int user_cluster_disconnect(struct ocfs2_cluster_connection *conn, | 819 | static int user_cluster_disconnect(struct ocfs2_cluster_connection *conn) |
| 820 | int hangup_pending) | ||
| 821 | { | 820 | { |
| 822 | dlm_release_lockspace(conn->cc_lockspace, 2); | 821 | dlm_release_lockspace(conn->cc_lockspace, 2); |
| 823 | conn->cc_lockspace = NULL; | 822 | conn->cc_lockspace = NULL; |
diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c index 119f60cea9cc..10e149ae5e3a 100644 --- a/fs/ocfs2/stackglue.c +++ b/fs/ocfs2/stackglue.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
| 27 | #include <linux/kobject.h> | 27 | #include <linux/kobject.h> |
| 28 | #include <linux/sysfs.h> | 28 | #include <linux/sysfs.h> |
| 29 | #include <linux/sysctl.h> | ||
| 29 | 30 | ||
| 30 | #include "ocfs2_fs.h" | 31 | #include "ocfs2_fs.h" |
| 31 | 32 | ||
| @@ -33,11 +34,13 @@ | |||
| 33 | 34 | ||
| 34 | #define OCFS2_STACK_PLUGIN_O2CB "o2cb" | 35 | #define OCFS2_STACK_PLUGIN_O2CB "o2cb" |
| 35 | #define OCFS2_STACK_PLUGIN_USER "user" | 36 | #define OCFS2_STACK_PLUGIN_USER "user" |
| 37 | #define OCFS2_MAX_HB_CTL_PATH 256 | ||
| 36 | 38 | ||
| 37 | static struct ocfs2_locking_protocol *lproto; | 39 | static struct ocfs2_locking_protocol *lproto; |
| 38 | static DEFINE_SPINLOCK(ocfs2_stack_lock); | 40 | static DEFINE_SPINLOCK(ocfs2_stack_lock); |
| 39 | static LIST_HEAD(ocfs2_stack_list); | 41 | static LIST_HEAD(ocfs2_stack_list); |
| 40 | static char cluster_stack_name[OCFS2_STACK_LABEL_LEN + 1]; | 42 | static char cluster_stack_name[OCFS2_STACK_LABEL_LEN + 1]; |
| 43 | static char ocfs2_hb_ctl_path[OCFS2_MAX_HB_CTL_PATH] = "/sbin/ocfs2_hb_ctl"; | ||
| 41 | 44 | ||
| 42 | /* | 45 | /* |
| 43 | * The stack currently in use. If not null, active_stack->sp_count > 0, | 46 | * The stack currently in use. If not null, active_stack->sp_count > 0, |
| @@ -349,7 +352,7 @@ int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn, | |||
| 349 | 352 | ||
| 350 | BUG_ON(conn == NULL); | 353 | BUG_ON(conn == NULL); |
| 351 | 354 | ||
| 352 | ret = active_stack->sp_ops->disconnect(conn, hangup_pending); | 355 | ret = active_stack->sp_ops->disconnect(conn); |
| 353 | 356 | ||
| 354 | /* XXX Should we free it anyway? */ | 357 | /* XXX Should we free it anyway? */ |
| 355 | if (!ret) { | 358 | if (!ret) { |
| @@ -362,13 +365,48 @@ int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn, | |||
| 362 | } | 365 | } |
| 363 | EXPORT_SYMBOL_GPL(ocfs2_cluster_disconnect); | 366 | EXPORT_SYMBOL_GPL(ocfs2_cluster_disconnect); |
| 364 | 367 | ||
| 368 | /* | ||
| 369 | * Leave the group for this filesystem. This is executed by a userspace | ||
| 370 | * program (stored in ocfs2_hb_ctl_path). | ||
| 371 | */ | ||
| 372 | static void ocfs2_leave_group(const char *group) | ||
| 373 | { | ||
| 374 | int ret; | ||
| 375 | char *argv[5], *envp[3]; | ||
| 376 | |||
| 377 | argv[0] = ocfs2_hb_ctl_path; | ||
| 378 | argv[1] = "-K"; | ||
| 379 | argv[2] = "-u"; | ||
| 380 | argv[3] = (char *)group; | ||
| 381 | argv[4] = NULL; | ||
| 382 | |||
| 383 | /* minimal command environment taken from cpu_run_sbin_hotplug */ | ||
| 384 | envp[0] = "HOME=/"; | ||
| 385 | envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; | ||
| 386 | envp[2] = NULL; | ||
| 387 | |||
| 388 | ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC); | ||
| 389 | if (ret < 0) { | ||
| 390 | printk(KERN_ERR | ||
| 391 | "ocfs2: Error %d running user helper " | ||
| 392 | "\"%s %s %s %s\"\n", | ||
| 393 | ret, argv[0], argv[1], argv[2], argv[3]); | ||
| 394 | } | ||
| 395 | } | ||
| 396 | |||
| 397 | /* | ||
| 398 | * Hangup is a required post-umount. ocfs2-tools software expects the | ||
| 399 | * filesystem to call "ocfs2_hb_ctl" during unmount. This happens | ||
| 400 | * regardless of whether the DLM got started, so we can't do it | ||
| 401 | * in ocfs2_cluster_disconnect(). The ocfs2_leave_group() function does | ||
| 402 | * the actual work. | ||
| 403 | */ | ||
| 365 | void ocfs2_cluster_hangup(const char *group, int grouplen) | 404 | void ocfs2_cluster_hangup(const char *group, int grouplen) |
| 366 | { | 405 | { |
| 367 | BUG_ON(group == NULL); | 406 | BUG_ON(group == NULL); |
| 368 | BUG_ON(group[grouplen] != '\0'); | 407 | BUG_ON(group[grouplen] != '\0'); |
| 369 | 408 | ||
| 370 | if (active_stack->sp_ops->hangup) | 409 | ocfs2_leave_group(group); |
| 371 | active_stack->sp_ops->hangup(group, grouplen); | ||
| 372 | 410 | ||
| 373 | /* cluster_disconnect() was called with hangup_pending==1 */ | 411 | /* cluster_disconnect() was called with hangup_pending==1 */ |
| 374 | ocfs2_stack_driver_put(); | 412 | ocfs2_stack_driver_put(); |
| @@ -548,10 +586,83 @@ error: | |||
| 548 | return ret; | 586 | return ret; |
| 549 | } | 587 | } |
| 550 | 588 | ||
| 589 | /* | ||
| 590 | * Sysctl bits | ||
| 591 | * | ||
| 592 | * The sysctl lives at /proc/sys/fs/ocfs2/nm/hb_ctl_path. The 'nm' doesn't | ||
| 593 | * make as much sense in a multiple cluster stack world, but it's safer | ||
| 594 | * and easier to preserve the name. | ||
| 595 | */ | ||
| 596 | |||
| 597 | #define FS_OCFS2_NM 1 | ||
| 598 | |||
| 599 | static ctl_table ocfs2_nm_table[] = { | ||
| 600 | { | ||
| 601 | .ctl_name = 1, | ||
| 602 | .procname = "hb_ctl_path", | ||
| 603 | .data = ocfs2_hb_ctl_path, | ||
| 604 | .maxlen = OCFS2_MAX_HB_CTL_PATH, | ||
| 605 | .mode = 0644, | ||
| 606 | .proc_handler = &proc_dostring, | ||
| 607 | .strategy = &sysctl_string, | ||
| 608 | }, | ||
| 609 | { .ctl_name = 0 } | ||
| 610 | }; | ||
| 611 | |||
| 612 | static ctl_table ocfs2_mod_table[] = { | ||
| 613 | { | ||
| 614 | .ctl_name = FS_OCFS2_NM, | ||
| 615 | .procname = "nm", | ||
| 616 | .data = NULL, | ||
| 617 | .maxlen = 0, | ||
| 618 | .mode = 0555, | ||
| 619 | .child = ocfs2_nm_table | ||
| 620 | }, | ||
| 621 | { .ctl_name = 0} | ||
| 622 | }; | ||
| 623 | |||
| 624 | static ctl_table ocfs2_kern_table[] = { | ||
| 625 | { | ||
| 626 | .ctl_name = FS_OCFS2, | ||
| 627 | .procname = "ocfs2", | ||
| 628 | .data = NULL, | ||
| 629 | .maxlen = 0, | ||
| 630 | .mode = 0555, | ||
| 631 | .child = ocfs2_mod_table | ||
| 632 | }, | ||
| 633 | { .ctl_name = 0} | ||
| 634 | }; | ||
| 635 | |||
| 636 | static ctl_table ocfs2_root_table[] = { | ||
| 637 | { | ||
| 638 | .ctl_name = CTL_FS, | ||
| 639 | .procname = "fs", | ||
| 640 | .data = NULL, | ||
| 641 | .maxlen = 0, | ||
| 642 | .mode = 0555, | ||
| 643 | .child = ocfs2_kern_table | ||
| 644 | }, | ||
| 645 | { .ctl_name = 0 } | ||
| 646 | }; | ||
| 647 | |||
| 648 | static struct ctl_table_header *ocfs2_table_header = NULL; | ||
| 649 | |||
| 650 | |||
| 651 | /* | ||
| 652 | * Initialization | ||
| 653 | */ | ||
| 654 | |||
| 551 | static int __init ocfs2_stack_glue_init(void) | 655 | static int __init ocfs2_stack_glue_init(void) |
| 552 | { | 656 | { |
| 553 | strcpy(cluster_stack_name, OCFS2_STACK_PLUGIN_O2CB); | 657 | strcpy(cluster_stack_name, OCFS2_STACK_PLUGIN_O2CB); |
| 554 | 658 | ||
| 659 | ocfs2_table_header = register_sysctl_table(ocfs2_root_table); | ||
| 660 | if (!ocfs2_table_header) { | ||
| 661 | printk(KERN_ERR | ||
| 662 | "ocfs2 stack glue: unable to register sysctl\n"); | ||
| 663 | return -ENOMEM; /* or something. */ | ||
| 664 | } | ||
| 665 | |||
| 555 | return ocfs2_sysfs_init(); | 666 | return ocfs2_sysfs_init(); |
| 556 | } | 667 | } |
| 557 | 668 | ||
| @@ -559,6 +670,8 @@ static void __exit ocfs2_stack_glue_exit(void) | |||
| 559 | { | 670 | { |
| 560 | lproto = NULL; | 671 | lproto = NULL; |
| 561 | ocfs2_sysfs_exit(); | 672 | ocfs2_sysfs_exit(); |
| 673 | if (ocfs2_table_header) | ||
| 674 | unregister_sysctl_table(ocfs2_table_header); | ||
| 562 | } | 675 | } |
| 563 | 676 | ||
| 564 | MODULE_AUTHOR("Oracle"); | 677 | MODULE_AUTHOR("Oracle"); |
diff --git a/fs/ocfs2/stackglue.h b/fs/ocfs2/stackglue.h index 005e4f170e0f..db56281dd1be 100644 --- a/fs/ocfs2/stackglue.h +++ b/fs/ocfs2/stackglue.h | |||
| @@ -134,22 +134,10 @@ struct ocfs2_stack_operations { | |||
| 134 | * be freed. Thus, a stack must not return from ->disconnect() | 134 | * be freed. Thus, a stack must not return from ->disconnect() |
| 135 | * until it will no longer reference the conn pointer. | 135 | * until it will no longer reference the conn pointer. |
| 136 | * | 136 | * |
| 137 | * If hangup_pending is zero, ocfs2_cluster_disconnect() will also | 137 | * Once this call returns, the stack glue will be dropping this |
| 138 | * be dropping the reference on the module. | 138 | * connection's reference on the module. |
| 139 | */ | 139 | */ |
| 140 | int (*disconnect)(struct ocfs2_cluster_connection *conn, | 140 | int (*disconnect)(struct ocfs2_cluster_connection *conn); |
| 141 | int hangup_pending); | ||
| 142 | |||
| 143 | /* | ||
| 144 | * ocfs2_cluster_hangup() exists for compatibility with older | ||
| 145 | * ocfs2 tools. Only the classic stack really needs it. As such | ||
| 146 | * ->hangup() is not required of all stacks. See the comment by | ||
| 147 | * ocfs2_cluster_hangup() for more details. | ||
| 148 | * | ||
| 149 | * Note that ocfs2_cluster_hangup() can only be called if | ||
| 150 | * hangup_pending was passed to ocfs2_cluster_disconnect(). | ||
| 151 | */ | ||
| 152 | void (*hangup)(const char *group, int grouplen); | ||
| 153 | 141 | ||
| 154 | /* | 142 | /* |
| 155 | * ->this_node() returns the cluster's unique identifier for the | 143 | * ->this_node() returns the cluster's unique identifier for the |
| @@ -258,4 +246,5 @@ void ocfs2_stack_glue_set_locking_protocol(struct ocfs2_locking_protocol *proto) | |||
| 258 | /* Used by stack plugins */ | 246 | /* Used by stack plugins */ |
| 259 | int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin); | 247 | int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin); |
| 260 | void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin); | 248 | void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin); |
| 249 | |||
| 261 | #endif /* STACKGLUE_H */ | 250 | #endif /* STACKGLUE_H */ |
