Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 1 | /* -*- mode: c; c-basic-offset: 8; -*- |
| 2 | * vim: noexpandtab sw=8 ts=8 sts=0: |
| 3 | * |
| 4 | * stackglue.c |
| 5 | * |
| 6 | * Code which implements an OCFS2 specific interface to underlying |
| 7 | * cluster stacks. |
| 8 | * |
| 9 | * Copyright (C) 2007 Oracle. All rights reserved. |
| 10 | * |
| 11 | * This program is free software; you can redistribute it and/or |
| 12 | * modify it under the terms of the GNU General Public |
| 13 | * License as published by the Free Software Foundation, version 2. |
| 14 | * |
| 15 | * This program is distributed in the hope that it will be useful, |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 | * General Public License for more details. |
| 19 | */ |
| 20 | |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 21 | #include <linux/slab.h> |
Joel Becker | 6953b4c | 2008-01-29 16:59:56 -0800 | [diff] [blame] | 22 | #include <linux/kmod.h> |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 23 | |
| 24 | /* Needed for AOP_TRUNCATED_PAGE in mlog_errno() */ |
| 25 | #include <linux/fs.h> |
| 26 | |
Joel Becker | 7431cd7 | 2008-02-01 12:15:37 -0800 | [diff] [blame] | 27 | #include "cluster/masklog.h" |
Joel Becker | 19fdb62 | 2008-01-30 15:38:24 -0800 | [diff] [blame] | 28 | |
Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 29 | #include "stackglue.h" |
| 30 | |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 31 | struct ocfs2_locking_protocol *stack_glue_lproto; |
Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 32 | |
Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 33 | |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 34 | int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn, |
| 35 | int mode, |
| 36 | union ocfs2_dlm_lksb *lksb, |
| 37 | u32 flags, |
| 38 | void *name, |
| 39 | unsigned int namelen, |
| 40 | void *astarg) |
| 41 | { |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 42 | BUG_ON(stack_glue_lproto == NULL); |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 43 | |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 44 | return o2cb_stack_ops.dlm_lock(conn, mode, lksb, flags, |
| 45 | name, namelen, astarg); |
Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 46 | } |
| 47 | |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 48 | int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn, |
| 49 | union ocfs2_dlm_lksb *lksb, |
| 50 | u32 flags, |
| 51 | void *astarg) |
| 52 | { |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 53 | BUG_ON(stack_glue_lproto == NULL); |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 54 | |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 55 | return o2cb_stack_ops.dlm_unlock(conn, lksb, flags, astarg); |
Joel Becker | 8f2c9c1 | 2008-02-01 12:16:57 -0800 | [diff] [blame] | 56 | } |
| 57 | |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 58 | int ocfs2_dlm_lock_status(union ocfs2_dlm_lksb *lksb) |
| 59 | { |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 60 | return o2cb_stack_ops.lock_status(lksb); |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 61 | } |
| 62 | |
Joel Becker | 8f2c9c1 | 2008-02-01 12:16:57 -0800 | [diff] [blame] | 63 | /* |
| 64 | * Why don't we cast to ocfs2_meta_lvb? The "clean" answer is that we |
| 65 | * don't cast at the glue level. The real answer is that the header |
| 66 | * ordering is nigh impossible. |
| 67 | */ |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 68 | void *ocfs2_dlm_lvb(union ocfs2_dlm_lksb *lksb) |
| 69 | { |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 70 | return o2cb_stack_ops.lock_lvb(lksb); |
Joel Becker | cf0acdc | 2008-01-29 16:59:55 -0800 | [diff] [blame] | 71 | } |
| 72 | |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 73 | void ocfs2_dlm_dump_lksb(union ocfs2_dlm_lksb *lksb) |
| 74 | { |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 75 | o2cb_stack_ops.dump_lksb(lksb); |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 76 | } |
| 77 | |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 78 | int ocfs2_cluster_connect(const char *group, |
| 79 | int grouplen, |
| 80 | void (*recovery_handler)(int node_num, |
| 81 | void *recovery_data), |
| 82 | void *recovery_data, |
| 83 | struct ocfs2_cluster_connection **conn) |
| 84 | { |
| 85 | int rc = 0; |
| 86 | struct ocfs2_cluster_connection *new_conn; |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 87 | |
| 88 | BUG_ON(group == NULL); |
| 89 | BUG_ON(conn == NULL); |
| 90 | BUG_ON(recovery_handler == NULL); |
| 91 | |
| 92 | if (grouplen > GROUP_NAME_MAX) { |
| 93 | rc = -EINVAL; |
| 94 | goto out; |
| 95 | } |
| 96 | |
| 97 | new_conn = kzalloc(sizeof(struct ocfs2_cluster_connection), |
| 98 | GFP_KERNEL); |
| 99 | if (!new_conn) { |
| 100 | rc = -ENOMEM; |
| 101 | goto out; |
| 102 | } |
| 103 | |
| 104 | memcpy(new_conn->cc_name, group, grouplen); |
| 105 | new_conn->cc_namelen = grouplen; |
| 106 | new_conn->cc_recovery_handler = recovery_handler; |
| 107 | new_conn->cc_recovery_data = recovery_data; |
| 108 | |
| 109 | /* Start the new connection at our maximum compatibility level */ |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 110 | new_conn->cc_version = stack_glue_lproto->lp_max_version; |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 111 | |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 112 | rc = o2cb_stack_ops.connect(new_conn); |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 113 | if (rc) { |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 114 | mlog_errno(rc); |
| 115 | goto out_free; |
| 116 | } |
| 117 | |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 118 | *conn = new_conn; |
| 119 | |
| 120 | out_free: |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 121 | if (rc) |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 122 | kfree(new_conn); |
Joel Becker | 4670c46 | 2008-02-01 14:39:35 -0800 | [diff] [blame] | 123 | |
| 124 | out: |
| 125 | return rc; |
| 126 | } |
| 127 | |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 128 | int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn) |
| 129 | { |
| 130 | int ret; |
| 131 | |
| 132 | BUG_ON(conn == NULL); |
| 133 | |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 134 | ret = o2cb_stack_ops.disconnect(conn); |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 135 | |
| 136 | /* XXX Should we free it anyway? */ |
| 137 | if (!ret) |
| 138 | kfree(conn); |
| 139 | |
| 140 | return ret; |
| 141 | } |
| 142 | |
Joel Becker | 6953b4c | 2008-01-29 16:59:56 -0800 | [diff] [blame] | 143 | void ocfs2_cluster_hangup(const char *group, int grouplen) |
| 144 | { |
| 145 | BUG_ON(group == NULL); |
| 146 | BUG_ON(group[grouplen] != '\0'); |
| 147 | |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 148 | o2cb_stack_ops.hangup(group, grouplen); |
Joel Becker | 19fdb62 | 2008-01-30 15:38:24 -0800 | [diff] [blame] | 149 | } |
| 150 | |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 151 | int ocfs2_cluster_this_node(unsigned int *node) |
| 152 | { |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 153 | return o2cb_stack_ops.this_node(node); |
Joel Becker | 553aa7e | 2008-02-01 14:51:03 -0800 | [diff] [blame] | 154 | } |
| 155 | |
Joel Becker | 63e0c48 | 2008-01-30 16:58:36 -0800 | [diff] [blame] | 156 | void ocfs2_stack_glue_set_locking_protocol(struct ocfs2_locking_protocol *proto) |
Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 157 | { |
Joel Becker | 63e0c48 | 2008-01-30 16:58:36 -0800 | [diff] [blame] | 158 | BUG_ON(proto != NULL); |
Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 159 | |
Joel Becker | e3dad42 | 2008-02-01 15:02:36 -0800 | [diff] [blame^] | 160 | stack_glue_lproto = proto; |
Joel Becker | 24ef181 | 2008-01-29 17:37:32 -0800 | [diff] [blame] | 161 | } |
| 162 | |