2008-01-30 04:37:32 +03:00
/* -*- mode: c; c-basic-offset: 8; -*-
* vim : noexpandtab sw = 8 ts = 8 sts = 0 :
*
* stackglue . h
*
* Glue to the underlying cluster stack .
*
* Copyright ( C ) 2007 Oracle . All rights reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation , version 2.
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*/
# ifndef STACKGLUE_H
# define STACKGLUE_H
2008-02-01 23:14:57 +03:00
# include <linux/types.h>
# include <linux/list.h>
# include <linux/dlmconstants.h>
2008-02-02 02:02:36 +03:00
# include "dlm/dlmapi.h"
2008-02-21 01:29:27 +03:00
# include <linux/dlm.h>
2008-02-02 02:02:36 +03:00
2008-07-22 01:29:16 +04:00
/* Needed for plock-related prototypes */
struct file ;
struct file_lock ;
2008-02-01 23:14:57 +03:00
/*
* dlmconstants . h does not have a LOCAL flag . We hope to remove it
* some day , but right now we need it . Let ' s fake it . This value is larger
* than any flag in dlmconstants . h .
*/
# define DLM_LKF_LOCAL 0x00100000
2008-02-02 01:39:35 +03:00
/*
* This shadows DLM_LOCKSPACE_LEN in fs / dlm / dlm_internal . h . That probably
* wants to be in a public header .
*/
# define GROUP_NAME_MAX 64
2014-01-22 03:48:21 +04:00
/* This shadows OCFS2_CLUSTER_NAME_LEN */
# define CLUSTER_NAME_MAX 16
2008-02-02 01:39:35 +03:00
2008-02-02 02:02:36 +03:00
/*
* ocfs2_protocol_version changes when ocfs2 does something different in
* its inter - node behavior . See dlmglue . c for more information .
*/
2008-02-02 01:39:35 +03:00
struct ocfs2_protocol_version {
u8 pv_major ;
u8 pv_minor ;
} ;
2008-02-21 01:29:27 +03:00
/*
* The dlm_lockstatus struct includes lvb space , but the dlm_lksb struct only
* has a pointer to separately allocated lvb space . This struct exists only to
* include in the lksb union to make space for a combined dlm_lksb and lvb .
*/
struct fsdlm_lksb_plus_lvb {
struct dlm_lksb lksb ;
char lvb [ DLM_LVB_LEN ] ;
} ;
2008-02-02 02:02:36 +03:00
/*
* A union of all lock status structures . We define it here so that the
* size of the union is known . Lock status structures are embedded in
* ocfs2 inodes .
*/
2010-01-30 01:46:44 +03:00
struct ocfs2_cluster_connection ;
struct ocfs2_dlm_lksb {
union {
struct dlm_lockstatus lksb_o2dlm ;
struct dlm_lksb lksb_fsdlm ;
struct fsdlm_lksb_plus_lvb padding ;
} ;
struct ocfs2_cluster_connection * lksb_conn ;
2008-02-01 23:16:57 +03:00
} ;
2010-01-29 06:22:39 +03:00
/*
* The ocfs2_locking_protocol defines the handlers called on ocfs2 ' s behalf .
*/
struct ocfs2_locking_protocol {
struct ocfs2_protocol_version lp_max_version ;
2010-01-30 01:46:44 +03:00
void ( * lp_lock_ast ) ( struct ocfs2_dlm_lksb * lksb ) ;
void ( * lp_blocking_ast ) ( struct ocfs2_dlm_lksb * lksb , int level ) ;
void ( * lp_unlock_ast ) ( struct ocfs2_dlm_lksb * lksb , int error ) ;
2010-01-29 06:22:39 +03:00
} ;
2008-02-02 02:02:36 +03:00
/*
* A cluster connection . Mostly opaque to ocfs2 , the connection holds
* state for the underlying stack . ocfs2 does use cc_version to determine
* locking compatibility .
*/
2008-02-02 01:39:35 +03:00
struct ocfs2_cluster_connection {
2014-01-22 03:48:21 +04:00
char cc_name [ GROUP_NAME_MAX + 1 ] ;
2008-02-02 01:39:35 +03:00
int cc_namelen ;
2014-01-22 03:48:21 +04:00
char cc_cluster_name [ CLUSTER_NAME_MAX + 1 ] ;
int cc_cluster_name_len ;
2008-02-02 01:39:35 +03:00
struct ocfs2_protocol_version cc_version ;
2010-01-30 02:46:23 +03:00
struct ocfs2_locking_protocol * cc_proto ;
2008-02-02 01:39:35 +03:00
void ( * cc_recovery_handler ) ( int node_num , void * recovery_data ) ;
void * cc_recovery_data ;
void * cc_lockspace ;
void * cc_private ;
} ;
2008-02-02 02:02:36 +03:00
/*
* Each cluster stack implements the stack operations structure . Not used
* in the ocfs2 code , the stackglue code translates generic cluster calls
* into stack operations .
*/
struct ocfs2_stack_operations {
/*
* The fs code calls ocfs2_cluster_connect ( ) to attach a new
* filesystem to the cluster stack . The - > connect ( ) op is passed
* an ocfs2_cluster_connection with the name and recovery field
* filled in .
*
* The stack must set up any notification mechanisms and create
* the filesystem lockspace in the DLM . The lockspace should be
* stored on cc_lockspace . Any other information can be stored on
* cc_private .
*
* - > connect ( ) must not return until it is guaranteed that
*
2011-03-31 05:57:33 +04:00
* - Node down notifications for the filesystem will be received
2008-02-02 02:02:36 +03:00
* and passed to conn - > cc_recovery_handler ( ) .
* - Locking requests for the filesystem will be processed .
*/
int ( * connect ) ( struct ocfs2_cluster_connection * conn ) ;
/*
* The fs code calls ocfs2_cluster_disconnect ( ) when a filesystem
* no longer needs cluster services . All DLM locks have been
* dropped , and recovery notification is being ignored by the
* fs code . The stack must disengage from the DLM and discontinue
* recovery notification .
*
* Once - > disconnect ( ) has returned , the connection structure will
* be freed . Thus , a stack must not return from - > disconnect ( )
* until it will no longer reference the conn pointer .
2008-02-02 02:03:57 +03:00
*
2008-05-31 02:58:26 +04:00
* Once this call returns , the stack glue will be dropping this
* connection ' s reference on the module .
2008-02-02 02:02:36 +03:00
*/
2008-05-31 02:58:26 +04:00
int ( * disconnect ) ( struct ocfs2_cluster_connection * conn ) ;
2008-02-02 02:02:36 +03:00
/*
* - > this_node ( ) returns the cluster ' s unique identifier for the
* local node .
*/
2014-01-22 03:48:24 +04:00
int ( * this_node ) ( struct ocfs2_cluster_connection * conn ,
unsigned int * node ) ;
2008-02-02 02:02:36 +03:00
/*
* Call the underlying dlm lock function . The - > dlm_lock ( )
* callback should convert the flags and mode as appropriate .
*
* ast and bast functions are not part of the call because the
* stack will likely want to wrap ast and bast calls before passing
2010-01-29 06:22:39 +03:00
* them to stack - > sp_proto . There is no astarg . The lksb will
* be passed back to the ast and bast functions . The caller can
* use this to find their object .
2008-02-02 02:02:36 +03:00
*/
int ( * dlm_lock ) ( struct ocfs2_cluster_connection * conn ,
int mode ,
2010-01-30 01:46:44 +03:00
struct ocfs2_dlm_lksb * lksb ,
2008-02-02 02:02:36 +03:00
u32 flags ,
void * name ,
2010-01-29 06:22:39 +03:00
unsigned int namelen ) ;
2008-02-02 02:02:36 +03:00
/*
* Call the underlying dlm unlock function . The - > dlm_unlock ( )
* function should convert the flags as appropriate .
*
* The unlock ast is not passed , as the stack will want to wrap
2010-01-29 06:22:39 +03:00
* it before calling stack - > sp_proto - > lp_unlock_ast ( ) . There is
* no astarg . The lksb will be passed back to the unlock ast
* function . The caller can use this to find their object .
2008-02-02 02:02:36 +03:00
*/
int ( * dlm_unlock ) ( struct ocfs2_cluster_connection * conn ,
2010-01-30 01:46:44 +03:00
struct ocfs2_dlm_lksb * lksb ,
2010-01-29 06:22:39 +03:00
u32 flags ) ;
2008-02-02 02:02:36 +03:00
/*
* Return the status of the current lock status block . The fs
* code should never dereference the union . The - > lock_status ( )
* callback pulls out the stack - specific lksb , converts the status
* to a proper errno , and returns it .
*/
2010-01-30 01:46:44 +03:00
int ( * lock_status ) ( struct ocfs2_dlm_lksb * lksb ) ;
2008-02-02 02:02:36 +03:00
2009-06-20 02:14:13 +04:00
/*
* Return non - zero if the LVB is valid .
*/
2010-01-30 01:46:44 +03:00
int ( * lvb_valid ) ( struct ocfs2_dlm_lksb * lksb ) ;
2009-06-20 02:14:13 +04:00
2008-02-02 02:02:36 +03:00
/*
* Pull the lvb pointer off of the stack - specific lksb .
*/
2010-01-30 01:46:44 +03:00
void * ( * lock_lvb ) ( struct ocfs2_dlm_lksb * lksb ) ;
2008-02-02 02:02:36 +03:00
2008-07-22 01:29:16 +04:00
/*
* Cluster - aware posix locks
*
* This is NULL for stacks which do not support posix locks .
*/
int ( * plock ) ( struct ocfs2_cluster_connection * conn ,
u64 ino ,
struct file * file ,
int cmd ,
struct file_lock * fl ) ;
2008-02-02 02:02:36 +03:00
/*
* This is an optoinal debugging hook . If provided , the
* stack can dump debugging information about this lock .
*/
2010-01-30 01:46:44 +03:00
void ( * dump_lksb ) ( struct ocfs2_dlm_lksb * lksb ) ;
2008-02-02 02:02:36 +03:00
} ;
2008-02-02 02:03:57 +03:00
/*
* Each stack plugin must describe itself by registering a
* ocfs2_stack_plugin structure . This is only seen by stackglue and the
* stack driver .
*/
struct ocfs2_stack_plugin {
char * sp_name ;
struct ocfs2_stack_operations * sp_ops ;
struct module * sp_owner ;
/* These are managed by the stackglue code. */
struct list_head sp_list ;
unsigned int sp_count ;
2010-01-30 03:06:29 +03:00
struct ocfs2_protocol_version sp_max_proto ;
2008-02-02 02:03:57 +03:00
} ;
/* Used by the filesystem */
2008-02-02 02:17:30 +03:00
int ocfs2_cluster_connect ( const char * stack_name ,
2014-01-22 03:48:21 +04:00
const char * cluster_name ,
int cluster_name_len ,
2008-02-02 02:17:30 +03:00
const char * group ,
2008-02-02 01:39:35 +03:00
int grouplen ,
2010-01-30 04:19:06 +03:00
struct ocfs2_locking_protocol * lproto ,
2008-02-02 01:39:35 +03:00
void ( * recovery_handler ) ( int node_num ,
void * recovery_data ) ,
void * recovery_data ,
struct ocfs2_cluster_connection * * conn ) ;
2010-01-30 17:02:10 +03:00
/*
* Used by callers that don ' t store their stack name . They must ensure
* all nodes have the same stack .
*/
int ocfs2_cluster_connect_agnostic ( const char * group ,
int grouplen ,
struct ocfs2_locking_protocol * lproto ,
void ( * recovery_handler ) ( int node_num ,
void * recovery_data ) ,
void * recovery_data ,
struct ocfs2_cluster_connection * * conn ) ;
2008-02-02 02:03:57 +03:00
int ocfs2_cluster_disconnect ( struct ocfs2_cluster_connection * conn ,
int hangup_pending ) ;
2008-01-30 03:59:56 +03:00
void ocfs2_cluster_hangup ( const char * group , int grouplen ) ;
2014-01-22 03:48:24 +04:00
int ocfs2_cluster_this_node ( struct ocfs2_cluster_connection * conn ,
unsigned int * node ) ;
2008-02-02 01:39:35 +03:00
2008-02-21 01:29:27 +03:00
struct ocfs2_lock_res ;
2008-02-02 01:39:35 +03:00
int ocfs2_dlm_lock ( struct ocfs2_cluster_connection * conn ,
2008-01-30 04:37:32 +03:00
int mode ,
2010-01-30 01:46:44 +03:00
struct ocfs2_dlm_lksb * lksb ,
2008-01-30 04:37:32 +03:00
u32 flags ,
void * name ,
2010-01-29 06:22:39 +03:00
unsigned int namelen ) ;
2008-02-02 01:39:35 +03:00
int ocfs2_dlm_unlock ( struct ocfs2_cluster_connection * conn ,
2010-01-30 01:46:44 +03:00
struct ocfs2_dlm_lksb * lksb ,
2010-01-29 06:22:39 +03:00
u32 flags ) ;
2008-01-30 04:37:32 +03:00
2010-01-30 01:46:44 +03:00
int ocfs2_dlm_lock_status ( struct ocfs2_dlm_lksb * lksb ) ;
int ocfs2_dlm_lvb_valid ( struct ocfs2_dlm_lksb * lksb ) ;
void * ocfs2_dlm_lvb ( struct ocfs2_dlm_lksb * lksb ) ;
void ocfs2_dlm_dump_lksb ( struct ocfs2_dlm_lksb * lksb ) ;
2008-02-01 23:16:57 +03:00
2008-07-22 01:29:16 +04:00
int ocfs2_stack_supports_plocks ( void ) ;
int ocfs2_plock ( struct ocfs2_cluster_connection * conn , u64 ino ,
struct file * file , int cmd , struct file_lock * fl ) ;
2010-01-30 04:19:06 +03:00
void ocfs2_stack_glue_set_max_proto_version ( struct ocfs2_protocol_version * max_proto ) ;
2008-01-30 04:37:32 +03:00
2008-02-02 02:03:57 +03:00
/* Used by stack plugins */
int ocfs2_stack_glue_register ( struct ocfs2_stack_plugin * plugin ) ;
void ocfs2_stack_glue_unregister ( struct ocfs2_stack_plugin * plugin ) ;
2008-05-31 02:30:49 +04:00
2008-01-30 04:37:32 +03:00
# endif /* STACKGLUE_H */