2002-04-11 14:10:32 +00:00
/*
2008-01-30 14:00:02 +00:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-20 20:55:30 +00:00
* Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2002-04-11 14:10:32 +00:00
*
2004-03-30 19:35:44 +00:00
* This file is part of LVM2 .
2002-04-11 14:10:32 +00:00
*
2004-03-30 19:35:44 +00: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-20 20:55:30 +00:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 19:35:44 +00:00
*
2007-08-20 20:55:30 +00:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 19:35:44 +00: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 14:10:32 +00:00
*/
2002-11-18 14:01:16 +00:00
# include "lib.h"
2002-04-11 14:10:32 +00: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 12:03:13 +00:00
static void _no_reset_locking ( void )
{
}
2002-04-11 14:10:32 +00:00
static int _no_lock_resource ( struct cmd_context * cmd , const char * resource ,
2007-08-22 14:38:18 +00:00
uint32_t flags )
2002-04-11 14:10:32 +00:00
{
switch ( flags & LCK_SCOPE_MASK ) {
case LCK_VG :
break ;
case LCK_LV :
switch ( flags & LCK_TYPE_MASK ) {
2004-05-05 12:03:07 +00:00
case LCK_NULL :
return lv_deactivate ( cmd , resource ) ;
2002-04-11 14:10:32 +00:00
case LCK_UNLOCK :
2010-08-17 19:25:05 +00:00
return lv_resume_if_active ( cmd , resource , ( flags & LCK_ORIGIN_ONLY ) ? 1 : 0 ) ;
2002-04-11 14:10:32 +00:00
case LCK_READ :
2005-08-14 23:18:28 +00:00
return lv_activate_with_filter ( cmd , resource , 0 ) ;
2002-04-11 14:10:32 +00:00
case LCK_WRITE :
2010-08-17 19:25:05 +00:00
return lv_suspend_if_active ( cmd , resource , ( flags & LCK_ORIGIN_ONLY ) ? 1 : 0 ) ;
2002-04-11 14:10:32 +00:00
case LCK_EXCL :
2005-08-14 23:18:28 +00:00
return lv_activate_with_filter ( cmd , resource , 1 ) ;
2002-04-11 14:10:32 +00:00
default :
break ;
}
break ;
default :
log_error ( " Unrecognised lock scope: %d " ,
flags & LCK_SCOPE_MASK ) ;
return 0 ;
}
return 1 ;
}
2009-07-15 05:49:47 +00:00
static int _readonly_lock_resource ( struct cmd_context * cmd ,
const char * resource ,
uint32_t flags )
{
2009-08-02 21:03:09 +00:00
if ( ( flags & LCK_TYPE_MASK ) = = LCK_WRITE & &
2009-09-14 22:47:49 +00:00
( flags & LCK_SCOPE_MASK ) = = LCK_VG & &
! ( flags & LCK_CACHE ) & &
strcmp ( resource , VG_GLOBAL ) ) {
2010-01-22 09:45:29 +00:00
log_error ( " Write locks are prohibited with read-only locking. " ) ;
2009-07-15 05:49:47 +00:00
return 0 ;
}
2009-09-14 22:47:49 +00:00
2009-07-15 05:49:47 +00:00
return _no_lock_resource ( cmd , resource , flags ) ;
}
2010-07-09 15:34:40 +00:00
int init_no_locking ( struct locking_type * locking , struct cmd_context * cmd __attribute__ ( ( unused ) ) )
2002-04-11 14:10:32 +00:00
{
locking - > lock_resource = _no_lock_resource ;
2003-05-06 12:03:13 +00:00
locking - > reset_locking = _no_reset_locking ;
2002-04-11 14:10:32 +00:00
locking - > fin_locking = _no_fin_locking ;
2007-03-13 14:59:21 +00:00
locking - > flags = LCK_CLUSTERED ;
2002-04-11 14:10:32 +00:00
return 1 ;
}
2009-07-15 05:49:47 +00:00
2010-07-09 15:34:40 +00:00
int init_readonly_locking ( struct locking_type * locking , struct cmd_context * cmd __attribute__ ( ( unused ) ) )
2009-07-15 05:49:47 +00:00
{
locking - > lock_resource = _readonly_lock_resource ;
locking - > reset_locking = _no_reset_locking ;
locking - > fin_locking = _no_fin_locking ;
locking - > flags = 0 ;
return 1 ;
}