2002-02-11 15:42:34 +00:00
/*
2008-01-30 14:00:02 +00:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2014-01-27 12:11:09 +01:00
* Copyright ( C ) 2004 - 2014 Red Hat , Inc . All rights reserved .
2002-02-11 15:42:34 +00:00
*
2004-03-30 19:35:44 +00:00
* This file is part of LVM2 .
2002-02-11 15:42:34 +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 ,
2016-01-21 11:49:46 +01:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2002-02-11 15:42:34 +00:00
*/
2018-05-14 10:30:20 +01:00
# include "lib/misc/lib.h"
# include "lib/locking/locking.h"
2002-02-11 15:42:34 +00:00
# include "locking_types.h"
2018-05-14 10:30:20 +01:00
# include "lib/activate/activate.h"
# include "lib/config/config.h"
# include "lib/config/defaults.h"
# include "lib/misc/lvm-string.h"
# include "lib/misc/lvm-flock.h"
2002-02-11 15:42:34 +00:00
# include <limits.h>
# include <unistd.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <signal.h>
2014-03-19 00:22:18 +01:00
static char _lock_dir [ PATH_MAX ] ;
2002-02-11 15:42:34 +00:00
2002-12-19 23:25:55 +00:00
static void _fin_file_locking ( void )
2002-02-11 15:42:34 +00:00
{
2014-05-01 17:37:14 +01:00
release_flocks ( 1 ) ;
2003-05-06 12:03:13 +00:00
}
static void _reset_file_locking ( void )
{
2014-05-01 17:37:14 +01:00
release_flocks ( 0 ) ;
2002-02-11 15:42:34 +00:00
}
2002-12-19 23:25:55 +00:00
static int _file_lock_resource ( struct cmd_context * cmd , const char * resource ,
2014-09-22 15:50:07 +02:00
uint32_t flags , const struct logical_volume * lv )
2002-02-11 15:42:34 +00:00
{
char lockfile [ PATH_MAX ] ;
2018-06-08 14:34:50 -05:00
if ( is_orphan_vg ( resource ) | | is_global_vg ( resource ) ) {
if ( dm_snprintf ( lockfile , sizeof ( lockfile ) ,
" %s/P_%s " , _lock_dir , resource + 1 ) < 0 ) {
log_error ( " Too long locking filename %s/P_%s. " , _lock_dir , resource + 1 ) ;
return 0 ;
}
} else
if ( dm_snprintf ( lockfile , sizeof ( lockfile ) , " %s/V_%s " , _lock_dir , resource ) < 0 ) {
log_error ( " Too long locking filename %s/V_%s. " , _lock_dir , resource ) ;
return 0 ;
}
if ( ! lock_file ( lockfile , flags ) )
return_0 ;
2002-02-25 12:56:16 +00:00
return 1 ;
}
2011-08-09 11:44:57 +00:00
int init_file_locking ( struct locking_type * locking , struct cmd_context * cmd ,
int suppress_messages )
2002-02-11 15:42:34 +00:00
{
2011-04-08 14:13:08 +00:00
int r ;
2012-02-08 11:17:34 +00:00
const char * locking_dir ;
2011-04-08 14:13:08 +00:00
2014-05-01 17:37:14 +01:00
init_flock ( cmd ) ;
2002-12-19 23:25:55 +00:00
locking - > lock_resource = _file_lock_resource ;
2003-05-06 12:03:13 +00:00
locking - > reset_locking = _reset_file_locking ;
2002-12-19 23:25:55 +00:00
locking - > fin_locking = _fin_file_locking ;
2018-06-06 16:31:59 -05:00
locking - > flags = LCK_FLOCK ;
2002-02-11 15:42:34 +00:00
/* Get lockfile directory from config file */
2013-06-25 12:29:54 +02:00
locking_dir = find_config_tree_str ( cmd , global_locking_dir_CFG , NULL ) ;
2016-04-21 20:19:53 +02:00
if ( ! dm_strncpy ( _lock_dir , locking_dir , sizeof ( _lock_dir ) ) ) {
2012-02-08 11:17:34 +00:00
log_error ( " Path for locking_dir %s is invalid. " , locking_dir ) ;
return 0 ;
}
2010-12-13 10:43:56 +00:00
( void ) dm_prepare_selinux_context ( _lock_dir , S_IFDIR ) ;
r = dm_create_dir ( _lock_dir ) ;
( void ) dm_prepare_selinux_context ( NULL , 0 ) ;
if ( ! r )
2016-06-23 21:31:49 +01:00
return 0 ;
2002-02-11 15:42:34 +00:00
2002-07-10 20:43:32 +00:00
/* Trap a read-only file system */
2016-06-23 21:31:49 +01:00
if ( ( access ( _lock_dir , R_OK | W_OK | X_OK ) = = - 1 ) & & ( errno = = EROFS ) )
2002-07-10 20:43:32 +00:00
return 0 ;
2002-02-11 15:42:34 +00:00
return 1 ;
}