You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge commit 'v2.6.26' into bkl-removal
This commit is contained in:
+2
-2
@@ -2788,7 +2788,7 @@ static int ocfs2_merge_rec_right(struct inode *inode,
|
||||
BUG_ON(index >= le16_to_cpu(el->l_next_free_rec));
|
||||
left_rec = &el->l_recs[index];
|
||||
|
||||
if (index == le16_to_cpu(el->l_next_free_rec - 1) &&
|
||||
if (index == le16_to_cpu(el->l_next_free_rec) - 1 &&
|
||||
le16_to_cpu(el->l_next_free_rec) == le16_to_cpu(el->l_count)) {
|
||||
/* we meet with a cross extent block merge. */
|
||||
ret = ocfs2_get_right_path(inode, left_path, &right_path);
|
||||
@@ -2802,7 +2802,7 @@ static int ocfs2_merge_rec_right(struct inode *inode,
|
||||
BUG_ON(next_free <= 0);
|
||||
right_rec = &right_el->l_recs[0];
|
||||
if (ocfs2_is_empty_extent(right_rec)) {
|
||||
BUG_ON(le16_to_cpu(next_free) <= 1);
|
||||
BUG_ON(next_free <= 1);
|
||||
right_rec = &right_el->l_recs[1];
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/configfs.h>
|
||||
|
||||
#include "tcp.h"
|
||||
@@ -36,65 +35,6 @@
|
||||
* cluster references throughout where nodes are looked up */
|
||||
struct o2nm_cluster *o2nm_single_cluster = NULL;
|
||||
|
||||
#define OCFS2_MAX_HB_CTL_PATH 256
|
||||
static char ocfs2_hb_ctl_path[OCFS2_MAX_HB_CTL_PATH] = "/sbin/ocfs2_hb_ctl";
|
||||
|
||||
static ctl_table ocfs2_nm_table[] = {
|
||||
{
|
||||
.ctl_name = 1,
|
||||
.procname = "hb_ctl_path",
|
||||
.data = ocfs2_hb_ctl_path,
|
||||
.maxlen = OCFS2_MAX_HB_CTL_PATH,
|
||||
.mode = 0644,
|
||||
.proc_handler = &proc_dostring,
|
||||
.strategy = &sysctl_string,
|
||||
},
|
||||
{ .ctl_name = 0 }
|
||||
};
|
||||
|
||||
static ctl_table ocfs2_mod_table[] = {
|
||||
{
|
||||
.ctl_name = FS_OCFS2_NM,
|
||||
.procname = "nm",
|
||||
.data = NULL,
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = ocfs2_nm_table
|
||||
},
|
||||
{ .ctl_name = 0}
|
||||
};
|
||||
|
||||
static ctl_table ocfs2_kern_table[] = {
|
||||
{
|
||||
.ctl_name = FS_OCFS2,
|
||||
.procname = "ocfs2",
|
||||
.data = NULL,
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = ocfs2_mod_table
|
||||
},
|
||||
{ .ctl_name = 0}
|
||||
};
|
||||
|
||||
static ctl_table ocfs2_root_table[] = {
|
||||
{
|
||||
.ctl_name = CTL_FS,
|
||||
.procname = "fs",
|
||||
.data = NULL,
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = ocfs2_kern_table
|
||||
},
|
||||
{ .ctl_name = 0 }
|
||||
};
|
||||
|
||||
static struct ctl_table_header *ocfs2_table_header = NULL;
|
||||
|
||||
const char *o2nm_get_hb_ctl_path(void)
|
||||
{
|
||||
return ocfs2_hb_ctl_path;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(o2nm_get_hb_ctl_path);
|
||||
|
||||
struct o2nm_node *o2nm_get_node_by_num(u8 node_num)
|
||||
{
|
||||
@@ -941,9 +881,6 @@ void o2nm_undepend_this_node(void)
|
||||
|
||||
static void __exit exit_o2nm(void)
|
||||
{
|
||||
if (ocfs2_table_header)
|
||||
unregister_sysctl_table(ocfs2_table_header);
|
||||
|
||||
/* XXX sync with hb callbacks and shut down hb? */
|
||||
o2net_unregister_hb_callbacks();
|
||||
configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys);
|
||||
@@ -964,16 +901,9 @@ static int __init init_o2nm(void)
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ocfs2_table_header = register_sysctl_table(ocfs2_root_table);
|
||||
if (!ocfs2_table_header) {
|
||||
printk(KERN_ERR "nodemanager: unable to register sysctl\n");
|
||||
ret = -ENOMEM; /* or something. */
|
||||
goto out_o2net;
|
||||
}
|
||||
|
||||
ret = o2net_register_hb_callbacks();
|
||||
if (ret)
|
||||
goto out_sysctl;
|
||||
goto out_o2net;
|
||||
|
||||
config_group_init(&o2nm_cluster_group.cs_subsys.su_group);
|
||||
mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex);
|
||||
@@ -990,8 +920,6 @@ static int __init init_o2nm(void)
|
||||
configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys);
|
||||
out_callbacks:
|
||||
o2net_unregister_hb_callbacks();
|
||||
out_sysctl:
|
||||
unregister_sysctl_table(ocfs2_table_header);
|
||||
out_o2net:
|
||||
o2net_exit();
|
||||
out:
|
||||
|
||||
@@ -33,10 +33,6 @@
|
||||
#include <linux/configfs.h>
|
||||
#include <linux/rbtree.h>
|
||||
|
||||
#define FS_OCFS2_NM 1
|
||||
|
||||
const char *o2nm_get_hb_ctl_path(void);
|
||||
|
||||
struct o2nm_node {
|
||||
spinlock_t nd_lock;
|
||||
struct config_item nd_item;
|
||||
|
||||
+9
-19
@@ -142,53 +142,43 @@ static void o2net_idle_timer(unsigned long data);
|
||||
static void o2net_sc_postpone_idle(struct o2net_sock_container *sc);
|
||||
static void o2net_sc_reset_idle_timer(struct o2net_sock_container *sc);
|
||||
|
||||
static void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype,
|
||||
u32 msgkey, struct task_struct *task, u8 node)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype,
|
||||
u32 msgkey, struct task_struct *task, u8 node)
|
||||
{
|
||||
INIT_LIST_HEAD(&nst->st_net_debug_item);
|
||||
nst->st_task = task;
|
||||
nst->st_msg_type = msgtype;
|
||||
nst->st_msg_key = msgkey;
|
||||
nst->st_node = node;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void o2net_set_nst_sock_time(struct o2net_send_tracking *nst)
|
||||
void o2net_set_nst_sock_time(struct o2net_send_tracking *nst)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
do_gettimeofday(&nst->st_sock_time);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void o2net_set_nst_send_time(struct o2net_send_tracking *nst)
|
||||
void o2net_set_nst_send_time(struct o2net_send_tracking *nst)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
do_gettimeofday(&nst->st_send_time);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void o2net_set_nst_status_time(struct o2net_send_tracking *nst)
|
||||
void o2net_set_nst_status_time(struct o2net_send_tracking *nst)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
do_gettimeofday(&nst->st_status_time);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void o2net_set_nst_sock_container(struct o2net_send_tracking *nst,
|
||||
void o2net_set_nst_sock_container(struct o2net_send_tracking *nst,
|
||||
struct o2net_sock_container *sc)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
nst->st_sc = sc;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void o2net_set_nst_msg_id(struct o2net_send_tracking *nst, u32 msg_id)
|
||||
void o2net_set_nst_msg_id(struct o2net_send_tracking *nst, u32 msg_id)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
nst->st_id = msg_id;
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_FS */
|
||||
|
||||
static inline int o2net_reconnect_delay(void)
|
||||
{
|
||||
|
||||
@@ -128,23 +128,23 @@ void o2net_debug_del_nst(struct o2net_send_tracking *nst);
|
||||
void o2net_debug_add_sc(struct o2net_sock_container *sc);
|
||||
void o2net_debug_del_sc(struct o2net_sock_container *sc);
|
||||
#else
|
||||
static int o2net_debugfs_init(void)
|
||||
static inline int o2net_debugfs_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void o2net_debugfs_exit(void)
|
||||
static inline void o2net_debugfs_exit(void)
|
||||
{
|
||||
}
|
||||
static void o2net_debug_add_nst(struct o2net_send_tracking *nst)
|
||||
static inline void o2net_debug_add_nst(struct o2net_send_tracking *nst)
|
||||
{
|
||||
}
|
||||
static void o2net_debug_del_nst(struct o2net_send_tracking *nst)
|
||||
static inline void o2net_debug_del_nst(struct o2net_send_tracking *nst)
|
||||
{
|
||||
}
|
||||
static void o2net_debug_add_sc(struct o2net_sock_container *sc)
|
||||
static inline void o2net_debug_add_sc(struct o2net_sock_container *sc)
|
||||
{
|
||||
}
|
||||
static void o2net_debug_del_sc(struct o2net_sock_container *sc)
|
||||
static inline void o2net_debug_del_sc(struct o2net_sock_container *sc)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_FS */
|
||||
|
||||
@@ -224,10 +224,42 @@ struct o2net_send_tracking {
|
||||
struct timeval st_send_time;
|
||||
struct timeval st_status_time;
|
||||
};
|
||||
|
||||
void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype,
|
||||
u32 msgkey, struct task_struct *task, u8 node);
|
||||
void o2net_set_nst_sock_time(struct o2net_send_tracking *nst);
|
||||
void o2net_set_nst_send_time(struct o2net_send_tracking *nst);
|
||||
void o2net_set_nst_status_time(struct o2net_send_tracking *nst);
|
||||
void o2net_set_nst_sock_container(struct o2net_send_tracking *nst,
|
||||
struct o2net_sock_container *sc);
|
||||
void o2net_set_nst_msg_id(struct o2net_send_tracking *nst, u32 msg_id);
|
||||
|
||||
#else
|
||||
struct o2net_send_tracking {
|
||||
u32 dummy;
|
||||
};
|
||||
|
||||
static inline void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype,
|
||||
u32 msgkey, struct task_struct *task, u8 node)
|
||||
{
|
||||
}
|
||||
static inline void o2net_set_nst_sock_time(struct o2net_send_tracking *nst)
|
||||
{
|
||||
}
|
||||
static inline void o2net_set_nst_send_time(struct o2net_send_tracking *nst)
|
||||
{
|
||||
}
|
||||
static inline void o2net_set_nst_status_time(struct o2net_send_tracking *nst)
|
||||
{
|
||||
}
|
||||
static inline void o2net_set_nst_sock_container(struct o2net_send_tracking *nst,
|
||||
struct o2net_sock_container *sc)
|
||||
{
|
||||
}
|
||||
static inline void o2net_set_nst_msg_id(struct o2net_send_tracking *nst,
|
||||
u32 msg_id)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_FS */
|
||||
|
||||
#endif /* O2CLUSTER_TCP_INTERNAL_H */
|
||||
|
||||
@@ -60,25 +60,25 @@ void dlm_destroy_debugfs_root(void);
|
||||
|
||||
#else
|
||||
|
||||
static int dlm_debug_init(struct dlm_ctxt *dlm)
|
||||
static inline int dlm_debug_init(struct dlm_ctxt *dlm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void dlm_debug_shutdown(struct dlm_ctxt *dlm)
|
||||
static inline void dlm_debug_shutdown(struct dlm_ctxt *dlm)
|
||||
{
|
||||
}
|
||||
static int dlm_create_debugfs_subroot(struct dlm_ctxt *dlm)
|
||||
static inline int dlm_create_debugfs_subroot(struct dlm_ctxt *dlm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void dlm_destroy_debugfs_subroot(struct dlm_ctxt *dlm)
|
||||
static inline void dlm_destroy_debugfs_subroot(struct dlm_ctxt *dlm)
|
||||
{
|
||||
}
|
||||
static int dlm_create_debugfs_root(void)
|
||||
static inline int dlm_create_debugfs_root(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void dlm_destroy_debugfs_root(void)
|
||||
static inline void dlm_destroy_debugfs_root(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -606,7 +606,9 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm,
|
||||
|
||||
res->last_used = 0;
|
||||
|
||||
spin_lock(&dlm->spinlock);
|
||||
list_add_tail(&res->tracking, &dlm->tracking_list);
|
||||
spin_unlock(&dlm->spinlock);
|
||||
|
||||
memset(res->lvb, 0, DLM_LVB_LEN);
|
||||
memset(res->refmap, 0, sizeof(res->refmap));
|
||||
|
||||
+7
-7
@@ -1554,8 +1554,8 @@ out:
|
||||
*/
|
||||
int ocfs2_file_lock(struct file *file, int ex, int trylock)
|
||||
{
|
||||
int ret, level = ex ? LKM_EXMODE : LKM_PRMODE;
|
||||
unsigned int lkm_flags = trylock ? LKM_NOQUEUE : 0;
|
||||
int ret, level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
|
||||
unsigned int lkm_flags = trylock ? DLM_LKF_NOQUEUE : 0;
|
||||
unsigned long flags;
|
||||
struct ocfs2_file_private *fp = file->private_data;
|
||||
struct ocfs2_lock_res *lockres = &fp->fp_flock;
|
||||
@@ -1582,7 +1582,7 @@ int ocfs2_file_lock(struct file *file, int ex, int trylock)
|
||||
* Get the lock at NLMODE to start - that way we
|
||||
* can cancel the upconvert request if need be.
|
||||
*/
|
||||
ret = ocfs2_lock_create(osb, lockres, LKM_NLMODE, 0);
|
||||
ret = ocfs2_lock_create(osb, lockres, DLM_LOCK_NL, 0);
|
||||
if (ret < 0) {
|
||||
mlog_errno(ret);
|
||||
goto out;
|
||||
@@ -1597,7 +1597,7 @@ int ocfs2_file_lock(struct file *file, int ex, int trylock)
|
||||
}
|
||||
|
||||
lockres->l_action = OCFS2_AST_CONVERT;
|
||||
lkm_flags |= LKM_CONVERT;
|
||||
lkm_flags |= DLM_LKF_CONVERT;
|
||||
lockres->l_requested = level;
|
||||
lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
|
||||
|
||||
@@ -1664,7 +1664,7 @@ void ocfs2_file_unlock(struct file *file)
|
||||
if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED))
|
||||
return;
|
||||
|
||||
if (lockres->l_level == LKM_NLMODE)
|
||||
if (lockres->l_level == DLM_LOCK_NL)
|
||||
return;
|
||||
|
||||
mlog(0, "Unlock: \"%s\" flags: 0x%lx, level: %d, act: %d\n",
|
||||
@@ -1678,11 +1678,11 @@ void ocfs2_file_unlock(struct file *file)
|
||||
lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED);
|
||||
lockres->l_blocking = DLM_LOCK_EX;
|
||||
|
||||
gen = ocfs2_prepare_downconvert(lockres, LKM_NLMODE);
|
||||
gen = ocfs2_prepare_downconvert(lockres, DLM_LOCK_NL);
|
||||
lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0);
|
||||
spin_unlock_irqrestore(&lockres->l_lock, flags);
|
||||
|
||||
ret = ocfs2_downconvert_lock(osb, lockres, LKM_NLMODE, 0, gen);
|
||||
ret = ocfs2_downconvert_lock(osb, lockres, DLM_LOCK_NL, 0, gen);
|
||||
if (ret) {
|
||||
mlog_errno(ret);
|
||||
return;
|
||||
|
||||
+1
-40
@@ -317,8 +317,7 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int o2cb_cluster_disconnect(struct ocfs2_cluster_connection *conn,
|
||||
int hangup_pending)
|
||||
static int o2cb_cluster_disconnect(struct ocfs2_cluster_connection *conn)
|
||||
{
|
||||
struct dlm_ctxt *dlm = conn->cc_lockspace;
|
||||
struct o2dlm_private *priv = conn->cc_private;
|
||||
@@ -333,43 +332,6 @@ static int o2cb_cluster_disconnect(struct ocfs2_cluster_connection *conn,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void o2hb_stop(const char *group)
|
||||
{
|
||||
int ret;
|
||||
char *argv[5], *envp[3];
|
||||
|
||||
argv[0] = (char *)o2nm_get_hb_ctl_path();
|
||||
argv[1] = "-K";
|
||||
argv[2] = "-u";
|
||||
argv[3] = (char *)group;
|
||||
argv[4] = NULL;
|
||||
|
||||
mlog(0, "Run: %s %s %s %s\n", argv[0], argv[1], argv[2], argv[3]);
|
||||
|
||||
/* minimal command environment taken from cpu_run_sbin_hotplug */
|
||||
envp[0] = "HOME=/";
|
||||
envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
|
||||
envp[2] = NULL;
|
||||
|
||||
ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
|
||||
if (ret < 0)
|
||||
mlog_errno(ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Hangup is a hack for tools compatibility. Older ocfs2-tools software
|
||||
* expects the filesystem to call "ocfs2_hb_ctl" during unmount. This
|
||||
* happens regardless of whether the DLM got started, so we can't do it
|
||||
* in ocfs2_cluster_disconnect(). We bring the o2hb_stop() function into
|
||||
* the glue and provide a "hangup" API for super.c to call.
|
||||
*
|
||||
* Other stacks will eventually provide a NULL ->hangup() pointer.
|
||||
*/
|
||||
static void o2cb_cluster_hangup(const char *group, int grouplen)
|
||||
{
|
||||
o2hb_stop(group);
|
||||
}
|
||||
|
||||
static int o2cb_cluster_this_node(unsigned int *node)
|
||||
{
|
||||
int node_num;
|
||||
@@ -388,7 +350,6 @@ static int o2cb_cluster_this_node(unsigned int *node)
|
||||
static struct ocfs2_stack_operations o2cb_stack_ops = {
|
||||
.connect = o2cb_cluster_connect,
|
||||
.disconnect = o2cb_cluster_disconnect,
|
||||
.hangup = o2cb_cluster_hangup,
|
||||
.this_node = o2cb_cluster_this_node,
|
||||
.dlm_lock = o2cb_dlm_lock,
|
||||
.dlm_unlock = o2cb_dlm_unlock,
|
||||
|
||||
+18
-19
@@ -62,7 +62,7 @@
|
||||
* negotiated by the client. The client negotiates based on the maximum
|
||||
* version advertised in /sys/fs/ocfs2/max_locking_protocol. The major
|
||||
* number from the "SETV" message must match
|
||||
* user_stack.sp_proto->lp_max_version.pv_major, and the minor number
|
||||
* ocfs2_user_plugin.sp_proto->lp_max_version.pv_major, and the minor number
|
||||
* must be less than or equal to ...->lp_max_version.pv_minor.
|
||||
*
|
||||
* Once this information has been set, mounts will be allowed. From this
|
||||
@@ -154,7 +154,7 @@ union ocfs2_control_message {
|
||||
struct ocfs2_control_message_down u_down;
|
||||
};
|
||||
|
||||
static struct ocfs2_stack_plugin user_stack;
|
||||
static struct ocfs2_stack_plugin ocfs2_user_plugin;
|
||||
|
||||
static atomic_t ocfs2_control_opened;
|
||||
static int ocfs2_control_this_node = -1;
|
||||
@@ -400,7 +400,7 @@ static int ocfs2_control_do_setversion_msg(struct file *file,
|
||||
char *ptr = NULL;
|
||||
struct ocfs2_control_private *p = file->private_data;
|
||||
struct ocfs2_protocol_version *max =
|
||||
&user_stack.sp_proto->lp_max_version;
|
||||
&ocfs2_user_plugin.sp_proto->lp_max_version;
|
||||
|
||||
if (ocfs2_control_get_handshake_state(file) !=
|
||||
OCFS2_CONTROL_HANDSHAKE_PROTOCOL)
|
||||
@@ -683,7 +683,7 @@ static void fsdlm_lock_ast_wrapper(void *astarg)
|
||||
struct dlm_lksb *lksb = fsdlm_astarg_to_lksb(astarg);
|
||||
int status = lksb->sb_status;
|
||||
|
||||
BUG_ON(user_stack.sp_proto == NULL);
|
||||
BUG_ON(ocfs2_user_plugin.sp_proto == NULL);
|
||||
|
||||
/*
|
||||
* For now we're punting on the issue of other non-standard errors
|
||||
@@ -696,16 +696,16 @@ static void fsdlm_lock_ast_wrapper(void *astarg)
|
||||
*/
|
||||
|
||||
if (status == -DLM_EUNLOCK || status == -DLM_ECANCEL)
|
||||
user_stack.sp_proto->lp_unlock_ast(astarg, 0);
|
||||
ocfs2_user_plugin.sp_proto->lp_unlock_ast(astarg, 0);
|
||||
else
|
||||
user_stack.sp_proto->lp_lock_ast(astarg);
|
||||
ocfs2_user_plugin.sp_proto->lp_lock_ast(astarg);
|
||||
}
|
||||
|
||||
static void fsdlm_blocking_ast_wrapper(void *astarg, int level)
|
||||
{
|
||||
BUG_ON(user_stack.sp_proto == NULL);
|
||||
BUG_ON(ocfs2_user_plugin.sp_proto == NULL);
|
||||
|
||||
user_stack.sp_proto->lp_blocking_ast(astarg, level);
|
||||
ocfs2_user_plugin.sp_proto->lp_blocking_ast(astarg, level);
|
||||
}
|
||||
|
||||
static int user_dlm_lock(struct ocfs2_cluster_connection *conn,
|
||||
@@ -819,8 +819,7 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int user_cluster_disconnect(struct ocfs2_cluster_connection *conn,
|
||||
int hangup_pending)
|
||||
static int user_cluster_disconnect(struct ocfs2_cluster_connection *conn)
|
||||
{
|
||||
dlm_release_lockspace(conn->cc_lockspace, 2);
|
||||
conn->cc_lockspace = NULL;
|
||||
@@ -841,7 +840,7 @@ static int user_cluster_this_node(unsigned int *this_node)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ocfs2_stack_operations user_stack_ops = {
|
||||
static struct ocfs2_stack_operations ocfs2_user_plugin_ops = {
|
||||
.connect = user_cluster_connect,
|
||||
.disconnect = user_cluster_disconnect,
|
||||
.this_node = user_cluster_this_node,
|
||||
@@ -852,20 +851,20 @@ static struct ocfs2_stack_operations user_stack_ops = {
|
||||
.dump_lksb = user_dlm_dump_lksb,
|
||||
};
|
||||
|
||||
static struct ocfs2_stack_plugin user_stack = {
|
||||
static struct ocfs2_stack_plugin ocfs2_user_plugin = {
|
||||
.sp_name = "user",
|
||||
.sp_ops = &user_stack_ops,
|
||||
.sp_ops = &ocfs2_user_plugin_ops,
|
||||
.sp_owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
|
||||
static int __init user_stack_init(void)
|
||||
static int __init ocfs2_user_plugin_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = ocfs2_control_init();
|
||||
if (!rc) {
|
||||
rc = ocfs2_stack_glue_register(&user_stack);
|
||||
rc = ocfs2_stack_glue_register(&ocfs2_user_plugin);
|
||||
if (rc)
|
||||
ocfs2_control_exit();
|
||||
}
|
||||
@@ -873,14 +872,14 @@ static int __init user_stack_init(void)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void __exit user_stack_exit(void)
|
||||
static void __exit ocfs2_user_plugin_exit(void)
|
||||
{
|
||||
ocfs2_stack_glue_unregister(&user_stack);
|
||||
ocfs2_stack_glue_unregister(&ocfs2_user_plugin);
|
||||
ocfs2_control_exit();
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Oracle");
|
||||
MODULE_DESCRIPTION("ocfs2 driver for userspace cluster stacks");
|
||||
MODULE_LICENSE("GPL");
|
||||
module_init(user_stack_init);
|
||||
module_exit(user_stack_exit);
|
||||
module_init(ocfs2_user_plugin_init);
|
||||
module_exit(ocfs2_user_plugin_exit);
|
||||
|
||||
+116
-3
@@ -26,6 +26,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/sysctl.h>
|
||||
|
||||
#include "ocfs2_fs.h"
|
||||
|
||||
@@ -33,11 +34,13 @@
|
||||
|
||||
#define OCFS2_STACK_PLUGIN_O2CB "o2cb"
|
||||
#define OCFS2_STACK_PLUGIN_USER "user"
|
||||
#define OCFS2_MAX_HB_CTL_PATH 256
|
||||
|
||||
static struct ocfs2_locking_protocol *lproto;
|
||||
static DEFINE_SPINLOCK(ocfs2_stack_lock);
|
||||
static LIST_HEAD(ocfs2_stack_list);
|
||||
static char cluster_stack_name[OCFS2_STACK_LABEL_LEN + 1];
|
||||
static char ocfs2_hb_ctl_path[OCFS2_MAX_HB_CTL_PATH] = "/sbin/ocfs2_hb_ctl";
|
||||
|
||||
/*
|
||||
* 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,
|
||||
|
||||
BUG_ON(conn == NULL);
|
||||
|
||||
ret = active_stack->sp_ops->disconnect(conn, hangup_pending);
|
||||
ret = active_stack->sp_ops->disconnect(conn);
|
||||
|
||||
/* XXX Should we free it anyway? */
|
||||
if (!ret) {
|
||||
@@ -362,13 +365,48 @@ int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ocfs2_cluster_disconnect);
|
||||
|
||||
/*
|
||||
* Leave the group for this filesystem. This is executed by a userspace
|
||||
* program (stored in ocfs2_hb_ctl_path).
|
||||
*/
|
||||
static void ocfs2_leave_group(const char *group)
|
||||
{
|
||||
int ret;
|
||||
char *argv[5], *envp[3];
|
||||
|
||||
argv[0] = ocfs2_hb_ctl_path;
|
||||
argv[1] = "-K";
|
||||
argv[2] = "-u";
|
||||
argv[3] = (char *)group;
|
||||
argv[4] = NULL;
|
||||
|
||||
/* minimal command environment taken from cpu_run_sbin_hotplug */
|
||||
envp[0] = "HOME=/";
|
||||
envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
|
||||
envp[2] = NULL;
|
||||
|
||||
ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR
|
||||
"ocfs2: Error %d running user helper "
|
||||
"\"%s %s %s %s\"\n",
|
||||
ret, argv[0], argv[1], argv[2], argv[3]);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Hangup is a required post-umount. ocfs2-tools software expects the
|
||||
* filesystem to call "ocfs2_hb_ctl" during unmount. This happens
|
||||
* regardless of whether the DLM got started, so we can't do it
|
||||
* in ocfs2_cluster_disconnect(). The ocfs2_leave_group() function does
|
||||
* the actual work.
|
||||
*/
|
||||
void ocfs2_cluster_hangup(const char *group, int grouplen)
|
||||
{
|
||||
BUG_ON(group == NULL);
|
||||
BUG_ON(group[grouplen] != '\0');
|
||||
|
||||
if (active_stack->sp_ops->hangup)
|
||||
active_stack->sp_ops->hangup(group, grouplen);
|
||||
ocfs2_leave_group(group);
|
||||
|
||||
/* cluster_disconnect() was called with hangup_pending==1 */
|
||||
ocfs2_stack_driver_put();
|
||||
@@ -548,10 +586,83 @@ error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sysctl bits
|
||||
*
|
||||
* The sysctl lives at /proc/sys/fs/ocfs2/nm/hb_ctl_path. The 'nm' doesn't
|
||||
* make as much sense in a multiple cluster stack world, but it's safer
|
||||
* and easier to preserve the name.
|
||||
*/
|
||||
|
||||
#define FS_OCFS2_NM 1
|
||||
|
||||
static ctl_table ocfs2_nm_table[] = {
|
||||
{
|
||||
.ctl_name = 1,
|
||||
.procname = "hb_ctl_path",
|
||||
.data = ocfs2_hb_ctl_path,
|
||||
.maxlen = OCFS2_MAX_HB_CTL_PATH,
|
||||
.mode = 0644,
|
||||
.proc_handler = &proc_dostring,
|
||||
.strategy = &sysctl_string,
|
||||
},
|
||||
{ .ctl_name = 0 }
|
||||
};
|
||||
|
||||
static ctl_table ocfs2_mod_table[] = {
|
||||
{
|
||||
.ctl_name = FS_OCFS2_NM,
|
||||
.procname = "nm",
|
||||
.data = NULL,
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = ocfs2_nm_table
|
||||
},
|
||||
{ .ctl_name = 0}
|
||||
};
|
||||
|
||||
static ctl_table ocfs2_kern_table[] = {
|
||||
{
|
||||
.ctl_name = FS_OCFS2,
|
||||
.procname = "ocfs2",
|
||||
.data = NULL,
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = ocfs2_mod_table
|
||||
},
|
||||
{ .ctl_name = 0}
|
||||
};
|
||||
|
||||
static ctl_table ocfs2_root_table[] = {
|
||||
{
|
||||
.ctl_name = CTL_FS,
|
||||
.procname = "fs",
|
||||
.data = NULL,
|
||||
.maxlen = 0,
|
||||
.mode = 0555,
|
||||
.child = ocfs2_kern_table
|
||||
},
|
||||
{ .ctl_name = 0 }
|
||||
};
|
||||
|
||||
static struct ctl_table_header *ocfs2_table_header = NULL;
|
||||
|
||||
|
||||
/*
|
||||
* Initialization
|
||||
*/
|
||||
|
||||
static int __init ocfs2_stack_glue_init(void)
|
||||
{
|
||||
strcpy(cluster_stack_name, OCFS2_STACK_PLUGIN_O2CB);
|
||||
|
||||
ocfs2_table_header = register_sysctl_table(ocfs2_root_table);
|
||||
if (!ocfs2_table_header) {
|
||||
printk(KERN_ERR
|
||||
"ocfs2 stack glue: unable to register sysctl\n");
|
||||
return -ENOMEM; /* or something. */
|
||||
}
|
||||
|
||||
return ocfs2_sysfs_init();
|
||||
}
|
||||
|
||||
@@ -559,6 +670,8 @@ static void __exit ocfs2_stack_glue_exit(void)
|
||||
{
|
||||
lproto = NULL;
|
||||
ocfs2_sysfs_exit();
|
||||
if (ocfs2_table_header)
|
||||
unregister_sysctl_table(ocfs2_table_header);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Oracle");
|
||||
|
||||
+4
-15
@@ -134,22 +134,10 @@ struct ocfs2_stack_operations {
|
||||
* be freed. Thus, a stack must not return from ->disconnect()
|
||||
* until it will no longer reference the conn pointer.
|
||||
*
|
||||
* If hangup_pending is zero, ocfs2_cluster_disconnect() will also
|
||||
* be dropping the reference on the module.
|
||||
* Once this call returns, the stack glue will be dropping this
|
||||
* connection's reference on the module.
|
||||
*/
|
||||
int (*disconnect)(struct ocfs2_cluster_connection *conn,
|
||||
int hangup_pending);
|
||||
|
||||
/*
|
||||
* ocfs2_cluster_hangup() exists for compatibility with older
|
||||
* ocfs2 tools. Only the classic stack really needs it. As such
|
||||
* ->hangup() is not required of all stacks. See the comment by
|
||||
* ocfs2_cluster_hangup() for more details.
|
||||
*
|
||||
* Note that ocfs2_cluster_hangup() can only be called if
|
||||
* hangup_pending was passed to ocfs2_cluster_disconnect().
|
||||
*/
|
||||
void (*hangup)(const char *group, int grouplen);
|
||||
int (*disconnect)(struct ocfs2_cluster_connection *conn);
|
||||
|
||||
/*
|
||||
* ->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)
|
||||
/* Used by stack plugins */
|
||||
int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin);
|
||||
void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin);
|
||||
|
||||
#endif /* STACKGLUE_H */
|
||||
|
||||
Reference in New Issue
Block a user