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"
/*
* 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 ,
2014-09-22 17:50:07 +04:00
uint32_t flags , const struct logical_volume * lv )
2002-04-11 18:10:32 +04:00
{
switch ( flags & LCK_SCOPE_MASK ) {
2014-06-20 16:24:02 +04:00
case LCK_ACTIVATION :
break ;
2002-04-11 18:10:32 +04:00
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 :
2015-11-25 13:10:32 +03:00
return lv_deactivate ( cmd , resource , lv_committed ( lv ) ) ;
2002-04-11 18:10:32 +04:00
case LCK_UNLOCK :
2015-11-25 13:10:32 +03:00
return lv_resume_if_active ( cmd , resource , ( flags & LCK_ORIGIN_ONLY ) ? 1 : 0 , 0 ,
( flags & LCK_REVERT ) ? 1 : 0 , lv_committed ( lv ) ) ;
2002-04-11 18:10:32 +04:00
case LCK_READ :
2015-11-25 13:10:32 +03:00
return lv_activate_with_filter ( cmd , resource , 0 , ( lv - > status & LV_NOSCAN ) ? 1 : 0 ,
( lv - > status & LV_TEMPORARY ) ? 1 : 0 , lv_committed ( lv ) ) ;
2002-04-11 18:10:32 +04:00
case LCK_WRITE :
2015-11-25 13:10:32 +03:00
return lv_suspend_if_active ( cmd , resource , ( flags & LCK_ORIGIN_ONLY ) ? 1 : 0 , 0 ,
lv_committed ( lv ) , lv ) ;
2002-04-11 18:10:32 +04:00
case LCK_EXCL :
2015-11-25 13:10:32 +03:00
return lv_activate_with_filter ( cmd , resource , 1 , ( lv - > status & LV_NOSCAN ) ? 1 : 0 ,
( lv - > status & LV_TEMPORARY ) ? 1 : 0 , lv_committed ( lv ) ) ;
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 ;
}
2013-08-12 22:56:47 +04:00
static int _no_query_resource ( const char * resource , int * mode )
{
log_very_verbose ( " Locking is disabled: Treating lock %s as not held. " ,
resource ) ;
return 1 ;
}
2009-07-15 09:49:47 +04:00
static int _readonly_lock_resource ( struct cmd_context * cmd ,
const char * resource ,
2014-09-22 17:50:07 +04:00
uint32_t flags , const struct logical_volume * lv )
2009-07-15 09:49:47 +04:00
{
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
2013-03-18 00:29:58 +04:00
return _no_lock_resource ( cmd , resource , flags , lv ) ;
2009-07-15 09:49:47 +04:00
}
2014-04-18 05:46:34 +04:00
void init_no_locking ( struct locking_type * locking , struct cmd_context * cmd __attribute__ ( ( unused ) ) ,
2011-08-09 15:44:57 +04:00
int suppress_messages )
2002-04-11 18:10:32 +04:00
{
locking - > lock_resource = _no_lock_resource ;
2013-08-12 22:56:47 +04:00
locking - > query_resource = _no_query_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
}
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 ;
2013-08-12 22:56:47 +04:00
locking - > query_resource = _no_query_resource ;
2009-07-15 09:49:47 +04:00
locking - > reset_locking = _no_reset_locking ;
locking - > fin_locking = _no_fin_locking ;
locking - > flags = 0 ;
return 1 ;
}
2014-04-18 05:46:34 +04:00
void init_dummy_locking ( struct locking_type * locking , struct cmd_context * cmd __attribute__ ( ( unused ) ) ,
int suppress_messages )
{
locking - > lock_resource = _readonly_lock_resource ;
locking - > query_resource = _no_query_resource ;
locking - > reset_locking = _no_reset_locking ;
locking - > fin_locking = _no_fin_locking ;
locking - > flags = LCK_CLUSTERED ;
}