2002-04-11 18:10:32 +04:00
/*
2008-01-30 17:00:02 +03:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2002-04-11 18:10:32 +04:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2002-04-11 18:10:32 +04:00
*
2004-03-30 23:35:44 +04:00
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 23:35:44 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2002-04-11 18:10:32 +04:00
*/
2002-11-18 17:01:16 +03:00
# include "lib.h"
2002-04-11 18:10:32 +04:00
# include "locking.h"
# include "locking_types.h"
# include "lvm-string.h"
# include "activate.h"
# include <signal.h>
/*
* No locking
*/
static void _no_fin_locking ( void )
{
}
2003-05-06 16:03:13 +04:00
static void _no_reset_locking ( void )
{
}
2002-04-11 18:10:32 +04:00
static int _no_lock_resource ( struct cmd_context * cmd , const char * resource ,
2007-08-22 18:38:18 +04:00
uint32_t flags )
2002-04-11 18:10:32 +04:00
{
switch ( flags & LCK_SCOPE_MASK ) {
case LCK_VG :
2011-02-04 22:21:47 +03:00
if ( ! strcmp ( resource , VG_SYNC_NAMES ) )
2011-01-12 23:42:50 +03:00
fs_unlock ( ) ;
2002-04-11 18:10:32 +04:00
break ;
case LCK_LV :
switch ( flags & LCK_TYPE_MASK ) {
2004-05-05 16:03:07 +04:00
case LCK_NULL :
return lv_deactivate ( cmd , resource ) ;
2002-04-11 18:10:32 +04:00
case LCK_UNLOCK :
2011-09-28 02:43:40 +04:00
return lv_resume_if_active ( cmd , resource , ( flags & LCK_ORIGIN_ONLY ) ? 1 : 0 , 0 , ( flags & LCK_REVERT ) ? 1 : 0 ) ;
2002-04-11 18:10:32 +04:00
case LCK_READ :
2005-08-15 03:18:28 +04:00
return lv_activate_with_filter ( cmd , resource , 0 ) ;
2002-04-11 18:10:32 +04:00
case LCK_WRITE :
2012-01-20 04:27:18 +04:00
return lv_suspend_if_active ( cmd , resource , ( flags & LCK_ORIGIN_ONLY ) ? 1 : 0 , 0 ) ;
2002-04-11 18:10:32 +04:00
case LCK_EXCL :
2005-08-15 03:18:28 +04:00
return lv_activate_with_filter ( cmd , resource , 1 ) ;
2002-04-11 18:10:32 +04:00
default :
break ;
}
break ;
default :
log_error ( " Unrecognised lock scope: %d " ,
flags & LCK_SCOPE_MASK ) ;
return 0 ;
}
return 1 ;
}
2009-07-15 09:49:47 +04:00
static int _readonly_lock_resource ( struct cmd_context * cmd ,
const char * resource ,
uint32_t flags )
{
2009-08-03 01:03:09 +04:00
if ( ( flags & LCK_TYPE_MASK ) = = LCK_WRITE & &
2009-09-15 02:47:49 +04:00
( flags & LCK_SCOPE_MASK ) = = LCK_VG & &
! ( flags & LCK_CACHE ) & &
strcmp ( resource , VG_GLOBAL ) ) {
2012-07-25 16:37:22 +04:00
log_error ( " Read-only locking type set. "
2012-07-25 16:06:02 +04:00
" Write locks are prohibited. " ) ;
2009-07-15 09:49:47 +04:00
return 0 ;
}
2009-09-15 02:47:49 +04:00
2009-07-15 09:49:47 +04:00
return _no_lock_resource ( cmd , resource , flags ) ;
}
2011-08-09 15:44:57 +04:00
int init_no_locking ( struct locking_type * locking , struct cmd_context * cmd __attribute__ ( ( unused ) ) ,
int suppress_messages )
2002-04-11 18:10:32 +04:00
{
locking - > lock_resource = _no_lock_resource ;
2003-05-06 16:03:13 +04:00
locking - > reset_locking = _no_reset_locking ;
2002-04-11 18:10:32 +04:00
locking - > fin_locking = _no_fin_locking ;
2007-03-13 17:59:21 +03:00
locking - > flags = LCK_CLUSTERED ;
2002-04-11 18:10:32 +04:00
return 1 ;
}
2009-07-15 09:49:47 +04:00
2011-08-09 15:44:57 +04:00
int init_readonly_locking ( struct locking_type * locking , struct cmd_context * cmd __attribute__ ( ( unused ) ) ,
int suppress_messages )
2009-07-15 09:49:47 +04:00
{
locking - > lock_resource = _readonly_lock_resource ;
locking - > reset_locking = _no_reset_locking ;
locking - > fin_locking = _no_fin_locking ;
locking - > flags = 0 ;
return 1 ;
}